【opencv】圆检测(非hough)
来源:互联网 发布:餐厅门店经营数据 编辑:程序博客网 时间:2024/04/30 13:20
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);}
结果图
阅读全文
0 0
- 【opencv】圆检测(非hough)
- OpenCV学习之Hough变换检测圆
- 【OpenCV】Hough检测
- OpenCV 第六章 Hough 直线检测、圆检测
- OpenCV中Hough直线检测和圆检测
- Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)
- Opencv图像识别从零到精通(22)-----hough变换检测直线与圆
- OpenCV函数cvHoughCircles根据Hough变换检测圆
- python opencv -详解hough变换检测直线与圆
- OpenCV自学笔记5:Hough变换检测直线和圆
- OpenCV自学笔记27. Hough变换:检测直线和圆
- OpenCV的霍夫变换(Hough Transform)圆检测
- 【OpenCV图像处理】二十四、霍夫(Hough)检测
- ITK 圆检测(Hough circle)
- hough圆检测
- HOUGH变换检测圆
- Hough变换检测圆
- Hough变换检测圆
- Spring Boot干货:静态资源和拦截器处理
- Java概述
- 利用python循环创建多个文件
- IO流小品
- js--排序算法--冒泡算法
- 【opencv】圆检测(非hough)
- 第四周 【项目3
- 【codevs 1074】食物链
- Redis学习-数据持久化
- Slave_IO_Running: No 解决方法
- 自定义部分圆角的实现
- 设计模式六大原则
- TCP/IP学习笔记(1)——基本概念
- android返回键不销毁活动