re-submit
This commit is contained in:
		| @@ -152,7 +152,7 @@ struct CvCBQuad | |||||||
| //static CvMat* debug_img = 0; | //static CvMat* debug_img = 0; | ||||||
|  |  | ||||||
| static int icvGenerateQuads( CvCBQuad **quads, CvCBCorner **corners, | static int icvGenerateQuads( CvCBQuad **quads, CvCBCorner **corners, | ||||||
|                              CvMemStorage *storage, CvMat *image, int flags ); |                              CvMemStorage *storage, CvMat *image, int flags, int *max_quad_buf_size); | ||||||
|  |  | ||||||
| /*static int | /*static int | ||||||
| icvGenerateQuadsEx( CvCBQuad **out_quads, CvCBCorner **out_corners, | icvGenerateQuadsEx( CvCBQuad **out_quads, CvCBCorner **out_corners, | ||||||
| @@ -172,7 +172,7 @@ static int icvCleanFoundConnectedQuads( int quad_count, | |||||||
|  |  | ||||||
| static int icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads, | static int icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads, | ||||||
|            int *all_count, CvCBQuad **all_quads, CvCBCorner **corners, |            int *all_count, CvCBQuad **all_quads, CvCBCorner **corners, | ||||||
|            CvSize pattern_size, CvMemStorage* storage ); |            CvSize pattern_size, int max_quad_buf_size, CvMemStorage* storage ); | ||||||
|  |  | ||||||
| static void icvOrderQuad(CvCBQuad *quad, CvCBCorner *corner, int common); | static void icvOrderQuad(CvCBQuad *quad, CvCBCorner *corner, int common); | ||||||
|  |  | ||||||
| @@ -183,7 +183,7 @@ static int icvTrimRow(CvCBQuad **quads, int count, int row, int dir); | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static int icvAddOuterQuad(CvCBQuad *quad, CvCBQuad **quads, int quad_count, | static int icvAddOuterQuad(CvCBQuad *quad, CvCBQuad **quads, int quad_count, | ||||||
|                     CvCBQuad **all_quads, int all_count, CvCBCorner **corners); |                     CvCBQuad **all_quads, int all_count, CvCBCorner **corners, int max_quad_buf_size); | ||||||
|  |  | ||||||
| static void icvRemoveQuadFromGroup(CvCBQuad **quads, int count, CvCBQuad *q0); | static void icvRemoveQuadFromGroup(CvCBQuad **quads, int count, CvCBQuad *q0); | ||||||
|  |  | ||||||
| @@ -313,6 +313,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size, | |||||||
|     // making it difficult to detect smaller squares. |     // making it difficult to detect smaller squares. | ||||||
|     for( k = 0; k < 6; k++ ) |     for( k = 0; k < 6; k++ ) | ||||||
|     { |     { | ||||||
|  |         int max_quad_buf_size = 0; | ||||||
|         for( dilations = min_dilations; dilations <= max_dilations; dilations++ ) |         for( dilations = min_dilations; dilations <= max_dilations; dilations++ ) | ||||||
|         { |         { | ||||||
|             if (found) |             if (found) | ||||||
| @@ -368,7 +369,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size, | |||||||
|                 cvRectangle( thresh_img, cvPoint(0,0), cvPoint(thresh_img->cols-1, |                 cvRectangle( thresh_img, cvPoint(0,0), cvPoint(thresh_img->cols-1, | ||||||
|                     thresh_img->rows-1), CV_RGB(255,255,255), 3, 8); |                     thresh_img->rows-1), CV_RGB(255,255,255), 3, 8); | ||||||
|  |  | ||||||
|                 quad_count = icvGenerateQuads( &quads, &corners, storage, thresh_img, flags ); |                 quad_count = icvGenerateQuads( &quads, &corners, storage, thresh_img, flags, &max_quad_buf_size); | ||||||
|  |  | ||||||
|                 PRINTF("Quad count: %d/%d\n", quad_count, expected_corners_num); |                 PRINTF("Quad count: %d/%d\n", quad_count, expected_corners_num); | ||||||
|             } |             } | ||||||
| @@ -408,8 +409,8 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size, | |||||||
|             // allocate extra for adding in icvOrderFoundQuads |             // allocate extra for adding in icvOrderFoundQuads | ||||||
|             cvFree(&quad_group); |             cvFree(&quad_group); | ||||||
|             cvFree(&corner_group); |             cvFree(&corner_group); | ||||||
|             quad_group = (CvCBQuad**)cvAlloc( sizeof(quad_group[0]) * (quad_count+quad_count / 2)); |             quad_group = (CvCBQuad**)cvAlloc( sizeof(quad_group[0]) * max_quad_buf_size); | ||||||
|             corner_group = (CvCBCorner**)cvAlloc( sizeof(corner_group[0]) * (quad_count+quad_count / 2)*4 ); |             corner_group = (CvCBCorner**)cvAlloc( sizeof(corner_group[0]) * max_quad_buf_size * 4 ); | ||||||
|  |  | ||||||
|             for( group_idx = 0; ; group_idx++ ) |             for( group_idx = 0; ; group_idx++ ) | ||||||
|             { |             { | ||||||
| @@ -424,7 +425,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size, | |||||||
|                 // maybe delete or add some |                 // maybe delete or add some | ||||||
|                 PRINTF("Starting ordering of inner quads\n"); |                 PRINTF("Starting ordering of inner quads\n"); | ||||||
|                 count = icvOrderFoundConnectedQuads(count, quad_group, &quad_count, &quads, &corners, |                 count = icvOrderFoundConnectedQuads(count, quad_group, &quad_count, &quads, &corners, | ||||||
|                     pattern_size, storage ); |                     pattern_size, max_quad_buf_size, storage ); | ||||||
|                 PRINTF("Orig count: %d  After ordering: %d\n", icount, count); |                 PRINTF("Orig count: %d  After ordering: %d\n", icount, count); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -623,7 +624,7 @@ icvCheckBoardMonotony( CvPoint2D32f* corners, CvSize pattern_size ) | |||||||
| static int | static int | ||||||
| icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads, | icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads, | ||||||
|         int *all_count, CvCBQuad **all_quads, CvCBCorner **corners, |         int *all_count, CvCBQuad **all_quads, CvCBCorner **corners, | ||||||
|         CvSize pattern_size, CvMemStorage* storage ) |         CvSize pattern_size, int max_quad_buf_size, CvMemStorage* storage ) | ||||||
| { | { | ||||||
|     cv::Ptr<CvMemStorage> temp_storage = cvCreateChildMemStorage( storage ); |     cv::Ptr<CvMemStorage> temp_storage = cvCreateChildMemStorage( storage ); | ||||||
|     CvSeq* stack = cvCreateSeq( 0, sizeof(*stack), sizeof(void*), temp_storage ); |     CvSeq* stack = cvCreateSeq( 0, sizeof(*stack), sizeof(void*), temp_storage ); | ||||||
| @@ -803,15 +804,18 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads, | |||||||
|     if (found > 0) |     if (found > 0) | ||||||
|     { |     { | ||||||
|         PRINTF("Found %d inner quads not connected to outer quads, repairing\n", found); |         PRINTF("Found %d inner quads not connected to outer quads, repairing\n", found); | ||||||
|         for (int i=0; i<quad_count; i++) |         for (int i=0; i<quad_count && *all_count < max_quad_buf_size; i++) | ||||||
|         { |         { | ||||||
|             if (quads[i]->count < 4 && quads[i]->ordered) |             if (quads[i]->count < 4 && quads[i]->ordered) | ||||||
|             { |             { | ||||||
|                 int added = icvAddOuterQuad(quads[i],quads,quad_count,all_quads,*all_count,corners); |                 int added = icvAddOuterQuad(quads[i],quads,quad_count,all_quads,*all_count,corners, max_quad_buf_size); | ||||||
|                 *all_count += added; |                 *all_count += added; | ||||||
|                 quad_count += added; |                 quad_count += added; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if (*all_count >= max_quad_buf_size) | ||||||
|  |             return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -854,11 +858,11 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads, | |||||||
|  |  | ||||||
| static int | static int | ||||||
| icvAddOuterQuad( CvCBQuad *quad, CvCBQuad **quads, int quad_count, | icvAddOuterQuad( CvCBQuad *quad, CvCBQuad **quads, int quad_count, | ||||||
|         CvCBQuad **all_quads, int all_count, CvCBCorner **corners ) |         CvCBQuad **all_quads, int all_count, CvCBCorner **corners, int max_quad_buf_size ) | ||||||
|  |  | ||||||
| { | { | ||||||
|     int added = 0; |     int added = 0; | ||||||
|     for (int i=0; i<4; i++) // find no-neighbor corners |     for (int i=0; i<4 && all_count < max_quad_buf_size; i++) // find no-neighbor corners | ||||||
|     { |     { | ||||||
|         if (!quad->neighbors[i])    // ok, create and add neighbor |         if (!quad->neighbors[i])    // ok, create and add neighbor | ||||||
|         { |         { | ||||||
| @@ -1649,7 +1653,7 @@ static void icvFindQuadNeighbors( CvCBQuad *quads, int quad_count ) | |||||||
|  |  | ||||||
| static int | static int | ||||||
| icvGenerateQuads( CvCBQuad **out_quads, CvCBCorner **out_corners, | icvGenerateQuads( CvCBQuad **out_quads, CvCBCorner **out_corners, | ||||||
|                   CvMemStorage *storage, CvMat *image, int flags ) |                   CvMemStorage *storage, CvMat *image, int flags, int *max_quad_buf_size ) | ||||||
| { | { | ||||||
|     int quad_count = 0; |     int quad_count = 0; | ||||||
|     cv::Ptr<CvMemStorage> temp_storage; |     cv::Ptr<CvMemStorage> temp_storage; | ||||||
| @@ -1754,8 +1758,9 @@ icvGenerateQuads( CvCBQuad **out_quads, CvCBCorner **out_corners, | |||||||
|     cvEndFindContours( &scanner ); |     cvEndFindContours( &scanner ); | ||||||
|  |  | ||||||
|     // allocate quad & corner buffers |     // allocate quad & corner buffers | ||||||
|     *out_quads = (CvCBQuad*)cvAlloc((root->total+root->total / 2) * sizeof((*out_quads)[0])); |     *max_quad_buf_size = MAX(1, (root->total+root->total / 2)) * 2; | ||||||
|     *out_corners = (CvCBCorner*)cvAlloc((root->total+root->total / 2) * 4 * sizeof((*out_corners)[0])); |     *out_quads = (CvCBQuad*)cvAlloc(*max_quad_buf_size * sizeof((*out_quads)[0])); | ||||||
|  |     *out_corners = (CvCBCorner*)cvAlloc(*max_quad_buf_size * 4 * sizeof((*out_corners)[0])); | ||||||
|  |  | ||||||
|     // Create array of quads structures |     // Create array of quads structures | ||||||
|     for( idx = 0; idx < root->total; idx++ ) |     for( idx = 0; idx < root->total; idx++ ) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 robertxwu
					robertxwu