霍夫圆检测

Posted wangtianning1223

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了霍夫圆检测相关的知识,希望对你有一定的参考价值。

将空域点转化为极坐标,圆的极坐标表示如下

x=Rcosθ+a

y=Rsinθ+b

令xy已知,ab未知,则可以在原来的圆边界上上生成同样半径的圆

技术图片

 

这些圆的交点就是圆心,在极坐标中,圆心点的始终处于最大值就是霍夫曼检测的原理(圆心是相交最多次数的点)

代码演示

#include"pch.h"
#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char **argv)
{
    Mat src, dst;
    src = imread("2.jpg");
    if (!src.data)
    {
        printf("Error
");
        return -1;
    }

    char INPUT_TITLE[] = "input_image";
    char OUTPUT_TITLE[] = "hough_circle_demo";
    namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);
    namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);
    imshow(INPUT_TITLE, src);

    //中值滤波
    Mat mlf_opt;
    medianBlur(src, mlf_opt, 3);//ksize取3
    cvtColor(mlf_opt, mlf_opt, CV_BGR2GRAY);

    //霍夫圆检测
    vector<Vec3f> pcircles;//可能的圆心
    HoughCircles(mlf_opt, pcircles, CV_HOUGH_GRADIENT, 1, 10, 100, 35, 5, 50);
    cout << pcircles[1] << endl;
    src.copyTo(dst);
    for (size_t i = 0; i < pcircles.size(); ++i)
    {
        Vec3f cc = pcircles[i];
        circle(dst, Point(cc[0], cc[1]), cc[2], Scalar(0, 0, 255), 2, LINE_AA);
        circle(dst, Point(cc[0], cc[1]), 1, Scalar(198, 20, 255), 2, LINE_AA);

    }
    imshow(OUTPUT_TITLE, dst);
    waitKey(0);
    return 0;
}

技术图片

 

 技术图片

 

 

函数带有以下自变量:

  • src_gray: 输入图像 (灰度图)
  • circles: 存储下面三个参数: 技术图片 集合的容器来表示每个检测到的圆.
  • CV_HOUGH_GRADIENT: 指定检测方法. 现在OpenCV中只有霍夫梯度法
  • dp = 1: 累加器图像的反比分辨率
  • min_dist = src_gray.rows/10: 检测到圆心之间的最小距离
  • param_1 = 100: Canny边缘函数的高阈值
  • param_2 = 35: 圆心检测阈值.
  • min_radius = 5: 能检测到的最小圆半径, 默认为0.
  • max_radius = 50: 能检测到的最大圆半径, 默认为0

 circle打印圆,第一个打印边界,第二个打印圆心(半径调小)

以上是关于霍夫圆检测的主要内容,如果未能解决你的问题,请参考以下文章

霍夫圆没有检测到眼睛虹膜

霍夫圆检测

霍夫圆视频流检测调参软件

霍夫圆检测 opencv

Python Opencv使用霍夫圆变换从二进制图像中检测圆

使用 OpenCV(基于霍夫变换或其他特征)编写鲁棒的(颜色和大小不变)圆检测