75.霍夫圆检测

目录

        1 概念讲解及用处

        2 霍夫圆检测原理

         3 霍夫直线检测步骤

        4 API详解

        5 用C++编写代码进行实现

        1 概念讲解及用处

        圆检测是计算机视觉领域中的一项重要任务,它用于在图像或视频中检测和定位圆形对象。在很多应用中,圆检测可以用来识别或跟踪物体,例如工业自动化、目标识别、机器人导航等。

        霍夫圆检测(Hough Circle Detection)是一种图像处理算法,用于在给定图像中检测和定位圆形目标。它是基于霍夫变换的扩展,通过在参数空间中进行累加来寻找圆形轮廓。

        霍夫圆检测的核心思想是将圆形表示为参数空间中的一个曲线,并通过累加器数组来记录曲线与图像中边缘点的交叉情况。当某个参数组合的累加值超过预设阈值时,就认为该参数组合对应的圆存在于图像中。

        2 霍夫圆检测原理

        我们都知道在直角坐标系中,对于圆我们可以用解析式来表示。

(x-a)^2+(y-b)^2 = R^2

其中,a是圆心的x坐标,b是圆心的y坐标,R是圆的半径;

        现在我们假设圆上的三点A(x0,y0)、B(x1,y1),c(x2,y2)。 根据直角坐标与极坐标的转换关系:

