霍夫变换圆形检测
霍夫变换检测圆的原理:
大家都知道三点可以确定一个圆,以这三点做所有半径的圆则必有一个公共交点,这个交点为以三点为圆的圆心。
霍夫变换检测圆形的原理跟检测直线的原理是一样的。圆的表达式为 (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); //画圆形
//参数:1.要画的图像 2.圆心 3.半径 4.颜色 5.线的粗细 6.线条类型 circle(dst, Point(cc[0], cc[1]), 2, Scalar(0, 255, 0), 2, LINE_AA); //画圆心 } imshow(OUTPUT_TITLE, dst); waitKey(0); return 0; }
实验结果:
原图 检测图: