本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!


经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

轮廓面积

轮廓面积是轮廓重要的统计特性之一,通过轮廓面积的大小可以进一步分析每个轮廓隐含的信息,例如通过轮廓面积区分物体大小识别不同的物体。轮廓面积是指每个轮廓中所有的像素点围成区域的面积,单位为像素。OpenCV 4提供了检测轮廓面积的contourArea()函数,该函数的函数原型在代码清单7-15中给出。

代码清单7-15 contourArea()函数原型
1.  double cv::contourArea(InputArray  contour,
2.                              bool  oriented = false
3.                              )
  • contour:轮廓的像素点
  • oriented:区域面积是否具有方向的标志,true表示面积具有方向性,false表示不具有方向性,默认值为不具有方向性的false。

该函数用于统计轮廓像素点围成区域的面积,函数的返回值是统计轮廓面积的结果,数据类型为double。函数第一个参数表示轮廓的像素点,数据类型为vector或者Mat,相邻的两个像素点之间逐一相连构成的多边形区域即为轮廓面积的统计区域。连续的三个像素点之间的连线有可能在同一条直线上,因此为了减少输入轮廓像素点的数目,可以只输入轮廓的顶点像素点,例如一个三角形的轮廓,轮廓中可能具有每一条边上的所有像素点,但是在统计面积时可以只输入三角形的三个顶点。函数第二个参数是区域面积是否具有方向的标志,参数为true时表示统计的面积具有方向性,轮廓顶点顺时针给出和逆时针给出时统计的面积互为相反数;参数为false时表示统计的面积不具有方向性,输出轮廓面积的绝对值。

为了了解该函数的使用方法,在代码清单7-16中给出了统计轮廓面积的示例程序。程序中给出一个直角三角形轮廓的三个顶点以及斜边的中点,统计出的轮廓面积与三角形的面积相等,同时统计图7-16中每个轮廓的面积,程序的运行结果在图7-18给出。

代码清单7-16 myContourArea.cpp计算轮廓面积
1.  #include <opencv2\opencv.hpp>
2.  #include <iostream>
3.  #include <vector>
4.
5.  using namespace cv;
6.  using namespace std;
7.
8.  int main()
9.  {10.     system("color F0");  //更改输出界面颜色
11.     //用四个点表示三角形轮廓
12.     vector<Point> contour;
13.     contour.push_back(Point2f(0, 0));
14.     contour.push_back(Point2f(10, 0));
15.     contour.push_back(Point2f(10, 10));
16.     contour.push_back(Point2f(5, 5));
17.     double area = contourArea(contour);
18.     cout << "area =" << area << endl;
19.
20.     Mat img = imread("coins.jpg");
21.     if (img.empty())
22.     {23.         cout << "请确认图像文件名称是否正确" << endl;
24.         return -1;
25.     }
26.     imshow("原图", img);
27.     Mat gray, binary;
28.     cvtColor(img, gray, COLOR_BGR2GRAY);  //转化成灰度图
29.     GaussianBlur(gray, gray, Size(9, 9), 2, 2);  //平滑滤波
30.     threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);  //自适应二值化
31.
32.                                                                      // 轮廓检测
33.     vector<vector<Point>> contours;  //轮廓
34.     vector<Vec4i> hierarchy;  //存放轮廓结构变量
35.     findContours(binary, contours, hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE, Point());
36.
37.     //输出轮廓面积
38.     for (int t = 0; t < contours.size(); t++)
39.     {40.         double area1 = contourArea(contours[t]);
41.         cout << "第" << t << "轮廓面积=" << area1 << endl;
42.     }
43.     return 0;
44. }

图7-18 myContourArea.cpp程序输出结果

轮廓长度

轮廓的周长也是轮廓重要的统计特性之一,轮廓的周长虽然无法直接反应轮廓区域的大小和形状,但是可以与轮廓面积结合得到关于轮廓区域的更多信息,例如某个区域的面积与周长平方的比值为十六分之一时该区域为正方形。OpenCV 4提供了用于检测轮廓周长或者曲线长度的arcLength()函数,该函数的函数原型在代码清单7-17中给出。

代码清单7-17 arcLength()函数原型
1.  double cv::arcLength(InputArray  curve,
2.                           bool  closed
3.                           )
  • curve:轮廓或者曲线的2D像素点。
  • closed:轮廓或者曲线是否闭合标志,true表示闭合。

该函数能够统计轮廓或者曲线的长度,函数返回值为统计长度,单位为像素,数据类型为double。函数的第一个参数是轮廓或者曲线的2D像素点,数据类型为vector或者Mat。函数的第二个参数是轮廓或者曲线是否闭合的标志,true表示闭合。

函数统计的长度是轮廓或者曲线相邻两个像素点之间连线的距离,例如计算三角形三个顶点A、B和C构成的轮廓长度时,并且函数第二个参数为true时,统计的长度是三角形三个边AB、BC和CA的长度之和;当参数为false时,统计的长度是由A到C三个点之间依次连线的距离长度之和,即AB和BC的长度之和。

为了了解该函数的使用方法,在代码清单7-18中给出统计轮廓长度的示例程序。程序中给出一个直角三角形轮廓的三个顶点以及斜边的中点,分别利用arcLength()函数统计轮廓闭合情况下的尺度和非闭合情况下的长度,同时统计图7-16中每个轮廓的长度,程序的运行结果在图7-19给出。

