OpenCV 哈夫圆检测函数 HoughCircles():详细介绍及参数解释

OpenCV 的 HoughCircles() 函数是基于霍夫变换的圆形检测方法,它通过分析图像中的边缘像素来找到圆形。本篇文章将详细介绍该函数的原理、算法流程、参数解释以及代码示例,帮助您更好地理解并应用 HoughCircles() 函数。

1. 原理

哈夫圆检测是一种基于霍夫变换的圆形检测方法,它通过在二值图像中寻找圆形的边缘像素点,将这些点转换为参数空间中的圆心和半径,然后通过统计圆心和半径的投票数来确定最终的圆形。

2. 函数算法流程

  1. 对输入的二值图像进行边缘检测;
  2. 在边缘图像中寻找圆形的边缘像素点;
  3. 将边缘像素点转换为参数空间中的圆心和半径;
  4. 统计圆心和半径的投票数;
  5. 根据投票数确定最终的圆形。

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 中强大的圆形检测工具,能够有效地识别图像中的圆形。通过理解其原理、算法流程和参数解释,您能够更好地应用该函数来满足各种图像处理需求。

OpenCV 哈夫圆检测函数 HoughCircles():详细介绍及参数解释

原文地址: https://www.cveoy.top/t/topic/jFqk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录