OpenCV——霍夫变换圆检测

这篇具有很好参考价值的文章主要介绍了OpenCV——霍夫变换圆检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、主要函数

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

   HoughCircles该函数使用霍夫变换在灰度图像中查找圆。

  • image:输入图像,需要为 8 位的灰度单通道图像。
  • circle:找到的圆的输出向量。每个向量被编码为3或4个元素的浮点型向量 ( x , y , r a d i u s ) (x, y, radius) (x,y,radius) ( x , y , r a d i u s , v o t e s ) (x, y, radius, votes) (x,y,radius,votes)
  • method:检测方法,参见HoughModes。可用的方法是HOUGH_GRADIENTHOUGH_GRADIENT_ALT
  • dp:累加器分辨率与图像分辨率的反比。当Dp =1时,累加器与输入图像具有相同的分辨率。如果dp=2,累加器的宽度和高度减半。HOUGH_GRADIENT_ALT方法的推荐值是dp=1.5,除非需要检测一些非常小的圆。
  • minDist:两个圆心之间的最小距离。若两圆心距离 < minDist,则认为是同一个圆。如果参数太小,可能会在检测到一个真实的圆的同时,检测到多个邻居圆。如果太大,可能会漏掉一些圆圈。
  • param1:第一个method-specific参数。对于HOUGH_GRADIENTHOUGH_GRADIENT_ALT,它是传递给Canny边缘检测器的两个阈值中较高的阈值(较低的阈值小两倍)。注意,HOUGH_GRADIENT_ALT使用Scharr算法来计算图像的导数,所以阈值通常应较高,如300或正常曝光和对比图像。
  • param2:第二个method-specific参数。对于HOUGH_GRADIENT,它是圆的累加器阈值在检测阶段居中。它越小,越多可能会检测到假圈。对应于较大累加器值的圆将为返回第一个。在HOUGH_GRADIENT_ALT算法的情况下,这是圆的“完美”度量。它越接近1,算法选择的圆形状越好。在大多数情况下,0.9应该就可以了。如果你想更好地检测小圆,你可以把它降低到0.85,0.8甚至更少。但也要尽量限制搜索范围在[minRadius, maxRadius],以避免出现许多错误的圆圈。
  • minRadius:圆半径的最小值。
  • maxRadius:圆半径的最大值。如果<= 0,则使用最大图像尺寸。如果< 0,则返回的结果中:HOUGH_GRADIENT求圆心而不求半径。HOUGH_GRADIENT_ALT计算圆的半径和圆心。

二、C++代码

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

using namespace std;

int main(int argc, char** argv) 
{
	// ----------------------读取数据---------------------------
	cv::Mat src = cv::imread("圆.jpg");
	if (src.empty()) 
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	cv::namedWindow("Circle", cv::WINDOW_AUTOSIZE);
	imshow("Circle", src);
	// ---------------------转灰度图----------------------------
	cv::Mat grayImg;
	cv::cvtColor(src, grayImg, cv::COLOR_BGR2GRAY);
	vector<cv::Vec3f>circles;
	int hough_value = 60;
	// --------------------霍夫圆检测---------------------------
	cv::HoughCircles(grayImg, circles, cv::HOUGH_GRADIENT, 1, 15, 100, hough_value, 15, 100);
	cv::Mat houghcircle = src.clone();
	for (int i = 0; i < circles.size(); ++i) 
	{
		circle(houghcircle, cv::Point(circles[i][0], circles[i][1]), circles[i][2], cv::Scalar(0, 0, 255), 2);
	}
	imwrite("houghcircle.jpg", houghcircle);
	imshow("houghcircle", houghcircle);
	cv::waitKey(0);
	return 0;
}

三、python代码

import cv2


# -------------------------读取数据----------------------------
img = cv2.imread('circle.jpg')
# ------------------------转为灰度图---------------------------
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# ------------------------霍夫圆检测-----------------------
circles = cv2.HoughCircles(gray_img, cv2.HOUGH_GRADIENT, 1, 15, param1=100, param2=80, minRadius=15, maxRadius=100)

for i in circles[0]:
    img = cv2.circle(img, (i[0], i[1]), int(i[2]), (0, 0, 255), 3)
