mirror of
https://github.com/opencv/opencv.git
synced 2025-08-06 14:36:36 +08:00
Merge pull request #7452 from reunanen:issue-7409-2.4
Fix findContours crash for very large images (v2.4) * Cast step to size_t in order to avoid integer overflow when processing very large images * Change assert to CV_Assert
This commit is contained in:
parent
c7c831bca5
commit
4e7f28811c
@ -284,10 +284,13 @@ cvStartFindContours( void* _img, CvMemStorage* storage,
|
||||
scanner->cinfo_storage );
|
||||
}
|
||||
|
||||
CV_Assert(step >= 0);
|
||||
CV_Assert(size.height >= 1);
|
||||
|
||||
/* make zero borders */
|
||||
int esz = CV_ELEM_SIZE(mat->type);
|
||||
memset( img, 0, size.width*esz );
|
||||
memset( img + step * (size.height - 1), 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 )
|
||||
@ -989,6 +992,8 @@ cvFindNextContour( CvContourScanner scanner )
|
||||
{
|
||||
if( !scanner )
|
||||
CV_Error( CV_StsNullPtr, "" );
|
||||
CV_Assert(scanner->img_step >= 0);
|
||||
|
||||
icvEndProcessContour( scanner );
|
||||
|
||||
/* initialize local state */
|
||||
@ -1063,7 +1068,7 @@ cvFindNextContour( CvContourScanner scanner )
|
||||
is_hole = 1;
|
||||
}
|
||||
|
||||
if( mode == 0 && (is_hole || img0[lnbd.y * step + lnbd.x] > 0) )
|
||||
if( mode == 0 && (is_hole || img0[lnbd.y * static_cast<size_t>(step) + lnbd.x] > 0) )
|
||||
goto resume_scan;
|
||||
|
||||
origin.y = y;
|
||||
@ -1077,8 +1082,8 @@ cvFindNextContour( CvContourScanner scanner )
|
||||
else
|
||||
{
|
||||
int lval = (img0_i ?
|
||||
img0_i[lnbd.y * step_i + lnbd.x] :
|
||||
(int)img0[lnbd.y * step + lnbd.x]) & 0x7f;
|
||||
img0_i[lnbd.y * static_cast<size_t>(step_i) + lnbd.x] :
|
||||
(int)img0[lnbd.y * static_cast<size_t>(step) + lnbd.x]) & 0x7f;
|
||||
_CvContourInfo *cur = scanner->cinfo_table[lval];
|
||||
|
||||
/* find the first bounding contour */
|
||||
@ -1090,11 +1095,11 @@ cvFindNextContour( CvContourScanner scanner )
|
||||
if( par_info )
|
||||
{
|
||||
if( (img0_i &&
|
||||
icvTraceContour_32s( img0_i + par_info->origin.y * step_i +
|
||||
icvTraceContour_32s( img0_i + par_info->origin.y * static_cast<size_t>(step_i) +
|
||||
par_info->origin.x, step_i, img_i + lnbd.x,
|
||||
par_info->is_hole ) > 0) ||
|
||||
(!img0_i &&
|
||||
icvTraceContour( img0 + par_info->origin.y * step +
|
||||
icvTraceContour( img0 + par_info->origin.y * static_cast<size_t>(step) +
|
||||
par_info->origin.x, step, img + lnbd.x,
|
||||
par_info->is_hole ) > 0) )
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user