OpenCV中的轮廓提取新函数connectedComponentsWithStats的使用

转自:https://www.cnblogs.com/jsxyhelu/p/7439655.html

在OpenCV3中有了新的专门的函数 cv::connectedComponents() 和函数 cv::connectedComponentsWithStats()

定义:

int  cv::connectedComponents (

    cv::InputArrayn image,                // input 8-bit single-channel (binary)

    cv::OutputArray labels,               // output label map

    int             connectivity = 8,     // 4- or 8-connected components

    int             ltype        = CV_32S // Output label type (CV_32S or CV_16U)

    );

int  cv::connectedComponentsWithStats (

    cv::InputArrayn image,                // input 8-bit single-channel (binary)

    cv::OutputArray labels,               // output label map

    cv::OutputArray stats,                // Nx5 matrix (CV_32S) of statistics:

                                                          // [x0, y0, width0, height0, area0;

                                                          //  ... ; x(N-1), y(N-1), width(N-1),

                                                           // height(N-1), area(N-1)]

    cv::OutputArray centroids,            // Nx2 CV_64F matrix of centroids:

                                                           // [ cx0, cy0; ... ; cx(N-1), cy(N-1)]

    int             connectivity = 8,     // 4- or 8-connected components

    int             ltype        = CV_32S // Output label type (CV_32S or CV_16U)

    );

其中,新出现的参数

stats:长这样

分别对应各个轮廓的x,y,width,height和面积。注意0的区域标识的是background

而centroids则对应的是中心点

而label则对应于表示是当前像素是第几个轮廓

例子:

对于图像

     

Mat img = cv::imread( "e:/sandbox/rect.png",0); 

    cv::Mat  img_edge, labels, img_color, stats,centroids;

    cv::threshold(img, img_edge, 128, 255, cv::THRESH_BINARY);

    bitwise_not(img_edge,img_edge);

    cv::imshow("Image after threshold", img_edge);

    int i, nccomps = cv::connectedComponentsWithStats (

        img_edge, labels,

        stats, centroids

        );

    cout << "Total Connected Components Detected: " << nccomps << endl;

    vector<cv::Vec3b> colors(nccomps+1);

    colors[0] = Vec3b(0,0,0); // background pixels remain black.

    for( i = 1; i < nccomps; i++ ) {

        colors[i] = Vec3b(rand()%256, rand()%256, rand()%256);

        if( stats.at<int>(i, cv::CC_STAT_AREA) < 200 )

            colors[i] = Vec3b(0,0,0); // small regions are painted with black too.

    }

    img_color = Mat::zeros(img.size(), CV_8UC3);

    for( int y = 0; y < img_color.rows; y++ )

        for( int x = 0; x < img_color.cols; x++ )

        {

            int label = labels.at<int>(y, x);

            CV_Assert(0 <= label && label <= nccomps);

            img_color.at<cv::Vec3b>(y, x) = colors[label];

        }

    cv::imshow("Labeled map", img_color);

    cv::waitKey();

注意:

1、对于OpenCV来说,白色代表有数据,黑色代表没有数据,所以图像输入之前要转换成”黑底白图“

2、看labels 和 stats,其中第1 2 6 个的面积小于200

而labels中

完全对的上号,结果为

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值