1. 霍夫圆检测原理简介
- 从平面坐标到极坐标转换三个参数:圆心坐标和半径。
- 假设平面坐标的任意一个圆上的点C,转换到极坐标中,在点C处有最大值,霍夫变换正是利用这个原理实现圆的检测。
- (a, b)为圆心坐标
2. 相关API
2.1.cv::HoughCircles()
- 因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤波,也可用高斯滤波,视噪声类型而定,具体可见图像模糊。
- 基于效率考虑,Opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为两步:
- 检测边缘,发现可能的圆心
- 基于第一步的基础上从候选圆心开始计算最佳半径大小
HoughCircles(
InputArray image, // 输入图像 ,必须是8位的单通道灰度图像
OutputArray circles, // 输出结果,发现的圆信息
Int method, // 方法 - HOUGH_GRADIENT
Double dp, // 分辨率的反比,比例变换,保持不变设为1。
Double mindist, // 10 最短距离-可以分辨是两个圆的,否则认为是同心圆- src_gray.rows/8
Double param1, // 内部Canny边缘检测器的上限阈值。
Double param2, // 中心点累加器阈值 – 候选圆心
Int minradius, // 最小半径
Int maxradius//最大半径
)
3. 例程
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
Mat dst, src;
src = imread("D:/resource/images/圆检测.jpg");
if (!src.data) printf("the image couldn't be loaded....");
imshow("input", src);
Mat Gray;
cvtColor(src, Gray, COLOR_BGR2GRAY);
Mat GBlurred;
GaussianBlur(Gray, GBlurred, Size(3, 3), 0);
vector<Vec3f> Circles;
HoughCircles(GBlurred, Circles, HOUGH_GRADIENT, 1, 10, 100, 30, 15, 50);
cvtColor(GBlurred, dst, COLOR_GRAY2BGR);
for (size_t i = 0; i < Circles.size(); i++)
{
Vec3f c3 = Circles[i];
//画圆
circle(dst, Point(c3[0], c3[1]), c3[2], Scalar(0, 0, 255), 2, LINE_AA);
//标注圆心
circle(dst, Point(c3[0], c3[1]), 2, Scalar(0, 255, 255), 2, LINE_AA);
}
imshow("output", dst);
waitKey(0);
return 1;
}