原博客地址:https://blog.csdn.net/tengfei461807914/article/details/77507820

https://blog.csdn.net/Tina_Wei/article/details/78202694

内容来自OpenCV-Python Tutorials 自己翻译整理

目标:

使用霍夫变换在图像中寻找圆
使用函数cv2.HoughCircles()

原理:

圆形的表达式为(x−xcenter)2+(y−ycenter)2=r2(x−xcenter)2+(y−ycenter)2=r2,一个圆环的确定需要三个参数。那么霍夫变换的累加器必须是三维的,但是这样的计算效率很低。
这里opencv中使用霍夫梯度的方法,这里利用了边界的梯度信息。

首先对图像进行canny边缘检测,对边缘中的每一个非0点,通过Sobel算法计算局部梯度。那么计算得到的梯度方向,实际上就是圆切线的法线。三条法线即可确定一个圆心,同理在累加器中对圆心通过的法线进行累加,就得到了圆环的判定。

cv2.HoughCircles函数的参数

cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
  • dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。
  • minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。反之,这个参数设置太大的话,某些圆就不能被检测出来了。
  • param1,有默认值100。它是method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。
  • param2,也有默认值100。它是method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
  • minRadius,默认值0,表示圆半径的最小值。
  • maxRadius,也有默认值0,表示圆半径的最大值。

源代码

import cv2
import numpy as npimg = cv2.imread('image/1.jpg', 0)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100,param1=100, param2=30, minRadius=40, maxRadius=70)circles = np.uint16(np.around(circles))for i in circles[0,:]:# draw the outer circlecv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)print('圆心坐标:', i[0], i[1])print('圆半径:', i[2])# draw the center of the circlecv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)cv2.imshow('detected circles', cimg)
cv2.imwrite('image/ceshi.jpg', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在给一个使用摄像头进行寻找圆 的代码

import cv2
import numpy as npdef circle(image):img = cv2.medianBlur(image, 5)cimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)print('the shape of cimg: ', cimg.shape)# circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,100,#                             param1=100,param2=30,minRadius=40, maxRadius=70)circles = cv2.HoughCircles(cimg, cv2.HOUGH_GRADIENT, 1, 100,param1=100, param2=30, minRadius=40, maxRadius=100)# print('circles: ', circles)if circles is None:return imagecircles = np.uint16(np.around(circles))for i in circles[0,:]:# draw the outer circleimage1 = cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)print('圆心坐标:', i[0], i[1])print('圆心半径:', i[2])# draw the center of the circleimages = cv2.circle(image1, (i[0], i[1]), 2, (0, 0, 255), 3)return imagesif __name__ == '__main__':cap = cv2.VideoCapture(0)cap.set(3, 960)cap.set(4, 960)while(1):# get a frameret, frame = cap.read()if not ret:print('video read error')frame = circle(frame)# show a framecv2.imshow("capture", frame)print('hi')if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()

python opencv之 Hough圆变换相关推荐

  1. python opencv入门 Hough圆变换(28)

    内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 使用霍夫变换在图像中寻找圆 使用函数cv2.HoughCircles() 原理: 圆形的表达式为(x−xcenter)2+ ...

  2. Python+OpenCV:Hough圆检测(Hough Circle Transform)

    Python+OpenCV:Hough圆检测(Hough Circle Transform) ##################################################### ...

  3. Python+OpenCV:Hough直线检测(Hough Line Transform)

    Python+OpenCV:Hough直线检测(Hough Line Transform) 理论 A line can be represented as  or in a parametric fo ...

  4. 使用Python,OpenCV和Hough圆检测图像中的圆

    使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...

  5. OpenCV 霍夫圆变换Hough Circle Transform

    OpenCV 霍夫圆变换Hough Circle Transform 霍夫圆变换Hough Circle Transform 目标 理论 霍夫圆变换 这个程序做什么? 代码 解释 加载图像: 将其转换 ...

  6. Python+Opencv实现多种形状的检测

    目录 一.Hough变换是什么? 二.Hough变换原理简介 三.Hough变换实现步骤 四.Hough变换直线检测代码实现及效果展示 五.Hough变换圆形检测代码实现及效果展示 六.基于Hough ...

  7. Python OpenCV实战应用

    OpenCV实战应用 摘要 传统计算机视觉 传统特征提取方法 SIFT(尺度不变特征变换) HOG方向梯度特征图 SIFT和HOG的比较 LBP 建筑物轮廓提取 介绍 代码 API说明 车道线检测 介 ...

  8. Python OpenCV车道线识别侦测

    Python OpenCV车道线识别侦测 如需安装运行环境或远程调试,可加QQ905733049, 或QQ2945218359由专业技术人员远程协助! 运行结果如下: 代码如下: import cv2 ...

  9. Python OpenCV GrabCut进行前景分割和提取

    Python OpenCV GrabCut进行前景分割和提取 1. 效果图 1.1 边界框GrabCut效果图 1.2 Mask GrabCut效果图 2. GrabCut原理 2.1 GrabCut ...

最新文章

  1. Servlet、MySQL中文乱码
  2. 牛客 [编程题] 回文解码
  3. vMotion svMotion HA FT概念区别
  4. 多线程訪问共享数据(1)
  5. MySQL的MyISAM和InnoDB存储引擎表结构
  6. Fedora15安装NVIDIA显卡驱动全过程
  7. [react] 在react中无状态组件有什么运用场景
  8. gridview中的种种超级链接
  9. python socket读取数据不能解析_通过实例解析return运行原理,除了quot;生孩子quot;python真是无所不能啊...
  10. Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)
  11. net安装 0x80096004 无法验证证书的签名_如何购买iOS签名证书
  12. 机器学习面试-Keras/tensorflow
  13. Python爬取行政区划代码(最新版)
  14. 计算机英文字符点阵矩阵显示,点阵字库
  15. python判断手机号码是否正确_python检测手机号码是否合法
  16. SN3FAP反激式开关电源12V2A输出电路
  17. Frank-Wolf算法
  18. 银河麒麟高级服务器操作系统V10——安装Tuxedo12
  19. 【剖析 | SOFARPC 框架】之SOFARPC 线程模型剖析
  20. MyBatisPuls入门案例

热门文章

  1. EPSON EPL-6200 无法网络共享问题
  2. 软件外包项目管理3点体会
  3. (转载)7个去伪存真的JavaScript面试题
  4. javascript数组对象
  5. 逗号分割符--字段中含逗号等情况的解析方法Java实现
  6. 软件加license的一种实现方法
  7. 在Sharepoint Designer 2007 中加入定制的工作流动作
  8. VSS控制存储过程,及其asp.net的远程调试
  9. MySQL工具介绍及环境搭建
  10. 手机号归属地_【号码归属地查询工具】