轮廓属性
二值图像分析最常见的一个主要方式就是轮廓发现与轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经过轮廓分析我们可以得到轮廓各种有用的属性信息、常见的如下:
轮廓面积
轮廓周长
轮廓几何矩
轮廓的最小外接矩形
轮廓的最大外接矩形
轮廓的最小外接圆
轮廓的最小外接三角形
轮廓拟合(支持拟合直线、椭圆、圆)
轮廓的凸包
轮廓层次信息提取
多边形逼近
计算欧拉数
函数介绍
OpenCV中提供大量轮廓分析函数,通过这些函数我们可以方便快捷的得到轮廓的各种有用属性信息、高效完成各种二值图像分析需求,下面是我总结的一些常用的函数列表与说明。
OpenCV中轮廓发现函数如下:
voidcv::findContours( InputArrayimage, OutputArrayOfArrayscontours, OutputArrayhierarchy, intmode, intmethod, Pointoffset=Point() )
参数解释如下:
image: 输入图像、八位单通道的,背景为黑色
contours: 得到的轮廓图像
hierarchy: 层次图像,根据需要提取轮廓层次信息
mode: 决定提取到层次信息内容,是多层还是单层
method: 每个轮廓的编码信息
offset: 表示轮廓偏移,默认为0
轮廓分析相关的常用函数
//计算轮廓面积 doublecv::contourArea( InputArraycontour, booloriented=false ) //计算轮廓周长 doublecv::arcLength( InputArraycurve, boolclosed ) //计算几何矩与中心距 Momentscv::moments( InputArrayarray, boolbinaryImage=false ) //计算最小外接矩形 RotatedRectcv::minAreaRect( InputArraypoints ) //计算最大外接矩形 Rectcv::boundingRect( InputArrayarray ) //计算最小外接圆/拟合圆 voidcv::minEnclosingCircle( InputArraypoints, Point2f¢er, float&radius ) //计算最小外接三角形/拟合三角形 doublecv::minEnclosingTriangle( InputArraypoints, OutputArraytriangle ) //拟合直线 voidcv::fitLine( InputArraypoints, OutputArrayline, intdistType, doubleparam, doublereps, doubleaeps ) //拟合椭圆 RotatedRectcv::fitEllipse( InputArraypoints ) //计算凸包 voidcv::convexHull( InputArraypoints, OutputArrayhull, boolclockwise=false, boolreturnPoints=true ) //多边形逼近-逼近真实形状 voidcv::approxPolyDP( InputArraycurve, OutputArrayapproxCurve, doubleepsilon, boolclosed )
灵活使用上述轮廓属性信息,可以实现对二值图像的几何形状判别、测量、面积过滤、获取每个对象的几何属性包括面积、周长、编码点、形状、层次/位置信息、欧拉数、中心位置、倾斜角度。
综合运用代码演示
2020年 以前我分享过一些综合使用的例子,列表如下(都看过你就赢了):
二值图像分析案例精选
OpenCV二值图像案例分析精选 | 第二期
OpenCV轮廓层次分析实现欧拉数计算
OpenCV寻找复杂背景下物体的轮廓
如何识别出轮廓准确的长和宽
OpenCV中几何形状识别与测量
OpenCV中BLOB特征提取与几何形状分类
OpenCV直线拟合检测
OpenCV中实现曲线与圆拟合
这里再分享一个硬币计数的例子!
原图如下:
代码如下:
//加载图像 Matimg=imread("D:/CoinsB.png"); imshow("OriginalImage",img); //阈值化操作 Matgray,binary; cvtColor(img,gray,COLOR_BGR2GRAY); floatt=threshold(gray,binary,0,255,THRESH_BINARY|THRESH_OTSU); imshow("binary",binary); imwrite("D:/binary1.png",binary); //形态学操作 Matse=getStructuringElement(MORPH_RECT,Size(3,3)); morphologyEx(binary,binary,MORPH_OPEN,se,Point(-1,-1)); //轮廓发现 vectorhire achy; vector >contours; bitwise_not(binary,binary); findContours(binary,contours,hireachy,RETR_EXTERNAL,CHAIN_APPROX_ SIMPLE,Point()); Matresult=img.clone(); Point2fcenter; floatradius; //轮廓分析 for(size_tt=0;t< contours.size(); t++) { double area = contourArea(contours[t]); if (area < 1000) { continue; } RotatedRect rrt = fitEllipse(contours[t]); radius = min(rrt.size.width, rrt.size.height)/2.0; circle(result, rrt.center, radius, Scalar(0, 0, 255), 4, 8, 0); Moments mm = moments(contours[t]); double cx = mm.m10 / mm.m00; double cy = mm.m01 / mm.m00; circle(result, Point(cx, cy), 2, Scalar(255, 0, 0), 2, 8, 0); } // 显示结果 imshow("result", result); imwrite("D:/drawing.png", result); waitKey(0);
- 函数
+关注
关注
3文章
4220浏览量
61876 - 二值图像
+关注
关注
0文章
14浏览量
8699 - 轮廓分析
+关注
关注
0文章
2浏览量
6086
原文标题:OpenCV | 二值图像分析的技巧都在这里
文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。
发布评论请先登录
相关推荐
评论