Disable redundant border initialization in findContours

pull/7516/head
Vladislav Sovrasov 9 years ago
parent c55890f637
commit 56c133d459
  1. 95
      modules/imgproc/src/contours.cpp

@ -199,10 +199,10 @@ _CvContourScanner;
Initializes scanner structure. Initializes scanner structure.
Prepare image for scanning ( clear borders and convert all pixels to 0-1. Prepare image for scanning ( clear borders and convert all pixels to 0-1.
*/ */
CV_IMPL CvContourScanner static CvContourScanner
cvStartFindContours( void* _img, CvMemStorage* storage, cvStartFindContours_Impl( void* _img, CvMemStorage* storage,
int header_size, int mode, int header_size, int mode,
int method, CvPoint offset ) int method, CvPoint offset, int needFillBorder )
{ {
if( !storage ) if( !storage )
CV_Error( CV_StsNullPtr, "" ); CV_Error( CV_StsNullPtr, "" );
@ -310,15 +310,18 @@ cvStartFindContours( void* _img, CvMemStorage* storage,
CV_Assert(size.height >= 1); CV_Assert(size.height >= 1);
/* make zero borders */ /* make zero borders */
int esz = CV_ELEM_SIZE(mat->type); if(needFillBorder)
memset( img, 0, size.width*esz );
memset( img + static_cast<size_t>(step) * (size.height - 1), 0, size.width*esz );
img += step;
for( int y = 1; y < size.height - 1; y++, img += step )
{ {
for( int k = 0; k < esz; k++ ) int esz = CV_ELEM_SIZE(mat->type);
img[k] = img[(size.width - 1)*esz + k] = (schar)0; memset( img, 0, size.width*esz );
memset( img + static_cast<size_t>(step) * (size.height - 1), 0, size.width*esz );
img += step;
for( int y = 1; y < size.height - 1; y++, img += step )
{
for( int k = 0; k < esz; k++ )
img[k] = img[(size.width - 1)*esz + k] = (schar)0;
}
} }
/* converts all pixels to 0 or 1 */ /* converts all pixels to 0 or 1 */
@ -328,6 +331,14 @@ cvStartFindContours( void* _img, CvMemStorage* storage,
return scanner; return scanner;
} }
CV_IMPL CvContourScanner
cvStartFindContours( void* _img, CvMemStorage* storage,
int header_size, int mode,
int method, CvPoint offset )
{
return cvStartFindContours_Impl(_img, storage, header_size, mode, method, offset, 1);
}
/* /*
Final stage of contour processing. Final stage of contour processing.
Three variants possible: Three variants possible:
@ -1796,33 +1807,11 @@ icvFindContoursInInterval( const CvArr* src,
return count; return count;
} }
static int
cvFindContours_Impl( void* img, CvMemStorage* storage,
/*F///////////////////////////////////////////////////////////////////////////////////////
// Name: cvFindContours
// Purpose:
// Finds all the contours on the bi-level image.
// Context:
// Parameters:
// img - source image.
// Non-zero pixels are considered as 1-pixels
// and zero pixels as 0-pixels.
// step - full width of source image in bytes.
// size - width and height of the image in pixels
// storage - pointer to storage where will the output contours be placed.
// header_size - header size of resulting contours
// mode - mode of contour retrieval.
// method - method of approximation that is applied to contours
// first_contour - pointer to first contour pointer
// Returns:
// CV_OK or error code
// Notes:
//F*/
CV_IMPL int
cvFindContours( void* img, CvMemStorage* storage,
CvSeq** firstContour, int cntHeaderSize, CvSeq** firstContour, int cntHeaderSize,
int mode, int mode,
int method, CvPoint offset ) int method, CvPoint offset, int needFillBorder )
{ {
CvContourScanner scanner = 0; CvContourScanner scanner = 0;
CvSeq *contour = 0; CvSeq *contour = 0;
@ -1845,7 +1834,8 @@ cvFindContours( void* img, CvMemStorage* storage,
{ {
try try
{ {
scanner = cvStartFindContours( img, storage, cntHeaderSize, mode, method, offset ); scanner = cvStartFindContours_Impl( img, storage, cntHeaderSize, mode, method, offset,
needFillBorder);
do do
{ {
@ -1867,6 +1857,35 @@ cvFindContours( void* img, CvMemStorage* storage,
return count; return count;
} }
/*F///////////////////////////////////////////////////////////////////////////////////////
// Name: cvFindContours
// Purpose:
// Finds all the contours on the bi-level image.
// Context:
// Parameters:
// img - source image.
// Non-zero pixels are considered as 1-pixels
// and zero pixels as 0-pixels.
// step - full width of source image in bytes.
// size - width and height of the image in pixels
// storage - pointer to storage where will the output contours be placed.
// header_size - header size of resulting contours
// mode - mode of contour retrieval.
// method - method of approximation that is applied to contours
// first_contour - pointer to first contour pointer
// Returns:
// CV_OK or error code
// Notes:
//F*/
CV_IMPL int
cvFindContours( void* img, CvMemStorage* storage,
CvSeq** firstContour, int cntHeaderSize,
int mode,
int method, CvPoint offset )
{
return cvFindContours_Impl(img, storage, firstContour, cntHeaderSize, mode, method, offset, 1);
}
void cv::findContours( InputOutputArray _image, OutputArrayOfArrays _contours, void cv::findContours( InputOutputArray _image, OutputArrayOfArrays _contours,
OutputArray _hierarchy, int mode, int method, Point offset ) OutputArray _hierarchy, int mode, int method, Point offset )
{ {
@ -1885,7 +1904,7 @@ void cv::findContours( InputOutputArray _image, OutputArrayOfArrays _contours,
CvSeq* _ccontours = 0; CvSeq* _ccontours = 0;
if( _hierarchy.needed() ) if( _hierarchy.needed() )
_hierarchy.clear(); _hierarchy.clear();
cvFindContours(&_cimage, storage, &_ccontours, sizeof(CvContour), mode, method, offset + Point(-1, -1)); cvFindContours_Impl(&_cimage, storage, &_ccontours, sizeof(CvContour), mode, method, offset + Point(-1, -1), 0);
if( !_ccontours ) if( !_ccontours )
{ {
_contours.clear(); _contours.clear();

Loading…
Cancel
Save