当前位置:   article > 正文

用霍夫变换算法来识别图像中圆形的轮廓cv::HoughCircles

用霍夫变换算法来识别图像中圆形的轮廓cv::HoughCircles

cv::HoughCirclesOpenCV 中的一个函数,用于检测图像中的圆。它使用霍夫变换算法来识别图像中圆形的轮廓。以下是 cv::HoughCircles 的用法和详细解释。

函数原型

  1. void cv::HoughCircles(
  2. const cv::Mat& image,
  3. std::vector<cv::Vec3f>& circles,
  4. int method,
  5. double dp,
  6. double minDist,
  7. double param1,
  8. double param2,
  9. int minRadius = 0,
  10. int maxRadius = 0
  11. );

参数说明

  1. image:

    • 类型: const cv::Mat&
    • 说明: 输入图像,应该是经过边缘检测的灰度图像。cv::Canny 边缘检测器通常用于此目的。
  2. circles:

    • 类型: std::vector<cv::Vec3f>&
    • 说明: 输出参数,检测到的圆的信息将被存储在此向量中。每个 cv::Vec3f 包含三个值:xy 表示圆心的坐标,z 表示圆的半径。
  3. method:

    • 类型: int
    • 说明: 使用的圆检测方法,通常为 cv::HOUGH_GRADIENT。这是霍夫变换检测圆的常用方法。
  4. dp:

    • 类型: double
    • 说明: 累加器分辨率与图像分辨率的比例。dp 是一个正浮点数,通常设置为 1,即累加器和图像具有相同的分辨率。
  5. minDist:

    • 类型: double
    • 说明: 检测到的圆心之间的最小距离。如果检测到的圆心之间的距离小于此值,可能会被认为是相同的圆。此值可以根据实际情况调整,以避免检测到重叠的圆。
  6. param1:

    • 类型: double
    • 说明: 传递给边缘检测器的参数(如 Canny 边缘检测的高阈值)。这个参数通常设置为 50。
  7. param2:

    • 类型: double
    • 说明: 圆检测的累加器阈值。值越小,检测到的圆越多。值越大,检测到的圆越少,但精确度可能更高。通常设置为 30。
  8. minRadius:

    • 类型: int(可选)
    • 说明: 检测圆的最小半径。设置为 0 表示不限制最小半径。
  9. maxRadius:

    • 类型: int(可选)
    • 说明: 检测圆的最大半径。设置为 0 表示不限制最大半径。

示例代码

以下是一个完整的 C++ 示例,演示如何使用 cv::HoughCircles 检测图像中的圆,并在图像上绘制检测到的圆:

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. int main() {
  4. // 读取图像
  5. cv::Mat img = cv::imread("clock.jpg");
  6. if (img.empty()) {
  7. std::cerr << "Error: Image not found!" << std::endl;
  8. return -1;
  9. }
  10. cv::Mat gray;
  11. cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
  12. // 预处理
  13. cv::Mat blurred;
  14. cv::GaussianBlur(gray, blurred, cv::Size(9, 9), 2, 2);
  15. cv::Mat edges;
  16. cv::Canny(blurred, edges, 50, 150);
  17. // 检测圆
  18. std::vector<cv::Vec3f> circles;
  19. cv::HoughCircles(edges, circles, cv::HOUGH_GRADIENT, 1, edges.rows / 8, 200, 100, 0, 0);
  20. // 绘制圆
  21. for (const auto& circle : circles) {
  22. cv::Point center(cvRound(circle[0]), cvRound(circle[1]));
  23. int radius = cvRound(circle[2]);
  24. // 绘制圆
  25. cv::circle(img, center, radius, cv::Scalar(0, 255, 0), 2);
  26. // 绘制圆心
  27. cv::circle(img, center, 3, cv::Scalar(0, 0, 255), -1);
  28. }
  29. // 显示结果
  30. cv::imshow("Detected Circles", img);
  31. cv::waitKey(0);
  32. return 0;
  33. }

代码说明

  1. 图像读取和转换:

    • 读取图像并将其转换为灰度图像。
  2. 预处理:

    • 使用高斯滤波去噪。
    • 使用 Canny 边缘检测器提取边缘。
  3. 圆检测:

    • 使用 cv::HoughCircles 检测圆。
  4. 绘制和显示结果:

    • 在图像上绘制检测到的圆和圆心,并显示图像。

重要提示

  • 参数调整: cv::HoughCircles 的参数值可能需要根据具体的应用场景进行调整,以获得最佳的检测效果。
  • 预处理: 合适的预处理步骤(如高斯滤波和边缘检测)对提高圆检测的准确性至关重要。
  • 性能: 对于高分辨率图像或多个圆的场景,可能需要调整参数或优化算法以提高检测性能和精度。

通过掌握 cv::HoughCircles 的使用方法,可以有效地在图像中检测圆形对象,适用于许多计算机视觉和图像处理应用。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/970309
推荐阅读
相关标签
  

闽ICP备14008679号