代码清单7-18 myArcLength.cpp计算轮廓长度
1.  #include <opencv2\opencv.hpp>
2.  #include <iostream>
3.  #include <vector>
4.
5.  using namespace cv;
6.  using namespace std;
7.
8.  int main()
9.  {10.     system("color F0");  //更改输出界面颜色
11.     //用四个点表示三角形轮廓
12.     vector<Point> contour;
13.     contour.push_back(Point2f(0, 0));
14.     contour.push_back(Point2f(10, 0));
15.     contour.push_back(Point2f(10, 10));
16.     contour.push_back(Point2f(5, 5));
17.
18.     double length0 = arcLength(contour, true);
19.     double length1 = arcLength(contour, false);
20.     cout << "length0 =" << length0 << endl;
21.     cout << "length1 =" << length1 << endl;
22.
23.     Mat img = imread("coins.jpg");
24.     if (img.empty())
25.     {26.         cout << "请确认图像文件名称是否正确" << endl;
27.         return -1;
28.     }
29.     imshow("原图", img);
30.     Mat gray, binary;
31.     cvtColor(img, gray, COLOR_BGR2GRAY);  //转化成灰度图
32.     GaussianBlur(gray, gray, Size(9, 9), 2, 2);  //平滑滤波
33.     threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);  //自适应二值化
34.
35.     // 轮廓检测
36.     vector<vector<Point>> contours;  //轮廓
37.     vector<Vec4i> hierarchy;  //存放轮廓结构变量
38.     findContours(binary, contours, hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE, Point());
39.
40.     //输出轮廓长度
41.     for (int t = 0; t < contours.size(); t++)
42.     {43.         double length2 = arcLength(contours[t], true);
44.         cout << "第" << t << "个轮廓长度=" << length2 << endl;
45.     }
46.     return 0;
47. }

图7-19 myArcLength.cpp程序输出结果

OpenCV 4开发详解
往期推荐
【OpenCV 4开发详解】图像金字塔
【OpenCV 4开发详解】窗口交互操作
【OpenCV 4开发详解】图像直方图绘制
【OpenCV 4开发详解】直方图操作
【OpenCV 4开发详解】直方图应用
【OpenCV 4开发详解】图像模板匹配
【OpenCV 4开发详解】图像卷积
【OpenCV 4开发详解】图像噪声的种类与生成
【OpenCV 4开发详解】均值滤波
【OpenCV 4开发详解】方框滤波
【OpenCV 4开发详解】高斯滤波
【OpenCV 4开发详解】可分离滤波
【OpenCV 4开发详解】中值滤波
【OpenCV 4开发详解】边缘检测原理
【OpenCV 4开发详解】Scharr算子
【OpenCV 4开发详解】Laplacian算子
【OpenCV 4开发详解】Canny算法
【OpenCV 4开发详解】图像距离变换
【OpenCV 4开发详解】图像连通域分析
【OpenCV 4开发详解】图像腐蚀
【OpenCV 4开发详解】图像膨胀
【OpenCV 4开发详解】形态学应用
【OpenCV 4开发详解】检测直线
【OpenCV 4开发详解】直线拟合
【OpenCV 4开发详解】直线检测
【OpenCV 4开发详解】轮廓发现与绘制
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

【OpenCV 4开发详解】轮廓面积与长度相关推荐

  1. 【OpenCV 4开发详解】轮廓外接多边形

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  2. 【OpenCV 4开发详解】轮廓发现与绘制

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. 【OpenCV 4开发详解】分割图像——分水岭法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  4. 【OpenCV 4开发详解】深度神经网络应用实例

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. 【OpenCV 4开发详解】图像修复

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV 4开发详解】分割图像——Grabcut图像分割

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【OpenCV 4开发详解】漫水填充法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】点集拟合

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. iMeta | 第1卷第1期在线正式发布(2022/3/28)
  2. 统计学习导论 Chapter5 -- Resampling Methods
  3. 计算机故障的现象有哪些,八种常见CPU故障现象的分析与处理_计算机硬件与网络_IT /计算机_信息...
  4. Swift学习——Swift解释特定的基础(七)
  5. 2.5英寸硬盘何止“五脏俱全”(硬盘构造再揭秘之四)
  6. 61条面向对象设计的经验原则
  7. 2016猴年春节有感
  8. JS基础篇--函数声明与定义,作用域,函数声明与表达式的区别
  9. 虚拟大师怎么修改手机_手机虚拟大师,打造一个属于你的专属手机平台
  10. AcWing 1738. 蹄球(特殊基环树)
  11. 对英文单词的词性标注
  12. 2017,我对自己狠一点,也要对自己好一点
  13. 银行家舍入-四舍六入五成双
  14. logistic回归分析优点_机器学习实战项目-Logistic回归
  15. 梦幻西游手游经验任务链计算机,梦幻西游手游任务链帮派求助刷经验技巧
  16. SystemUI之NavigationBar导航栏
  17. Win11新电脑开机怎么跳过登录microsoft账户?
  18. AWS Ec2实例挂载S3存储桶实践
  19. 东华大学 oj49——修理牛棚
  20. Windows 8操作系统犹抱琵琶半遮面

热门文章

  1. 英伟达Q4净利同比降49%,还能继续躺赚吗?
  2. 一周焦点 | 最强AI芯片麒麟980发布;前端开发者将被取代?
  3. 资源 | 4天学会PyTorch!香港科技大学开放PyTorch机器学习课件资源
  4. 线上订单号重复了?一招搞定它!
  5. Java 和 C 长期霸权结束
  6. 你还在用Swagger?试试这个神器!
  7. 跟我学Springboot开发后端管理系统9:AOP+logback+MDC日志输出
  8. 程序员七夕如何表白:朕只爱一个皇后!(单例模式)
  9. Tensorflow基础入门十大操作总结
  10. 零样本风格迁移:多模态CLIP文本驱动图像生成