@@ -778,28 +778,27 @@ ERStat* ERFilterNM::er_save( ERStat *er, ERStat *parent, ERStat *prev )
778778// recursively walk the tree and filter (remove) regions using the callback classifier
779779ERStat* ERFilterNM::er_tree_filter ( InputArray image, ERStat * stat, ERStat *parent, ERStat *prev )
780780{
781- Mat src = image.getMat ();
782781 // assert correct image type
783- CV_Assert ( src.type () == CV_8UC1 );
782+ CV_Assert ( image.type () == CV_8UC1 );
783+
784+ Mat src = image.getMat ();
784785
785786 // Fill the region and calculate 2nd stage features
786- Mat region = region_mask (Rect (Point ( stat->rect .x ,stat-> rect . y ), Point ( stat->rect .br (). x + 2 ,stat-> rect . br (). y + 2 )));
787+ Mat region = region_mask (Rect (stat->rect .tl (), stat->rect .br () + Point ( 2 , 2 )));
787788 region = Scalar (0 );
788789 int newMaskVal = 255 ;
789790 int flags = 4 + (newMaskVal << 8 ) + FLOODFILL_FIXED_RANGE + FLOODFILL_MASK_ONLY;
790791 Rect rect;
791792
792- floodFill ( src (Rect ( Point ( stat->rect . x ,stat-> rect . y ), Point (stat-> rect . br (). x ,stat-> rect . br (). y )) ),
793- region, Point (stat->pixel %src.cols - stat-> rect . x , stat->pixel /src.cols - stat->rect .y ),
793+ floodFill ( src (stat->rect ),
794+ region, Point (stat->pixel %src.cols , stat->pixel /src.cols ) - stat->rect .tl ( ),
794795 Scalar (255 ), &rect, Scalar (stat->level ), Scalar (0 ), flags );
795- rect.width += 2 ;
796- rect.height += 2 ;
797- region = region (rect);
796+ region = region (Rect (1 , 1 , rect.width , rect.height ));
798797
799798 vector<vector<Point> > contours;
800799 vector<Point> contour_poly;
801800 vector<Vec4i> hierarchy;
802- findContours ( region ( Rect ( 1 , 1 , region. cols - 2 , region. rows - 2 )), contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE, Point (1 , 1 ) );
801+ findContours ( region, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE, Point (0 , 0 ) );
803802 // TODO check epsilon parameter of approxPolyDP (set empirically) : we want more precission
804803 // if the region is very small because otherwise we'll loose all the convexities
805804 approxPolyDP ( Mat (contours[0 ]), contour_poly, (float )min (rect.width ,rect.height )/17 , true );
@@ -2853,9 +2852,7 @@ bool guo_hall_thinning(const Mat1b & img, Mat& skeleton)
28532852}
28542853
28552854
2856- float extract_features (Mat &grey, Mat& channel, vector<ERStat> ®ions, vector<ERFeatures> &features);
2857-
2858- float extract_features (Mat &grey, Mat& channel, vector<ERStat> ®ions, vector<ERFeatures> &features)
2855+ static float extract_features (Mat &grey, Mat& channel, vector<ERStat> ®ions, vector<ERFeatures> &features)
28592856{
28602857 // assert correct image type
28612858 CV_Assert (( channel.type () == CV_8UC1 ) && ( grey.type () == CV_8UC1 ));
@@ -2884,18 +2881,15 @@ float extract_features(Mat &grey, Mat& channel, vector<ERStat> ®ions, vector<
28842881 {
28852882
28862883 // Fill the region and calculate features
2887- Mat region = region_mask (Rect (Point ( stat->rect .x ,stat-> rect . y ),
2888- Point ( stat->rect .br (). x + 2 ,stat-> rect . br (). y + 2 )));
2884+ Mat region = region_mask (Rect (stat->rect .tl ( ),
2885+ stat->rect .br () + Point ( 2 , 2 )));
28892886 region = Scalar (0 );
28902887 int newMaskVal = 255 ;
28912888 int flags = 4 + (newMaskVal << 8 ) + FLOODFILL_FIXED_RANGE + FLOODFILL_MASK_ONLY;
2892- Rect rect;
28932889
2894- floodFill ( channel (Rect ( Point ( stat->rect . x ,stat-> rect . y ), Point (stat-> rect . br (). x ,stat-> rect . br (). y )) ),
2890+ floodFill ( channel (stat->rect ),
28952891 region, Point (stat->pixel %channel.cols - stat->rect .x , stat->pixel /channel.cols - stat->rect .y ),
2896- Scalar (255 ), &rect, Scalar (stat->level ), Scalar (0 ), flags );
2897- rect.width += 2 ;
2898- rect.height += 2 ;
2892+ Scalar (255 ), NULL , Scalar (stat->level ), Scalar (0 ), flags );
28992893 Mat rect_mask = region_mask (Rect (stat->rect .x +1 ,stat->rect .y +1 ,stat->rect .width ,stat->rect .height ));
29002894
29012895
@@ -2905,7 +2899,7 @@ float extract_features(Mat &grey, Mat& channel, vector<ERStat> ®ions, vector<
29052899 f.intensity_std = (float )std[0 ];
29062900
29072901 Mat tmp,bw;
2908- region_mask ( Rect (stat-> rect . x + 1 ,stat-> rect . y + 1 ,stat-> rect . width ,stat-> rect . height )) .copyTo (bw);
2902+ rect_mask .copyTo (bw);
29092903 distanceTransform (bw, tmp, DIST_L1,3 ); // L1 gives distance in round integers while L2 floats
29102904
29112905 // Add border because if region span all the image size skeleton will crash
@@ -3507,19 +3501,16 @@ bool isValidPair(Mat &grey, Mat &lab, Mat &mask, vector<Mat> &channels, vector<
35073501 i = ®ions[idx1[0 ]][idx1[1 ]];
35083502 j = ®ions[idx2[0 ]][idx2[1 ]];
35093503
3510- Mat region = mask (Rect (Point ( i->rect .x ,i-> rect . y ),
3511- Point ( i->rect .br (). x + 2 ,i-> rect . br (). y + 2 )));
3504+ Mat region = mask (Rect (i->rect .tl ( ),
3505+ i->rect .br ()+ Point ( 2 , 2 )));
35123506 region = Scalar (0 );
35133507
35143508 int newMaskVal = 255 ;
35153509 int flags = 4 + (newMaskVal << 8 ) + FLOODFILL_FIXED_RANGE + FLOODFILL_MASK_ONLY;
3516- Rect rect;
35173510
3518- floodFill ( channels[idx1[0 ]](Rect (Point (i->rect .x ,i->rect .y ),Point (i->rect .br ().x ,i->rect .br ().y ))),
3519- region, Point (i->pixel %grey.cols - i->rect .x , i->pixel /grey.cols - i->rect .y ),
3520- Scalar (255 ), &rect, Scalar (i->level ), Scalar (0 ), flags);
3521- rect.width += 2 ;
3522- rect.height += 2 ;
3511+ floodFill ( channels[idx1[0 ]](i->rect ),
3512+ region, Point (i->pixel %grey.cols , i->pixel /grey.cols ) - i->rect .tl (),
3513+ Scalar (255 ), NULL , Scalar (i->level ), Scalar (0 ), flags);
35233514 Mat rect_mask = mask (Rect (i->rect .x +1 ,i->rect .y +1 ,i->rect .width ,i->rect .height ));
35243515
35253516 Scalar mean,std;
@@ -3529,15 +3520,12 @@ bool isValidPair(Mat &grey, Mat &lab, Mat &mask, vector<Mat> &channels, vector<
35293520 float a_mean1 = (float )mean[1 ];
35303521 float b_mean1 = (float )mean[2 ];
35313522
3532- region = mask (Rect (Point (j->rect .x ,j->rect .y ),
3533- Point (j->rect .br ().x +2 ,j->rect .br ().y +2 )));
3523+ region = mask (Rect (j->rect .tl (), j->rect .br ()+ Point (2 ,2 )));
35343524 region = Scalar (0 );
35353525
3536- floodFill ( channels[idx2[0 ]](Rect (Point (j->rect .x ,j->rect .y ),Point (j->rect .br ().x ,j->rect .br ().y ))),
3537- region, Point (j->pixel %grey.cols - j->rect .x , j->pixel /grey.cols - j->rect .y ),
3538- Scalar (255 ), &rect, Scalar (j->level ), Scalar (0 ), flags);
3539- rect.width += 2 ;
3540- rect.height += 2 ;
3526+ floodFill ( channels[idx2[0 ]](j->rect ),
3527+ region, Point (j->pixel %grey.cols , j->pixel /grey.cols ) - j->rect .tl (),
3528+ Scalar (255 ), NULL , Scalar (j->level ), Scalar (0 ), flags);
35413529 rect_mask = mask (Rect (j->rect .x +1 ,j->rect .y +1 ,j->rect .width ,j->rect .height ));
35423530
35433531 meanStdDev (grey (j->rect ),mean,std,rect_mask);
0 commit comments