cv2.imshow('circle', img)
cv2.waitKey(0)

四、结果展示

1、原始图像

opencv霍夫圆检测,OpenCV 图像/点云处理,opencv,计算机视觉,人工智能,c++,python

2、检测结果

opencv霍夫圆检测,OpenCV 图像/点云处理,opencv,计算机视觉,人工智能,c++,python

五、参考链接

[1] Opencv霍夫变换圆检测实战之检测硬币(C++)
[2] 霍夫变换检测圆形 -opencv文章来源地址https://www.toymoban.com/news/detail-646821.html

到了这里,关于OpenCV——霍夫变换圆检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV | 霍夫变换:以车道线检测为例

    霍夫变换 霍夫变换只能灰度图,彩色图会报错 lines = cv2.HoughLinesP(edge_img,1,np.pi/180,15,minLineLength=40,maxLineGap=20) 参数1:要检测的图片矩阵 参数2:距离r的精度,值越大,考虑越多的线 参数3:距离theta的精度,值越大,考虑越多的线 参数4:累加数阈值,值越小,考虑越多的线

    2024年02月04日
    浏览(28)
  • 霍夫变换直线检测算法实现OpenCV(C++)

    一、原理 对于霍夫变换的原理这里就不进行描述啦,感兴趣的可以自行搜索。也可以看知乎上面的这篇贴文通俗易懂理解——霍夫变换原理。 二、算法代码 三、效果测试 测试代码 上述代码中的drawLine()函数是《OpenCV4快速入门》一书的代码清单 7-2中的原函数,只用于画线。

    2024年02月05日
    浏览(34)
  • 计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

    1、显示图像 ①功能:在指定窗口中显示图像。 ②参数: name 为窗口的名字; image 为待显示的图像。 ③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。 2、读入图像 ①功能:从指定文件读入图像。 ②参数: filename 为图像文件名,支持BMP、

    2024年02月03日
    浏览(37)
  • OpenCV26HoughCircles 霍夫圆变换原理及圆检测

    霍夫圆变换的基本原理与霍夫线变换大体类似 对直线来说,一条直线能由极径极角(r,θ)表示,而对于圆来说,我们需要三个参数:圆心(a,b),半径 r 笛卡尔坐标系中圆的方程为: (x-a)2 + (y-b)2 = r2 化简便可得到: a = x - r·cosθ b = y - r·sinθ 对于(x0,y0),我们可以将通

    2024年02月03日
    浏览(30)
  • 霍夫变换椭圆检测(matlab仿真与图像处理系列第2期)

    椭圆检测是图像处理中的一个重要问题,其目的是从图像中检测出可能存在的椭圆。在实际的应用中,椭圆常常被用来描述物体的形状或者得到物体的尺寸信息。 传统的椭圆检测方法通常采用二维Hough变换,在求解过程中需要处理大量的数据,并且计算复杂度高,导致速度较

    2024年02月11日
    浏览(32)
  • 基于 OpenCV 的车辆变道检测,计算机视觉+图像处理技术

    本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用 OpenCV 的 haar 级联文件可以检测到面部、眼睛等,但是如果目标是汽车,公共汽车呢? 01. 数据集 我们将道路上汽车的视频文件用作数据

    2024年01月25日
    浏览(50)
  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(45)
  • 【OpenCV-Python】——边缘和轮廓&Laplacian/Sobel/Canny边缘检测&查找/绘制轮廓及轮廓特征&霍夫直线/圆变换

    目录 前言: 1、边缘检测 1.1 Laplacian边缘检测  1.2 Sobel边缘检测  1.3 Canny边缘检测 2、图像轮廓 2.1 查找轮廓  2.2 绘制轮廓 2.3 轮廓特征 3、霍夫变换 3.1 霍夫直线变换  3.2 霍夫圆变换 总结: 图像的边缘是指图像中灰度值急剧变化的位置,边缘检测的目的是为了绘制边缘线条。

    2024年01月23日
    浏览(39)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(48)
  • OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

    为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。 图像缩放函数,用于把图像按指定的尺寸放大或缩小。 dst = cv2.resize(src, dsize, fx, fy, interpolation) dst = 生成的目的图像 src:需要变换的原图像 disize:(x, y)需要

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包