如何判断轮廓是否为圆?
   判断一个轮廓是否为圆?这看似简单的问题,在opencv中并没有现成的函数。当我真正想运用的时候,却发现还是有许多内容在里面的。
      
比如这幅图片,由于瓶口是有缺陷的,造成找到的最大外轮廓不闭合。那么该如何判断这个轮廓是否是圆了。
     我认为从两点来考虑。
      一个是圆的定义:
   “平面上到定点的距离等于定长的所有点组成的图形叫做圆.定点称为圆心,定长称为半径.”
      那么就来判断当前轮廓到一个定点的距离是否为定长。这里这个定点就可以采用外接圆圆心。而这里的度量是标准差。
       经过试验发现,对于这些有缺陷的情况,其标准差都是比较大的(一般大于5),而对于没有缺陷的情况来说,其标准差都比较小(小于1)。
       但是这并不能完全地解决问题,比如存在这样的情况,其轮廓上所有点到定点的标准差也是不大的,但是这个轮廓没有构成一个闭合曲线,所以也没有构成圆。
  1.    //根据轮廓点和圆心计算方差
  2. float ComputeVariance(std::vector<cv::Point> theContour,Point2f theCenter)
  3. {
  4.     int a[65535],n;
  5.     float aver,s;
  6.     float sum=0,e=0;
  7.     n = theContour.size();
  8.     for(int i=0;i<n;i++)
  9.     {
  10.         a[i] = GetDistance(theContour[i],theCenter);
  11.         sum+=a[i];
  12.     }
  13.     aver=sum/n;
  14.     for(int i=0;i<n;i++)
  15.         e+=(a[i]-aver)*(a[i]-aver);
  16.     e/=n-1;
  17.     s=sqrt(e);
  18.     return e;
  19. }
那么二点就是曲线闭合的定义.
      闭曲线:起点与终点重合的曲线。平面(或空间)中的闭曲线即为单位圆周到平面(或空间)中的连续映射的像。
      不是很好理解,但是可以这样简化,就是对于闭曲线中的任意一点,遍历闭曲线,都能够回到这一点。换句话说,就是不存在“端点”。这里可以再转换为这样的理解:
        “对于闭曲线中的所有点,除了它本身之外,和这个点距离为最小值(比如1)的点都有两个。”
  1. //判断轮廓是否闭合。闭合曲线返回为0
  2. intComputeClose(std::vector<cv::Point>MaxContour)
  3. {
  4. //TODO 计算第一个点和最后一个点相对于圆心的角度.最后变成计算这两点的距离
  5. int itmp =0;
  6. int iret =0;
  7. for(int i=0;i<MaxContour.size();i++)
  8. {
  9. for(int j=0;j<MaxContour.size();j++)
  10. {
  11. if(i!=j)
  12. {
  13. if(GetDistance(MaxContour[i],MaxContour[j])<1)
  14. {
  15. itmp++;
  16. }
  17. }
  18. }
  19. if(itmp ==1)//存在端点
  20. {
  21. iret ++;
  22. }
  23. itmp=0;
  24. }
  25. return iret;
  26. }
      小结一下:数学还是很强的,很多时候,借助定义本身,能够解决问题。
     
来自为知笔记(Wiz)

目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

