OpenCV霍夫圆变换cv2.HoughCircles()

目录
  • 1. 效果图
  • 2. 源码
  • 参考

这篇博客将学习如何使用霍夫圆变换在图像中找到圆圈,OpenCV使用cv2.HoughCircles()实现霍夫圆变换。

circles = cv2.HoughCircles(img,
cv2.HOUGH_GRADIENT, 1, 20,
param1=50, param2=40, minRadius=25, maxRadius=0)

img: 待检测的灰度图cv2.HOUGH_GRADIENT:检测的方法,霍夫梯度1:检测的圆与原始图像具有相同的大小,dp=2,检测的圆是原始图像的一半20:检测到的相邻圆的中心的最小距离(如果参数太小,除了一个真实的圆外,还可能会错误地检测到多个相邻圆。如果太大,可能会漏掉一些圆。)param1:在#HOUGHŠu梯度的情况下,它是较高的. 两个阈值传递到Canny边缘检测器(较低的一个小两倍)。param2:在#HOUGHŠu梯度的情况下,它是检测阶段圆心的累加器阈值。它越小,就越可能检测到假圆;minRadius:最小圆半径maxRadius:最大圆半径,如果<=0,则使用最大图像尺寸。如果<0,则返回没有找到半径的中心。

1. 效果图

原始图 VS 检测圆效果图如下:

如下右图可以看到3个外侧圆绿色,圆心红色被成功检测到;

圆的最小半径设置由25调整为10,也可能会错误的检测到圆,效果图如下:

检测圆半径的阈值(param2设置35)的结果,最小圆半径设置10,也可能会错误的检测到圆,效果图如下:

2. 源码

# 霍夫圆检测

import cv2
import numpy as np

cimg = cv2.imread('opencv_logo_350.jpg')
cv2.imshow("origin", cimg)
cv2.waitKey(0)
img = cv2.cvtColor(cimg,cv2.COLOR_BGR2GRAY)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

# - img: 待检测的灰度图
# - cv2.HOUGH_GRADIENT:检测的方法,霍夫梯度
# - 1:检测的圆与原始图像具有相同的大小,dp=2,检测的圆是原始图像的一半
# - 20:检测到的圆的中心的最小距离(如果参数为太小,除了一个真实的圆外,还可能会错误地检测到多个相邻圆。如果太大,可能会漏掉一些圆。)
# - param1:在#HOUGHŠu梯度的情况下,它是较高的. 两个阈值传递到Canny边缘检测器(较低的一个小两倍)。
# - param2:在#HOUGHŠu梯度的情况下,它是检测阶段圆心的累加器阈值。它越小,就越可能检测到假圆;
# - minRadius:最小圆半径,也可能会检测到假圆
# - maxRadius:最大圆半径,如果<=0,则使用最大图像尺寸。如果<0,则返回没有找到半径的中心。
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
                           param1=50, param2=40, minRadius=0, maxRadius=0)
# 最小圆半径设置不合适,也可能会检测到假圆
# circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
#                            param1=50, param2=40, minRadius=0, maxRadius=0)
# circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
#                            param1=50, param2=30, minRadius=10, maxRadius=0)

circles = np.uint16(np.around(circles))

print(len(circles))
print(circles)
for i in circles[0, :]:
    # 绘制外圈圆(蓝色)
    cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)

    # 绘制圆心(红色)
    cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)

cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

参考

https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html#hough-circles

