correct range computations, it is difficult to do the more efficient single pass...
authorJason Newton <jason@utopiacompression.com>
Tue, 27 Aug 2013 07:34:22 +0000 (00:34 -0700)
committerJason Newton <jason@utopiacompression.com>
Tue, 27 Aug 2013 07:34:22 +0000 (00:34 -0700)
modules/imgproc/src/connectedcomponents.cpp

index 4fee0aa..c3bf556 100644 (file)
@@ -92,20 +92,10 @@ namespace cv{
         }
         void operator()(int r, int c, int l){
             int *row = &statsv.at<int>(l, 0);
-            if(c > row[CC_STAT_WIDTH]){
-                row[CC_STAT_WIDTH] = c;
-            }else{
-                if(c < row[CC_STAT_LEFT]){
-                    row[CC_STAT_LEFT] = c;
-                }
-            }
-            if(r > row[CC_STAT_HEIGHT]){
-                row[CC_STAT_HEIGHT] = r;
-            }else{
-                if(r < row[CC_STAT_TOP]){
-                    row[CC_STAT_TOP] = r;
-                }
-            }
+            row[CC_STAT_LEFT] = MIN(row[CC_STAT_LEFT], c);
+            row[CC_STAT_WIDTH] = MAX(row[CC_STAT_WIDTH], c);
+            row[CC_STAT_TOP] = MIN(row[CC_STAT_TOP], r);
+            row[CC_STAT_HEIGHT] = MAX(row[CC_STAT_HEIGHT], r);
             row[CC_STAT_AREA]++;
             Point2ui64 &integral = integrals[l];
             integral.x += c;
@@ -114,9 +104,7 @@ namespace cv{
         void finish(){
             for(int l = 0; l < statsv.rows; ++l){
                 int *row = &statsv.at<int>(l, 0);
-                row[CC_STAT_LEFT] = std::min(row[CC_STAT_LEFT], row[CC_STAT_WIDTH]);
                 row[CC_STAT_WIDTH] = row[CC_STAT_WIDTH] - row[CC_STAT_LEFT] + 1;
-                row[CC_STAT_TOP] = std::min(row[CC_STAT_TOP], row[CC_STAT_HEIGHT]);
                 row[CC_STAT_HEIGHT] = row[CC_STAT_HEIGHT] - row[CC_STAT_TOP] + 1;
 
                 Point2ui64 &integral = integrals[l];