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

本文介绍了如何使用OpenCV 4的minEnclosingTriangle()和minEnclosingCircle()函数来寻找2D点集的最小包围三角形和圆形。这两个函数帮助处理集中在一起的小区域,避免了多边形逼近的复杂性。通过示例程序,展示了如何随机生成点并找到它们的最小包围形状。
摘要由CSDN通过智能技术生成
本文首发于 “小白学视觉”微信公众号,欢迎关注公众号
本文作者为小白,版权归 人民邮电出版社发行所有,禁止转载,侵权必究!

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

有时我们关注的区域是一些面积较小数目较多的连通域或者像素点,并且这些区域相对的集中在一起。此时如果寻找轮廓并对每个轮廓进行外接多边形逼近,结果会有较多的多边形。为了避免这个情况,我们可以将这些连通域或者像素点看成一个大的区域,此时我们可以寻找包围将这些区域的规则图形,例如三角形、圆形等,三角形包围2D点集的示意图如图7-27所示。本节将重点介绍如何寻找包围2D点集的规则图形,包括三角形和圆形。OpenCV 4提供了用于寻找包围2D点集的规则图形的函数,接下来将介绍这些函数的函数原型以及使用方法。

图7-27 点集三角形拟合示意图

OpenCV 4提供了minEnclosingTriangle()函数用于寻找2D点集的最小包围三角形,函数的函数原型在代码清单7-34中给出。

代码清单7-34 minEnclosingTriangle()函数原型
1.	double cv::minEnclosingTriangle(InputArray  points,
2.	                                      OutputArray  triangle 
3.	                                      )
  • points:待寻找包围三角形的2D点集。
  • triangle:拟合出的三角形三个顶点坐标。

该函数能够找到包含给定2D点集的最小区域的三角形,函数返回值为double类型的三角形面积。函数只有两个参数,第一个参数是待寻找包围三角形的2D点集,2D点可以存放在vector<>或者Mat类型的变量中,数据类型为CV_32S或CV_32F;第二个参数是包含所有2D点的面积最小的三角形的三个顶点坐标,输出的数据类型为CV_32F,存放在vector类型的变量中。该函数的使用方式在代码清单7-36的示例程序中给出。

OpenCV 4还提供了minEnclosingCircle()函数用于寻找2D点集的最小包围圆形,该函数的函数原型在代码清单7-35中给出。

代码清单7-35 minEnclosingCircle()函数原型
1.	void cv::minEnclosingCircle(InputArray  points,
2.	                                  Point2f &  center,
3.	                                  float &  radius 
4.	                                  )
  • points:待寻找包围圆形的2D点集。
  • center:圆形的圆心。
  • radius:圆形的半径。

该函数使用迭代算法寻找2D点集的最小包围圆形。函数的第一个参数是待寻找包围圆形的2D点集,2D点可以存放在vector<>或者Mat类型的变量中。函数第二个参数和第三个参数分别是2D点集最小包围圆的圆心和半径,圆心的数据类型为Point2f,半径的数据类型为float。该函数的使用方式在代码清单7-36的示例程序中给出。

在代码清单7-36的程序中随机生成100以内的点,并随机分布在图像中的指定区域内,之后通过minEnclosingTriangle()函数和minEnclosingCircle()函数寻找包围这些点的三角形和圆形。为了能够反复的查看结果,程序设置了while循环,直到按下“q”、“Q”或者“ESC”按键时程序跳出循环。程序的运行结果如图7-28所示,由于程序中像素点是随机生成的,因此每次运行结果会有不同。

代码清单7-36 myTriangleAndCircle.cpp点集外包轮廓
1.	#include <opencv2\opencv.hpp>
2.	#include <iostream>
3.	#include <vector>
4.	
5.	using namespace cv;
6.	using namespace std;
7.	
8.	int</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学视觉

您的赞赏是我们坚持下去的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值