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

58 篇文章 2 订阅

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

函数原型

void cv::HoughCircles(
    const cv::Mat& image,
    std::vector<cv::Vec3f>& circles,
    int method,
    double dp,
    double minDist,
    double param1,
    double param2,
    int minRadius = 0,
    int maxRadius = 0
);

参数说明

  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 检测图像中的圆,并在图像上绘制检测到的圆:

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat img = cv::imread("clock.jpg");
    if (img.empty()) {
        std::cerr << "Error: Image not found!" << std::endl;
        return -1;
    }

    cv::Mat gray;
    cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);

    // 预处理
    cv::Mat blurred;
    cv::GaussianBlur(gray, blurred, cv::Size(9, 9), 2, 2);
    cv::Mat edges;
    cv::Canny(blurred, edges, 50, 150);

    // 检测圆
    std::vector<cv::Vec3f> circles;
    cv::HoughCircles(edges, circles, cv::HOUGH_GRADIENT, 1, edges.rows / 8, 200, 100, 0, 0);

    // 绘制圆
    for (const auto& circle : circles) {
        cv::Point center(cvRound(circle[0]), cvRound(circle[1]));
        int radius = cvRound(circle[2]);

        // 绘制圆
        cv::circle(img, center, radius, cv::Scalar(0, 255, 0), 2);
        // 绘制圆心
        cv::circle(img, center, 3, cv::Scalar(0, 0, 255), -1);
    }

    // 显示结果
    cv::imshow("Detected Circles", img);
    cv::waitKey(0);

    return 0;
}

代码说明

  1. 图像读取和转换:

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

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

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

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

重要提示

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

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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值