Skip to content

Commit 1dc84e8

Browse files
committed
text: refactor floodfill + findContours code patterns
1 parent d632079 commit 1dc84e8

File tree

1 file changed

+23
-35
lines changed

1 file changed

+23
-35
lines changed

modules/text/src/erfilter.cpp

Lines changed: 23 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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
779779
ERStat* 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> &regions, vector<ERFeatures> &features);
2857-
2858-
float extract_features(Mat &grey, Mat& channel, vector<ERStat> &regions, vector<ERFeatures> &features)
2855+
static float extract_features(Mat &grey, Mat& channel, vector<ERStat> &regions, 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> &regions, 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> &regions, 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 = &regions[idx1[0]][idx1[1]];
35083502
j = &regions[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

Comments
 (0)