hough圆检测不是很稳定,需要调节的参数也比较多,即便半径都调节到合适的范围内,但是结果有时候仍然存在较大偏差,但是hough受噪声影响小,不受轮廓不连续影响。但是如果存在比较完整的轮廓,也可以直接对轮廓进行一个圆的检测。依据为圆的定义,“平面上到定点的距离等于定长的所有点组成的图形叫做圆.”

//************************************
// Description: 两点距离
// Method:    GetDistance
// FullName:  GetDistance
// Access:    public
// Parameter: Point2f p1
// Parameter: Point2f p2
// Returns:   float
// Author:    小白
// Date:      2017/09/27
// History:
//************************************
float GetDistance(Point2f p1, Point2f p2)
{float dis = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));return dis;
}//************************************
// Description: 根据轮廓点和圆心计算方差
// Method:    ComputeVariance
// FullName:  ComputeVariance
// Access:    public
// Parameter: std::vector<cv::Point> theContour 某个轮廓点向量
// Parameter: Point2f theCenter 最小外接圆圆心
// Returns:   float
// Author:    小白
// Date:      2017/09/27
// History:
//************************************
float ComputeVariance(std::vector<cv::Point> theContour, Point2f theCenter)
{int n = theContour.size();vector<int> a(n);float aver,s;float sum = 0, e = 0;for(int i = 0; i < n; i++){a[i] = GetDistance(theContour[i],theCenter);sum += a[i];}aver = sum / n;for(int i = 0; i < n; i++)e += (a[i] - aver) * (a[i] - aver);e /= n - 1;s = sqrt(e);return e;
}//************************************
// Description: 判断某个轮廓是否为圆
// Method:    FindCircles
// FullName:  FindCircles
// Access:    public
// Parameter: Mat img 二值化图(不是边缘检测结果)
// Parameter: int minPoints 轮廓最小点数(过滤噪点)
// Parameter: int maxOffset 圆检测最大偏差
// Parameter: int minr 最小半径
// Parameter: int maxr 最大半径
// Returns:   vector<Point3f>
// Author:    小白
// Date:      2017/09/27
// History:
//************************************
vector<Point3f> FindCircles(Mat img, int minPoints, int maxOffset, int minr, int maxr)
{vector<Point3f> result;vector<vector<Point> > contours;vector<Vec4i> hierarchy;findContours( img.clone(), contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );for (int i = 0; i < contours.size(); i++){Point2f center; float radius;  if (contours[i].size() > minPoints){minEnclosingCircle(contours[i], center, radius);//得到最小外接圆圆心和半径  int offset = ComputeVariance(contours[i], center);if (offset < maxOffset && radius > minr && radius <= maxr){Point3f p(center.x, center.y, radius);result.push_back(p);}}}return result;
}void main()
{Mat a = imread("t.jpg", 1);//原图Mat b;//灰度图cvtColor(a, b, CV_BGR2GRAY);Mat c;//二值图threshold(b, c, 128, 255, CV_THRESH_BINARY);int minr = 0;int maxr = 100;vector<Point3f> circles = FindCircles(c, 50, 80, 0, 100);//检测结果for (int i = 0; i < circles.size(); i++){circle(a, Point(circles[i].x, circles[i].y), circles[i].z, Scalar(0,0,255), 2, 8, 0);}imshow("检测结果", a);waitKey(0);
}

测试图

结果图

【opencv】圆检测(非hough)相关推荐

  1. OpenCV——圆检测

    使用cv2.HoughCircles()函数进行圆检测. 函数原型:cv2.HoughCircles(image,method,dp,minDist[, circles[,param1, param2 ...

  2. QT+opencv学习笔记(5)——霍夫直线检测、圆检测及椭圆检测

    开发环境为:win10+QT5.8+opencv3.2 Hough变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛.最基本的Hough变换是从黑白图像中检测直线,还可以经过改进检测圆.椭 ...

  3. opencv使用霍夫圆算法HoughCircles进行圆检测

    原理介绍: opencv -- HoughCircles 霍夫圆变换原理及圆检测 霍夫变换(Hough Transform) 霍夫变换 - 圆检测 (Hough Circle transform) 霍 ...

  4. 基于C++OpenCV实现的直线检测、圆检测

    资源下载地址:https://download.csdn.net/download/sheziqiong/85627479 实验内容和要求 输入一张彩色图像,要求能够检测出其中的直线.圆. 实验器材 ...

  5. 使用Python,OpenCV和Hough圆检测图像中的圆

    使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...

  6. 【opencv学习】【hough圆检测】

    import cv2 import numpy as np# 圆的检测原理 # 霍夫梯度法:先确定圆心,再确定半径 # 把原图做一次 Canny 边缘检测,得到边缘检测的二值图. # 圆的边缘点切线的 ...

  7. Python+OpenCV:Hough圆检测(Hough Circle Transform)

    Python+OpenCV:Hough圆检测(Hough Circle Transform) ##################################################### ...

  8. opencv进阶学习笔记11:cannny边缘检测,直线检测,圆检测

    基础版笔记传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) cannny边缘检测 基础版边 ...

  9. OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测

    基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...

最新文章

  1. 摄像头和相机模型和内参原理
  2. 基于deep learning的快速图像检索系统
  3. 为什么手机上传图片这么慢 前端_怎样在手机上就能把图片压缩到100K以下?
  4. JAVA——声明包类的编译与运行解决方案
  5. mysql表损坏监控_监控mysql启动情况并检测表错误修复
  6. 统一配置数据库连接符的方法
  7. go map数据结构
  8. 项目:NMEA2000的数据格式解析
  9. c语言字体属性,【C】 5_变量属性
  10. CodeFirst的EF6迁移和时间戳错误
  11. 如何让程序集在每次编译时自动产生不同的版本号
  12. Qt Model/View/Delegate浅谈 - QAbstractListModel
  13. mac显示网速_Mac系统怎么查看测试网速
  14. 全网首发:TeaVM编译时容易出错的几种代码
  15. java解析获得birt报表的数据_java pojo实体类做birt报表数据源
  16. 基于Java的2048小游戏设计
  17. Lectra力克公司发布新战略 助力客户打造“工业4.0”智造流程
  18. About Oracle TraceFile
  19. postgresql 转 mysql_PostgreSQL转换为Mysql
  20. python运行代码无反应_linux执行python命令后没有反应,不打印日志信息

热门文章

  1. 逻辑电平、噪声容限、串行通信
  2. 百度前200页部分答案(初稿)
  3. 2020 Web技术应用基础 (第3版) 期末重点 【整理】 (必考题)
  4. 美女图片整站源码 wordpress主题多功能CX-UDY图片主题下载 带会员积分系统
  5. ]视音频编解码技术零基础学习方法
  6. real解码器 v2015.08
  7. 解决“libboost_regex-vc120-mt-gd-1_59.lib“链接失败问题
  8. CentOS 8 OpenSSL 问题表述与解决
  9. java面向切面编程
  10. Android Studio中javac不是内部命令或外部命令——错误大全