如何判断轮廓是否为圆?

如何判断轮廓是否为圆?
    判断一个轮廓是否为圆?这看似简单的问题,在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. }
 
      小结一下:数学还是很强的,很多时候,借助定义本身,能够解决问题。
        
     





目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/649598

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。