霍夫变换检测圆的原理:
大家都知道三点可以确定一个圆, 以这三点做所有半径的圆则必有一个公共交点, 这个交点为以三点为圆的圆心.
霍夫变换检测圆形的原理跟检测直线的原理是一样的. 圆的表达式为 (x-a)2+(y-b)2=r2 ,
把问题转换成在求解经过像素点最多的 (a,b,r) 参数对.
常用检测圆的方法:(本文用的不是该方法)
参考链接: https://www.cnblogs.com/lancer2015/p/6852488.html
https://blog.csdn.net/poem_qianmo/article/details/26977557
代码如下:
- #include <opencv2/opencv.hpp>
- #include <iostream>
- #include <math.h>
- using namespace cv;
- using namespace std;
- int main(int argc, char** argv) {
- Mat src, dst;
- src = imread("L:/8.png");
- if (!src.data)
- {
- printf("could not load image...\n");
- return -1;
- }
- char INPUT_TITLE[] = "input image";
- char OUTPUT_TITLE[] = "hough circle demo";
- namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);
- namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);
- imshow(INPUT_TITLE, src);
- // 中值滤波
- Mat moutput;
- //GaussianBlur(src, moutput,Size(5,5),0,0);
- medianBlur(src, moutput, 3);
- cvtColor(moutput, moutput, CV_BGR2GRAY);
- // 霍夫圆检测
- vector<Vec3f>pcircles;
- HoughCircles(moutput,pcircles, CV_HOUGH_GRADIENT, 1, 10, 100, 30, 5, 50);
- src.copyTo(dst);
- for (size_t i = 0; i < pcircles.size(); i++)
- {
- Vec3f cc = pcircles[i];
- circle(dst, Point(cc[0], cc[1]), cc[2], Scalar(0, 0, 255), 1.5, LINE_AA);
- circle(dst, Point(cc[0], cc[1]), 2, Scalar(0, 255, 0), 2, LINE_AA);
- }
- imshow(OUTPUT_TITLE, dst);
- waitKey(0);
- return 0;
- }
实验结果:
原图 检测图:
来源: http://www.bubuko.com/infodetail-3189251.html