\left\{\begin{matrix} x = a + Rcos\Theta \\ y=b+Rsin\Theta \end{matrix}\right.

由此我们可以得到关于a,b和R的表达式:

x0 =a + Rcos\Theta ,y0=b+Rsin\Theta \\ x1 =a + Rcos\Theta ,y1=b+Rsin\Theta \\ x2 =a + Rcos\Theta ,y2=b+Rsin\Theta

        由此我们可以得出: 直角坐标系中圆上的三个点,在极坐标中也是三个点,但是以这三个点为圆心,以R为半径,这三个圆将交于一点,该点就是要检测的圆的圆心点。

        进而更近一步,直角坐标系中圆上任意个点(>3),在极坐标中,以这些点为圆心,以半径R画圆,这些圆将交于一点,该点就是要检测的圆的圆心点。

         3 霍夫直线检测步骤

具体来说,霍夫圆检测的步骤如下:

  1. 边缘检测:首先,需要对输入图像进行边缘检测,以便找到潜在的圆形轮廓。常用的边缘检测算法包括Canny边缘检测。

  2. 参数空间定义:在霍夫圆检测中,使用三个参数来表示圆形:圆心坐标 (a, b) 和半径 r。为了确定这些参数的范围,需要定义一个参数空间,通常可以根据图像大小和目标尺寸进行设置。

  3. 累加器初始化:创建一个累加器数组,大小与参数空间相匹配,并初始化为零。

  4. 参数空间遍历:对于每个边缘点,计算其对应的圆心坐标和半径,并在累加器数组中对应位置进行累加。这一步骤需要遍历参数空间中所有可能的参数组合。

  5. 阈值检测:当累加器数组中某个位置的累加值超过设定的阈值时,认为对应的圆存在于图像中。

  6. 圆形细化:为了提高检测结果的准确性,可以进行圆形细化操作,例如非最大抑制,以消除重叠或相似的圆。

  7. 输出结果:最后,将检测到的圆形轮廓输出或在原始图像上进行绘制,以便可视化或进一步处理。

        4 API详解

        OpenCV提供了函数来实现圆检测,其中最常用的是HoughCircles函数。以下是HoughCircles函数的详细介绍:

void HoughCircles( InputArray image, OutputArray circles, int method, 
double dp, double minDist, double param1 = 100, double param2 = 100, 
int minRadius = 0, int maxRadius = 0 );

参数说明:

image:输入的单通道灰度图像。
circles:输出参数,包含检测到的圆的圆心坐标和半径。
method:定义霍夫变换方法,一般使用CV_HOUGH_GRADIENT。
dp:候选圆心之间的累加器分辨率的倒数。dp越小,累加器数组的尺寸越大。
minDist:检测到的圆之间的最小距离。如果设置为负值,则函数会自动根据图像尺寸计算最小距离。
param1:第一个阈值用于边缘检测。默认值为100。
param2:第二个阈值用于确定圆心的累加器阈值。默认值为100。
minRadius:检测到的圆的最小半径。默认值为0。
maxRadius:检测到的圆的最大半径。默认值为0,表示没有限制。

        HoughCircles函数基于霍夫变换的原理,通过在参数空间中进行累加来寻找圆形轮廓。它会返回一个包含所有检测到的圆的矢量,每个圆由三个值表示:圆心坐标 (x, y) 和半径 r。

        使用HoughCircles函数时,可以根据具体需求调整参数,例如设置适当的阈值、最小距离和半径范围,以获得更准确的圆检测结果。

        5 用C++编写代码进行实现

        下面是使用OpenCV和C++实现圆检测的示例代码:

#include <opencv2/opencv.hpp>

int main()
{
    cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
    cv::GaussianBlur(image, image, cv::Size(5, 5), 2, 2); // 对图像进行高斯模糊

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

    for (size_t i = 0; i < circles.size(); i++)
    {
        cv::Vec3i c = circles[i];
        cv::Point center = cv::Point(c[0], c[1]);
        int radius = c[2];

        // 在图像上绘制检测到的圆
        cv::circle(image, center, radius, cv::Scalar(0, 255, 0), 2);
    }

    cv::imshow("Circle Detection", image);
    cv::waitKey(0);

    return 0;
}

 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
import cv2 as cv import numpy as np def hough_circle(image): #因为霍夫检测对噪声很明显,所以需要先滤波一下。 dst =cv.pyrMeanShiftFiltering(image,10,100) cimage=cv.cvtColor(dst,cv.COLOR_BGR2GRAY) circles = cv.HoughCircles(cimage,cv.HOUGH_GRADIENT,1,40,param1=40,param2=29,minRadius=30,maxRadius=0) #把circles包含的圆心和半径的值变为整数 circles = np.uint16(np.around(circles)) for i in circles[0]: cv.circle(image,(i[0],i[1]),i[2],(0,255,0),3) cv.imshow("circle",image) src = cv.imread("E:/opencv/picture/coins.jpg") cv.imshow("inital_window",src) hough_circle(src) cv.waitKey(0) cv.destroyAllWindows() 霍夫圆变换的基本思路是认为图像上每一个非零像素点都有可能是一个潜在的圆上的一点, 跟霍夫线变换一样,也是通过投票,生成累积坐标平面,设置一个累积权重来定位圆。 在笛卡尔坐标系中圆的方程为: 其中(a,b)是圆心,r是半径,也可以表述为: 即 在笛卡尔的xy坐标系中经过某一点的所有圆映射到abr坐标系中就是一条三维的曲线: 经过xy坐标系中所有的非零像素点的所有圆就构成了abr坐标系中很多条三维的曲线。 在xy坐标系中同一个圆上的所有点的圆方程是一样的,它们映射到abr坐标系中的是同一个点,所以在abr坐标系中该点就应该有圆的总像素N0个曲线相交。 通过判断abr中每一点的相交(累积)数量,大于一定阈值的点就认为是圆。 以上是标准霍夫圆变换实现算法。 问题是它的累加到一个三维的空间,意味着比霍夫线变换需要更多的计算消耗。 Opencv霍夫圆变换对标准霍夫圆变换做了运算上的优化。 它采用的是“霍夫梯度法”。它的检测思路是去遍历累加所有非零点对应的圆心,对圆心进行考量。 如何定位圆心呢?圆心一定是在圆上的每个点的模向量上,即在垂直于该点并且经过该点的切线的垂直线上,这些圆上的模向量的交点就是圆心。 霍夫梯度法就是要去查找这些圆心,根据该“圆心”上模向量相交数量的多少,根据阈值进行最终的判断。 bilibili: 注意: 1.OpenCV霍夫圆变换函数原型为:HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles image参数表示8位单通道灰度输入图像矩阵。 method参数表示圆检测方法,目前唯一实现的方法是HOUGH_GRADIENT。 dp参数表示累加器与原始图像相比的分辨率的反比参数。例如,如果dp = 1,则累加器具有与输入图像相同的分辨率。如果dp=2,累加器分辨率是元素图像的一半,宽度和高度也缩减为原来的一半。 minDist参数表示检测到的两个圆心之间的最小距离。如果参数太小,除了真实的一个圆圈之外,可能错误地检测到多个相邻的圆圈。如果太大,可能会遗漏一些圆圈。 circles参数表示检测到的圆的输出向量,向量内第一个元素是圆的横坐标,第二个是纵坐标,第三个是半径大小。 param1参数表示Canny边缘检测的高阈值,低阈值会被自动置为高阈值的一半。 param2参数表示圆心检测的累加阈值,参数值越小,可以检测越多的假圆圈,但返回的是与较大累加器值对应的圆圈。 minRadius参数表示检测到的圆的最小半径。 maxRadius参数表示检测到的圆的最大半径。 2.OpenCV画圆的circle函数原型:circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img img参数表示源图像。 center参数表示圆心坐标。 radius参数表示圆的半径。 color参数表示设定圆的颜色。 thickness参数:如果是正数,表示圆轮廓的粗细程度。如果是负数,表示要绘制实心圆。 lineType参数表示圆线条的类型。 shift参数表示圆心坐标和半径值中的小数位数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别叭叭儿—好好学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值