OpenCV 哈夫圆检测函数 HoughCircles():详细介绍及参数解释
OpenCV 哈夫圆检测函数 HoughCircles():详细介绍及参数解释
OpenCV 的 HoughCircles() 函数是基于霍夫变换的圆形检测方法,它通过分析图像中的边缘像素来找到圆形。本篇文章将详细介绍该函数的原理、算法流程、参数解释以及代码示例,帮助您更好地理解并应用 HoughCircles() 函数。
1. 原理
哈夫圆检测是一种基于霍夫变换的圆形检测方法,它通过在二值图像中寻找圆形的边缘像素点,将这些点转换为参数空间中的圆心和半径,然后通过统计圆心和半径的投票数来确定最终的圆形。
2. 函数算法流程
- 对输入的二值图像进行边缘检测;
- 在边缘图像中寻找圆形的边缘像素点;
- 将边缘像素点转换为参数空间中的圆心和半径;
- 统计圆心和半径的投票数;
- 根据投票数确定最终的圆形。
3. 函数输入的参数
HoughCircles(edges, circles, method, dp, minDist, param1, param2, minRadius, maxRadius);
edges: 输入的二值图像。circles: 输出的圆形向量,包含检测到的所有圆形的圆心坐标和半径。method: 检测方法,目前只支持HOUGH_GRADIENT。dp: 霍夫空间分辨率,一般为 1。minDist: 检测到的圆形之间的最小距离。param1: Canny 边缘检测的高阈值。param2: 圆心和半径的投票阈值,越大表示越严格。minRadius: 检测到的圆形的最小半径。maxRadius: 检测到的圆形的最大半径。
4. 举例子演示
下面是一个简单的例子,演示如何使用 HoughCircles() 函数检测一张图片中的圆形:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread('circle.jpg', IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Failed to load image!" << endl;
return -1;
}
vector<Vec3f> circles;
HoughCircles(img, circles, HOUGH_GRADIENT, 1, 20, 10, 24, 20, 100);
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle(img, center, radius, Scalar(255), 2, LINE_AA);
}
imshow("Circle Detection", img);
waitKey(0);
return 0;
}
在这个例子中,我们首先读取了一张灰度图像,然后调用 HoughCircles() 函数进行圆形检测。在函数的输入参数中,我们设置了霍夫空间分辨率为 1,检测到的圆形之间的最小距离为 20,Canny 边缘检测的高阈值为 10,圆心和半径的投票阈值为 24,检测到的圆形的最小半径为 20,最大半径为 100。函数的输出是一个包含检测到的所有圆形的圆心坐标和半径的向量 circles。
最后,我们遍历 circles 向量,将每个圆形画在原始图像上,并显示出来。
总结
HoughCircles() 函数是 OpenCV 中强大的圆形检测工具,能够有效地识别图像中的圆形。通过理解其原理、算法流程和参数解释,您能够更好地应用该函数来满足各种图像处理需求。
原文地址: https://www.cveoy.top/t/topic/jFqk 著作权归作者所有。请勿转载和采集!