到此这篇关于OpenCV霍夫圆变换cv2.HoughCircles()的文章就介绍到这了,更多相关OpenCV霍夫圆变换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv3/C++实现霍夫圆/直线检测

    霍夫直线检测 参数说明: cv::HoughLinesP( InputArray src, // 输入图像(8位灰度图像) OutputArray lines, // 输出直线两点坐标(vector<Vec4i>) double rho, // 生成极坐标时候的像素扫描步长 double theta, //生成极坐标时候的角度步长(一般取CV_PI/180) int threshold, // 累加器阈值,获得足够交点的极坐标点才被看成是直线 double minLineLength=0;//

  • OpenCV霍夫圆变换cv2.HoughCircles()

    目录 1. 效果图 2. 源码 参考 这篇博客将学习如何使用霍夫圆变换在图像中找到圆圈,OpenCV使用cv2.HoughCircles()实现霍夫圆变换. circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=40, minRadius=25, maxRadius=0) img: 待检测的灰度图cv2.HOUGH_GRADIENT:检测的方法,霍夫梯度1:检测的圆与原始图像具有相同的大小,dp=

  • C++ opencv霍夫圆检测使用案例详解

    本程序是一个最简单的霍夫圆检测函数的使用案例,刚刚学会的用法,发一下,可以参考,参数啥的可根据图片调节. #pragma once #include<quickopencv.h> #include<vector> #include <stdio.h> #include <iostream> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgpr

  • Python OpenCV基于霍夫圈变换算法检测图像中的圆形

    目录 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + opencv 完整检测代码 ① 源代码 ② 运行效果图 第一章:霍夫变换检测圆 ① 实例演示1 这个是设定半径范围 0-50 后的效果. ② 实例演示2 这个是设定半径范围 50-70 后的效果,因为原图稍微大一点,半径也大了一些. ③ 霍夫变换函数解析 cv.HoughCircles() 方法 参数分别为:image.method.dp.minDist.param1.param2.mi

  • Python实现霍夫圆和椭圆变换代码详解

    在极坐标中,圆的表示方式为: x=x0+rcosθ y=y0+rsinθ 圆心为(x0,y0),r为半径,θ为旋转度数,值范围为0-359 如果给定圆心点和半径,则其它点是否在圆上,我们就能检测出来了.在图像中,我们将每个非0像素点作为圆心点,以一定的半径进行检测,如果有一个点在圆上,我们就对这个圆心累加一次.如果检测到一个圆,那么这个圆心点就累加到最大,成为峰值.因此,在检测结果中,一个峰值点,就对应一个圆心点. 霍夫圆检测的函数: skimage.transform.hough_circle

  • python 用opencv实现霍夫线变换

    霍夫变换是一种检测任何形状的流行技术,可以检测形状,即使它被破坏或扭曲一点点. 一条线可以表示成y = mx + c或参数形式,像ρ=xcosθ+ysinθ,其中ρ是从原点到直线的垂直距离,θ角是由这条垂线和水平轴以逆时针的方向形成的(这个方向取决于你如何表示坐标系统,这种表示法在OpenCV中使用) OpenCV中的Hough变换 cv.HoughLines() 第一个参数,输入图像应该是一个二值图像,因此在应用hough变换之前应用阈值或使用Canny边缘检测. 第二和第三个参数分别是ρ和θ

  • Opencv检测多个圆形(霍夫圆检测,轮廓面积筛选)

    主要是利用霍夫圆检测.面积筛选等完成多个圆形检测,具体代码及结果如下. 第一部分是头文件(common.h): #pragma once #include<opencv2/opencv.hpp> #include<opencv2/highgui.hpp> #include<iostream> using namespace std; using namespace cv; extern Mat src; void imageBasicInformation(Mat&am

  • Android基于OpenCV实现霍夫直线检测

    目录 霍夫直线检测 点和线的对偶性 极坐标参数方程 API 操作 效果 霍夫直线检测 点和线的对偶性 图像空间中的点,对应霍夫空间中的直线 图像空间中的直线,对应霍夫空间中的点 共点的直线,在霍夫空间中对应的点在一条直线上 共线的点,在霍夫空间中对应的直线交于一点 极坐标参数方程 对于平面中的一条直线,在笛卡尔坐标中,常见的有点斜式,两点式两种表示方法.然而在霍夫变换中,考虑的是另外一种表示方式:使用(r, theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的

  • Python数字图像处理之霍夫线变换实现详解

    在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线.圆.椭圆等. 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换. 对于平面中的一条直线,在笛卡尔坐标系中,可用y=mx+b来表示,其中m为斜率,b为截距.但是如果直线是一条垂直线,则m为无穷大,所有通常我们在另一坐标系中表示直线,即极坐标系下的r=xcos(theta)+ysin(theta).即可用(r,theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角.如

  • win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题

    1.Anaconda 安装python3.6 conda create -n match python=3.6 Python版本默认安装是 3.6.9 2.安装opencv 执行完毕后,安装opencv-python pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple some-package opencv-python 的版本为4.1.1.26 3.安装opencv-contrib-python pip i

随机推荐