A question about the 'floodFill()' function.

asked 2020-09-02 08:09:49 -0500

denisPomidor gravatar image

Hello! I have a task to find the structure of a file. I am using floodFill () function. I need the entire file to be filled. How can you do it? I started to do it, but the work time is very long. Tell me please.

Here is my code:

void processFloodFill() {
int lo = 20;
int up = 20;
Mat mask;
Point seed = Point(0, 0);

int connectivity = 4;
int newMaskVal = 255;
int ffillMode = 1;

int flags = connectivity + (newMaskVal << 8) +
    (ffillMode == 1 ? FLOODFILL_FIXED_RANGE : 0);

Rect ccomp;
int b = (unsigned)theRNG() & 255;
int g = (unsigned)theRNG() & 255;
int r = (unsigned)theRNG() & 255;
Scalar newVal = Scalar(b, g, r) ;
cv::Mat img;
image.copyTo(img);
dst = img;

mask.create(image.rows + 2, image.cols + 2, CV_8UC1);
mask = Scalar::all(0);
threshold(mask, mask, 1, 128, THRESH_BINARY);
for (int c = 0; c < diff.cols; c++) {
    for (int r = 0; r < diff.rows; r++) {
        Vec3b colour = diff.at<Vec3b>(Point(c, r));
        if (colour.val[0] == 255 && colour.val[1] == 255 && colour.val[2] == 255) {

            //std::cout << seed << std::endl;
            //threshold(mask, mask, 1, 128, THRESH_BINARY);
            seed = Point(c, r);

            int area = floodFill(dst, mask, seed, newVal, &ccomp, Scalar(lo, lo, lo),
                Scalar(up, up, up), flags);

            vector<vector<Point> > contours;
            vector<Vec4i> hierarchy;

            findContours(mask, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

            // iterate through all the top-level contours,
            // draw each connected component with its own random color
            int idx = 0;
            for (; idx >= 0; idx = hierarchy[idx][0]) {                    
                drawContours(layout_image, contours, idx, newVal, CV_FILLED, 8, hierarchy);
            }
            //converting the difference into grascale                    
            absdiff(img, layout_image, diff);
        }
    }
}

}

This is the picture I am using: image description

edit retag flag offensive close merge delete

Comments

1

I think with floodFill you pick a coordinate, threshold, range... for flesh tones or similar. It might make sense to call out a watermark or compression artefacts.

Why do you loop and floodFill... especially with a binary palette? A mock of the desired outcome, i.e. filled top-level rectangles would help.

Maybe use mat.setTo or mat.zeros? Skip diff (also in loop) and directly draw the contours.

kpachinger gravatar imagekpachinger ( 2020-09-03 19:11:06 -0500 )edit