zoukankan      html  css  js  c++  java
  • 使用floodfill()函数颜色填充一个联通的区域

    使用floodfill()函数:

    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"

    #include <iostream>

    using namespace cv;
    using namespace std;


    //floodfill()
    //Fills a connected component with the given color.

    static void help()
    {
        cout << " This program demonstrated the floodFill() function "
            "Call: "
            "./ffilldemo [image_name -- Default: fruits.jpg] " << endl;

        cout << "Hot keys: "
            " ESC - quit the program "
            " c - switch color/grayscale mode "
            " m - switch mask mode "
            " r - restore the original image "
            " s - use null-range floodfill "
            " f - use gradient floodfill with fixed(absolute) range "
            " g - use gradient floodfill with floating(relative) range "
            " 4 - use 4-connectivity mode "
            " 8 - use 8-connectivity mode " << endl;
    }

    Mat image0, image, gray, mask;
    int ffillMode = 1;
    int loDiff = 20, upDiff = 20;
    int connectivity = 4;
    int isColor = true;
    bool useMask = false;
    int newMaskVal = 255;

    static void onMouse( int event, int x, int y, int, void* )
    {
        if( event != CV_EVENT_LBUTTONDOWN )
            return;

        Point seed = Point(x,y);
        int lo = ffillMode == 0 ? 0 : loDiff;
        int up = ffillMode == 0 ? 0 : upDiff;
        int flags = connectivity + (newMaskVal << 8) +
            (ffillMode == 1 ? CV_FLOODFILL_FIXED_RANGE : 0);
        int b = (unsigned)theRNG() & 255;
        int g = (unsigned)theRNG() & 255;
        int r = (unsigned)theRNG() & 255;
        Rect ccomp;

        Scalar newVal = isColor ? Scalar(b, g, r) : Scalar(r*0.299 + g*0.587 + b*0.114);
        Mat dst = isColor ? image : gray;
        int area;

        if( useMask )
        {
            threshold(mask, mask, 1, 128, CV_THRESH_BINARY);
            area = floodFill(dst, mask, seed, newVal, &ccomp, Scalar(lo, lo, lo),
                Scalar(up, up, up), flags);
            imshow( "mask", mask );
        }
        else
        {
            area = floodFill(dst, seed, newVal, &ccomp, Scalar(lo, lo, lo),
                Scalar(up, up, up), flags);
        }

        imshow("image", dst);
        cout << area << " pixels were repainted ";
    }


    int main( int argc, char** argv )
    {
        char* filename= argc >= 2 ? argv[1] : (char*)"pic5.png";
        image0 = imread(filename, 1);

        if( image0.empty() )
        {
            cout << "Image empty. Usage: ffilldemo <image_name> ";
            return 0;
        }
        help();
        image0.copyTo(image);
        cvtColor(image0, gray, CV_BGR2GRAY);
        mask.create(image0.rows+2, image0.cols+2, CV_8UC1);

        namedWindow( "image", 0 );
        createTrackbar( "lo_diff", "image", &loDiff, 255, 0 );
        createTrackbar( "up_diff", "image", &upDiff, 255, 0 );

        setMouseCallback( "image", onMouse, 0 );

        for(;;)
        {
            imshow("image", isColor ? image : gray);

            int c = waitKey(0);
            if( (c & 255) == 27 )
            {
                cout << "Exiting ... ";
                break;
            }
            switch( (char)c )
            {
            case 'c':
                if( isColor )
                {
                    cout << "Grayscale mode is set ";
                    cvtColor(image0, gray, CV_BGR2GRAY);
                    mask = Scalar::all(0);
                    isColor = false;
                }
                else
                {
                    cout << "Color mode is set ";
                    image0.copyTo(image);
                    mask = Scalar::all(0);
                    isColor = true;
                }
                break;
            case 'm':
                if( useMask )
                {
                    destroyWindow( "mask" );
                    useMask = false;
                }
                else
                {
                    namedWindow( "mask", 0 );
                    mask = Scalar::all(0);
                    imshow("mask", mask);
                    useMask = true;
                }
                break;
            case 'r':
                cout << "Original image is restored ";
                image0.copyTo(image);
                cvtColor(image, gray, CV_BGR2GRAY);
                mask = Scalar::all(0);
                break;
            case 's':
                cout << "Simple floodfill mode is set ";
                ffillMode = 0;
                break;
            case 'f':
                cout << "Fixed Range floodfill mode is set ";
                ffillMode = 1;
                break;
            case 'g':
                cout << "Gradient (floating range) floodfill mode is set ";
                ffillMode = 2;
                break;
            case '4':
                cout << "4-connectivity mode is set ";
                connectivity = 4;
                break;
            case '8':
                cout << "8-connectivity mode is set ";
                connectivity = 8;
                break;
            }
        }

        return 0;
    }

  • 相关阅读:
    Spring MVC-表单(Form)标签-单选按钮(RadioButton)示例(转载实践)
    Ubuntu 16.04中VirtualBox 5.1使用U盘/USB设备的方法
    Spring MVC-表单(Form)标签-复选框集合(Checkboxes)示例(转载实践)
    Ubuntu 16.04下减小/释放/清理VirtualBox虚拟硬盘文件的大小
    关注点分离
    谈代码注释
    DelegatingFilterProxy类的作用
    GOPS 2018全球运维大会上海站 参会感悟梳理
    Java switch case
    Android 微信网址分享添加网络图片
  • 原文地址:https://www.cnblogs.com/weilin1216/p/3169475.html
Copyright © 2011-2022 走看看