如何判断轮廓是否为圆?相关推荐

  1. 项目5 判断点是否在圆内

    项目5 判断点是否在圆内 请编写一个Java应用程序,判断给定的平面点坐标(x1,y1)是否在一个指定半径的圆内.程序先请求输入圆的半径,再请求输入点的x坐标和y坐标,然后给出判断点是否在圆内并打印输 ...

  2. 判断点是否在圆上(java)

    判断点是否在圆上(java) package zuoye;class Point{double x;double y;//设置点的x坐标public void setX(double x){this. ...

  3. Python之构造函数的练习(定义一“圆”(Circle)类,圆心为“点”Point类,构造一圆,求圆的周长和面积,并判断某点与圆的关系)

    需求1:定义一"圆"(Circle)类,圆心为"点"Point类,构造一圆,求圆的周长和面积,并判断某点与圆的关系 分析: Circle: 特征:圆心,半径 行 ...

  4. c语言在平面直角坐标系中,给定一个圆的圆心坐标Ox,Oy以及半径R,在再给定一个点的坐标PX,Py,请判断这个点与圆的位置关系。

    在平面直角坐标系中,给定一个圆的圆心坐标Ox,Oy以及半径R,在再给定一个点的坐标PX,Py,请判断这个点与圆的位置关系. 输入格式: 先输入三个正整数,分别代表圆心的横纵坐标x,Oy和半径R. 在输 ...

  5. C++opencv找圆心?看着一篇,一定有你要(边缘轮廓检测,拟合,凸包)找出相应的轮廓或者全部轮廓画外界圆轮廓并且标出轮廓中心

    一,利用面积对轮廓进行筛选 注意这种面积筛选有一个弊端就是比如有两个轮廓, A轮廓为500 B轮廓为300 当面积设置为 area<400时就可以筛选出面积小于300的所有轮廓 反之大于300的 ...

  6. C++判断点是否在圆上

    代码实现 头文件 Print.h #pragma once #include<iostream> using namespace std;class Print { public://设置 ...

  7. java 椭圆拟合,OpenCV画轮廓的外界圆矩形椭圆等

    #include #include #include #include using namespace std; #pragma   comment(lib,"cv.lib") # ...

  8. C++ 判断点是否在圆的内部

    点到圆心的距离公式也就是两点间距离公式: 将类和main文件都写在一个文件中 #include <iostream>using namespace std;//点类 class Point ...

  9. opencv学习——轮廓分析寻找近似圆

    这是一张经过处理后的红灯的图像,我们需要找到其中的红灯,可以看到是两个圆,用霍夫圆之后发现其中调参非常麻烦,于是写了一个根据轮廓来分析圆的算法. 算法思想:findContours()找到图像的轮廓, ...

最新文章

  1. 吴恩达灵魂发问:AI社区最亟待解决的问题是什么?
  2. python爬虫小说代码示例-Python从零开始写爬虫-4 解析HTML获取小说正文
  3. tf.nn.softmax参数详解以及作用
  4. run sequence between odata request and controller init
  5. JavaFX UI控件教程(二十七)之File Chooser
  6. Python匿名函数---排序
  7. LeetCode 1026. 节点与其祖先之间的最大差值(二叉树DFS)
  8. printf 指针地址_c语言对指针的理解
  9. FreeModbus源码获取
  10. Mybatis-plus插入数据遇到主键没有默认值的问题
  11. phpMyAdmin出现错误 Access denied for user 'root'@'localhost' (using password: NO)
  12. java爬虫乱码_网络爬虫的乱码处理
  13. 百度和知乎哪个引流效果好?知乎和百度的有什么区别?
  14. java面试职业规划怎么回答,深入分析
  15. excel批量替换不同值(根据多个条件匹配、替换不成功的解决办法)
  16. python--异常捕获
  17. 关于CPU 和 GPU
  18. MySQL 表设计的经验准则
  19. STM32入门-区别ORD,BSRR,BRR寄存器
  20. 求职英语_面试英文须知

热门文章

  1. Spring Boot 实现定时任务的 4 种方式
  2. 再有人问你Netty是什么,就把这篇文章发给他
  3. spring cloud gateway之服务注册与发现
  4. 【廖雪峰python入门笔记】list_按照索引访问
  5. 斯坦福AI 5小时DNA测序破世界纪录!创人类新里程碑,成本仅3万
  6. 中科院博士返乡卖汉服:3个月卖三百万,高定一件3.5万
  7. 腾讯宣布员工最高可申请免息借款90万!网友:应届当码农就能一线城市买房了!...
  8. Transformer 又立功了!又快(420 fps)又好的车道线检测算法
  9. 头像秒变像素风,宅男大叔自学AI打造大师级水准,火爆推特
  10. Fast-SCNN的解释以及使用Tensorflow 2.0的实现