【opencv】圆检测(非hough)
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)相关推荐
- OpenCV——圆检测
使用cv2.HoughCircles()函数进行圆检测. 函数原型:cv2.HoughCircles(image,method,dp,minDist[, circles[,param1, param2 ...
- QT+opencv学习笔记(5)——霍夫直线检测、圆检测及椭圆检测
开发环境为:win10+QT5.8+opencv3.2 Hough变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛.最基本的Hough变换是从黑白图像中检测直线,还可以经过改进检测圆.椭 ...
- opencv使用霍夫圆算法HoughCircles进行圆检测
原理介绍: opencv -- HoughCircles 霍夫圆变换原理及圆检测 霍夫变换(Hough Transform) 霍夫变换 - 圆检测 (Hough Circle transform) 霍 ...
- 基于C++OpenCV实现的直线检测、圆检测
资源下载地址:https://download.csdn.net/download/sheziqiong/85627479 实验内容和要求 输入一张彩色图像,要求能够检测出其中的直线.圆. 实验器材 ...
- 使用Python,OpenCV和Hough圆检测图像中的圆
使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...
- 【opencv学习】【hough圆检测】
import cv2 import numpy as np# 圆的检测原理 # 霍夫梯度法:先确定圆心,再确定半径 # 把原图做一次 Canny 边缘检测,得到边缘检测的二值图. # 圆的边缘点切线的 ...
- Python+OpenCV:Hough圆检测(Hough Circle Transform)
Python+OpenCV:Hough圆检测(Hough Circle Transform) ##################################################### ...
- opencv进阶学习笔记11:cannny边缘检测,直线检测,圆检测
基础版笔记传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) cannny边缘检测 基础版边 ...
- OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测
基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...
最新文章
- 摄像头和相机模型和内参原理
- 基于deep learning的快速图像检索系统
- 为什么手机上传图片这么慢 前端_怎样在手机上就能把图片压缩到100K以下?
- JAVA——声明包类的编译与运行解决方案
- mysql表损坏监控_监控mysql启动情况并检测表错误修复
- 统一配置数据库连接符的方法
- go map数据结构
- 项目:NMEA2000的数据格式解析
- c语言字体属性,【C】 5_变量属性
- CodeFirst的EF6迁移和时间戳错误
- 如何让程序集在每次编译时自动产生不同的版本号
- Qt Model/View/Delegate浅谈 - QAbstractListModel
- mac显示网速_Mac系统怎么查看测试网速
- 全网首发:TeaVM编译时容易出错的几种代码
- java解析获得birt报表的数据_java pojo实体类做birt报表数据源
- 基于Java的2048小游戏设计
- Lectra力克公司发布新战略 助力客户打造“工业4.0”智造流程
- About Oracle TraceFile
- postgresql 转 mysql_PostgreSQL转换为Mysql
- python运行代码无反应_linux执行python命令后没有反应,不打印日志信息
热门文章
- 逻辑电平、噪声容限、串行通信
- 百度前200页部分答案(初稿)
- 2020 Web技术应用基础 (第3版) 期末重点 【整理】 (必考题)
- 美女图片整站源码 wordpress主题多功能CX-UDY图片主题下载 带会员积分系统
- ]视音频编解码技术零基础学习方法
- real解码器 v2015.08
- 解决“libboost_regex-vc120-mt-gd-1_59.lib“链接失败问题
- CentOS 8 OpenSSL 问题表述与解决
- java面向切面编程
- Android Studio中javac不是内部命令或外部命令——错误大全