OpenCV中的新函数connectedComponentsWithStats使用

主要内容:对比新旧函数,用于过滤原始图像中轮廓分析后较小的区域,留下较大区域。

关键字    :connectedComponentsWithStats

在以前,常用的方法是”是先调用 cv::findContours() 函数(传入cv::RETR_CCOMP 标志),随后在得到的连通区域上循环调用 cv::drawContours() “

比如,我在GOCVHelper中这样进行了实现

//寻找最大的轮廓

VP FindBigestContour(Mat src){

int imax = 0; //代表最大轮廓的序号

int imaxcontour = -1; //代表最大轮廓的大小

std::vector<std::vector<Point>>contours;

findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);

for (int i=0;i<contours.size();i++){

int itmp =  contourArea(contours[i]);//这里采用的是轮廓大小

if (imaxcontour < itmp ){

imax = i;

imaxcontour = itmp;

}

}

return contours[imax];

}

//寻找并绘制出彩色联通区域

vector<VP> connection2(Mat src,Mat& draw){

draw = Mat::zeros(src.rows,src.cols,CV_8UC3);

vector<VP>contours;

findContours(src.clone(),contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);

//由于给大的区域着色会覆盖小的区域,所以首先进行排序操作

//冒泡排序,由小到大排序

VP vptmp;

for(int i=1;i<contours.size();i++){

for(int j=contours.size()-1;j>=i;j--){

if (contourArea(contours[j]) < contourArea(contours[j-1]))

{

vptmp = contours[j-1];

contours[j-1] = contours[j];

contours[j] = vptmp;

}

}

}

在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中

完全对的上号,结果为

来自为知笔记(Wiz)

时间: 2024-10-12 03:32:12

OpenCV中的新函数connectedComponentsWithStats使用的相关文章

openCV中的findHomography函数分析以及RANSAC算法的详解

本文将openCV中的RANSAC代码全部挑选出来,进行分析和讲解,以便大家更好的理解RANSAC算法.代码我都试过,可以直接运行. 在计算机视觉和图像处理等很多领域,都需要用到RANSAC算法.openCV中也有封装好的RANSAC算法,以便于人们使用.关于RANSAC算法的一些应用,可以看我的另一篇博客: 利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 但是前几天师弟在使用op

【计算机视觉】OpenCV中直方图处理函数简述

计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列预定义的bins中.这里的数据不仅仅指的是灰度值 ,统计数据可能是任何能有效描述图像的特征. 假设有一个矩阵包含一张图像的信息 (灰度值 0-255): gray 既然已知数字的范围包含256个值, 我们可以将这个范围分割成子区域(称作 bins),如: bins 然后再统计掉入每一个bin_{i}的像素数目.采用这一方法来统计上面的数字矩阵,我们可以得到下图( x轴表示 bin, y轴表示各个bin中的像素个数).

5、opencv中的绘图函数

1.目标 a.学习使用 OpenCV 绘制不同几何图形 b. 你将会学习到这些函数: cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse(),cv2.putText() 等. 2.代码 上面所有的这些绘图函数需要设置下面这些参数: img:你想要绘制图形的那幅图像. color: 形状的颜色. 以 RGB 为例, 需要传入一个元组, 例如: (255,0,0)代表蓝色.对于灰度图只需要传入灰度值. thickness:线条的粗细.如果给一个

OpenCV中的常用函数

1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序暂停,等待用户触发一个按键操作: 5.cvReleaseImage:释放图像文件所分配的内存: 6.cvDestroyWindow:销毁显示图像文件的窗口: 7.cvCreateFileCapture:通过参数设置确定要读入的AVI文件: 8.cvQueryFrame:用来将下一帧视频文件载入内存:

(转)OpenCV中的常用函数

1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序暂停,等待用户触发一个按键操作: 5.cvReleaseImage:释放图像文件所分配的内存: 6.cvDestroyWindow:销毁显示图像文件的窗口: 7.cvCreateFileCapture:通过参数设置确定要读入的AVI文件: 8.cvQueryFrame:用来将下一帧视频文件载入内存:

opencv中自适应阈值函数的实现(c++)

根据<面向飞机蒙皮接缝的线结构光检测技术研究_张卡>论文中的原理,编写了自适应阈值函数 原理: 1 //计算灰度最大最小值 2 void MaxGrayValue(Mat image,int &max,int &min) 3 { 4 max = 0; 5 min = 255; 6 Mat *im = reinterpret_cast<Mat*>((void*)&image); 7 int height = image.rows; 8 int width =

OpenCV中的绘图函数

OpenCV可以用来绘制不同的集合图形,包括直线,矩形,圆,椭圆,多边形以及在图片上添加文字.用到的绘图函数包括 cv2.line(),cv2.circle(),cv2.rectangle() ,cv2.putText() 等等. 这些绘图函数需要设置参数如: ? img:你想要绘制图形的那幅图像.? color:形状的颜色.以 RGB 为例,需要传入一个元组,例如: (255,0,0 )代表蓝色.对于灰度图只需要传入灰度值.? thickness:线条的粗细.如果给一个闭合图形设置为 -1,那

OpenCV中使用cvResize函数或resize函数进行图象放缩

//cvResize函数原型void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ); src:输入图像.(IplImage) dst:输出图像.(IplImage) interpolation:差值方法: CV_INTER_NN - 最近邻差值 CV_INTER_LINEAR - 双线性差值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹

Matlab中psf2otf()函数在opencv中的实现

在Matlab中有个psf2otf()函数,可以将小尺寸的点扩散函数,扩大尺寸,并作二维傅里叶变换,opencv中没有这个函数,所以编了这么个函数: /*****************************Mat psf2otf(const Mat&psf, Size outSize=Size(3,3))参数说明:psf--输入的点扩散函数:outSize--是输出otf的尺寸: 在本程序中,还调用了circShift()函数,该函数具体参见:http://www.cnblogs.com/p