OpenCV Hough Circle 变换原理与 C++ 实现详解
目标
在本教程中,您将学习如何:
- 理解霍夫圆变换(Hough Circle Transform)的基本原理。
- 使用 OpenCV 函数检测图像中的圆形物体。
- 掌握关键参数的调整策略以优化检测结果。
理论基础
霍夫圆变换概述
霍夫圆变换的工作方式与霍夫线变换类似,但更为复杂。在直线检测中,一条线由两个参数 (r, θ) 定义。而在圆的情况下,我们需要三个参数来定义一个圆:
$$C: (x_{center}, y_{center}, r)$$
其中 $(x_{center}, y_{center})$ 定义圆心位置,$r$ 是半径。这三个参数使我们能够完全定义一个圆。
为了提高效率,OpenCV 实现了一种比标准霍夫变换更高效的检测方法:霍夫梯度方法(Hough Gradient Method)。该方法由两个主要阶段组成:
- 第一阶段:涉及边缘检测和寻找可能的圆心。
- 第二阶段:为每个候选中心找到最佳半径。
算法流程
- 灰度化:将彩色图像转换为灰度图,减少计算量。
- 模糊处理:使用中值滤波或高斯滤波去除噪点,防止误检。
- 边缘检测:使用 Canny 算子提取边缘。
- 霍夫变换:在累加器空间中投票,寻找局部最大值作为圆心。
- 半径确定:根据边缘点的分布确定最佳半径。
- 结果绘制:在原图上标记检测到的圆心和圆周。
代码实现
以下示例展示了如何使用 C++ 和 OpenCV 实现霍夫圆变换。代码已修复原始版本中的语法错误并补充了必要的头文件。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 获取输入图像路径,默认使用测试图片
const char* filename = (argc >= 2) ? argv[1] : "circles.png";
Mat src = (filename);
(src.()) {
();
(, filename);
EXIT_FAILURE;
}
Mat gray;
(src, gray, COLOR_BGR2GRAY);
(gray, gray, );
vector<Vec3f> circles;
(gray, circles, HOUGH_GRADIENT, ,
gray.rows / ,
, , , );
( i = ; i < circles.(); i++) {
Vec3f c = circles[i];
Point center = (c[], c[]);
radius = c[];
(src, center, , (, , ), , LINE_AA);
(src, center, radius, (, , ), , LINE_AA);
}
(, src);
();
EXIT_SUCCESS;
}


