如何判断轮廓是否为圆?

如何判断轮廓是否为圆?

判断一个轮廓是否为圆?这看似简单的问题,在opencv中并没有现成的函数。当我真正想运用的时候,却发现还是有许多内容在里面的。

比如这幅图片,由于瓶口是有缺陷的,造成找到的最大外轮廓不闭合。那么该如何判断这个轮廓是否是圆了。

我认为从两点来考虑。

一个是圆的定义:

“平面上到定点的距离等于定长的所有点组成的图形叫做圆.定点称为圆心,定长称为半径.”

那么就来判断当前轮廓到一个定点的距离是否为定长。这里这个定点就可以采用外接圆圆心。而这里的度量是标准差。

经过试验发现,对于这些有缺陷的情况,其标准差都是比较大的(一般大于5),而对于没有缺陷的情况来说,其标准差都比较小(小于1)。

但是这并不能完全地解决问题,比如存在这样的情况,其轮廓上所有点到定点的标准差也是不大的,但是这个轮廓没有构成一个闭合曲线,所以也没有构成圆。

那么二点就是曲线闭合的定义.

闭曲线:起点与终点重合的曲线。平面(或空间)中的闭曲线即为单位圆周到平面(或空间)中的连续映射的像。

不是很好理解,但是可以这样简化,就是对于闭曲线中的任意一点,遍历闭曲线,都能够回到这一点。换句话说,就是不存在“端点”。这里可以再转换为这样的理解:

“对于闭曲线中的所有点,除了它本身之外,和这个点距离为最小值(比如1)的点都有两个。”

来自为知笔记(Wiz)

时间: 2024-10-13 15:31:51

如何判断轮廓是否为圆?的相关文章

PCB上圆形焊盘检测三种方法

鄙人初学opencv,在论坛上有人在做PCB板圆形焊盘检测,自己尝试用三种方法来检测圆形焊盘,下面为检测图像: 1.轮廓和霍夫圆变换 1 void main() 2 { 3 IplImage* src=cvLoadImage("1.jpg",CV_LOAD_IMAGE_UNCHANGED);//三通道的彩色图像 4 IplImage* dst=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1); 5 cv

判断矩形和圆是否相交

判断矩形和圆是否相交 思路: 方法一:先判断矩形是否在圆内(矩形的四个顶点是否在圆内),若是则不相交,否则再判断圆心到矩形四条边的最短距离(点到线段的最短距离)是否存在小于半径的,若是则相交(认为矩形包括圆是不相交的,已经先排除了). 方法二:圆分平面为四部分, 方法二:圆分平面四部分,不相交的情况分了几种:长方形在圆形上面,长方形在圆形下面,长方形在圆形左边,长方形在圆形右边,长方形在圆形内部,圆形在长方形内部. 方法三:矩形分平面九部分,用矩形的四个边,把空间划分成为9个区域,判定圆心的位置

[转载]转载,opencv轮廓查找,匹配以及特征提取,实例

已有 9450 次阅读 2012-3-15 20:50 |系统分类:科研笔记|关键词:opencv 轮廓 轮廓的查找.表达.绘制.特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match) 作者:王先荣 前言    轮廓是构成任何一个形状的边界或外形线.前面讲了如何根据色彩及色彩的分布(直方图对比和模板匹配)来进行匹配,现在我们来看看如何利用物体的轮廓.包括以下内容:轮廓的查找.表达方式.组织方式.绘制.特性.匹

OpenCV_轮廓的查找、表达、绘制、特性及匹配

我的新浪微博:http://weibo.com/u/1645794700/home?wvr=5&c=spr_web_360_hao360_weibo_t001 CV机器视觉2013CV机器视觉2013CV机器视觉2013 开始 虽然Canny之类的边缘检测算法可以根据像素间的差异检测出轮廓边界的像素,但是它并没有将轮廓作为一个整体.下一步是要将这些边缘像素组装成轮廓. 轮廓是构成任何一个形状的边界或外形线.直方图对比和模板匹配根据色彩及色彩的分布来进行匹配,以下包括:轮廓的查找.表达方式.组织方

轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match)

http://www.cnblogs.com/xrwang/archive/2010/02/09/HowToUseContour.html 作者:王先荣 前言    轮廓是构成任何一个形状的边界或外形线.前面讲了如何根据色彩及色彩的分布(直方图对比和模板匹配)来进行匹配,现在我们来看看如何利用物体的轮廓.包括以下内容:轮廓的查找.表达方式.组织方式.绘制.特性.匹配. 查找轮廓    首先我们面对的问题是如何在图像中找到轮廓,OpenCv(EmguCv)为我们做了很多工作,我们的任务只是调用现成

如何检测一个圆在多个圆内?

问题定义: 存在多个半径相同的圆,和一个半径不同的圆,如何判断半径不同的圆完全在一群圆内.下图演示了几种情况,左边是完全在圆内,右边不是. 解决方法之一: 对于红圆在某个黑圆之内或者在所有黑圆之外等的特例情形,可以用简单的圆圆之间的几何判断算法得到结果,对于其余部分相交的一般情形,如果同时满足以下两个条件则红圆在黑圆内: 1. 红圆与所有黑圆的交点都在黑圆内: 2. 黑圆之间的交点如果在红圆内,则其也必然在黑圆内. 否则,红圆不在黑圆内.

iOS之两圆之间标准圆的随机生成

相信很多社交产品中,肯定会存在寻找附近人或者附近商家的需求,类似下图,在大圆和小圆之间(橘色区域)生成一系列的随机圆,并且所有随机圆之间也不能有交集,我暂且称这种圆为标准圆. 关于这样的需要以前在做项目中有同事做过,虽然可以实现了上面的效果图,但是坐标及半径都是写死,从写死的数据随机取值,看上去是满足了,但是对于用户来说多次使用该功能时,肯定有一定的视觉疲倦,且写死的一些数据真的不好写,如果大圆或者小圆半径变化了,或者需要更多的标准圆,那怎么办呢?一脸懵逼?? 思路一: 对于这个需求,我一开始也

图形碰撞检测 圆与矩形

先建立我们需要的数据模型: 1. 向量: 1 /** 2 * 向量类,默认使用正交基 3 */ 4 public class SHVector 5 { 6 public var x:Number; 7 public var y:Number; 8 public var z:Number; 9 10 /** 11 * 构造函数 12 */ 13 public function SHVector(x:Number, y:Number, z:Number = 0) 14 { 15 this.x = x

51 Nod 1298 圆与三角形(计算几何)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 题目: 1298 圆与三角形 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标x