python opencv之 Hough圆变换
原博客地址: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圆变换相关推荐
- python opencv入门 Hough圆变换(28)
内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 使用霍夫变换在图像中寻找圆 使用函数cv2.HoughCircles() 原理: 圆形的表达式为(x−xcenter)2+ ...
- Python+OpenCV:Hough圆检测(Hough Circle Transform)
Python+OpenCV:Hough圆检测(Hough Circle Transform) ##################################################### ...
- Python+OpenCV:Hough直线检测(Hough Line Transform)
Python+OpenCV:Hough直线检测(Hough Line Transform) 理论 A line can be represented as or in a parametric fo ...
- 使用Python,OpenCV和Hough圆检测图像中的圆
使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...
- OpenCV 霍夫圆变换Hough Circle Transform
OpenCV 霍夫圆变换Hough Circle Transform 霍夫圆变换Hough Circle Transform 目标 理论 霍夫圆变换 这个程序做什么? 代码 解释 加载图像: 将其转换 ...
- Python+Opencv实现多种形状的检测
目录 一.Hough变换是什么? 二.Hough变换原理简介 三.Hough变换实现步骤 四.Hough变换直线检测代码实现及效果展示 五.Hough变换圆形检测代码实现及效果展示 六.基于Hough ...
- Python OpenCV实战应用
OpenCV实战应用 摘要 传统计算机视觉 传统特征提取方法 SIFT(尺度不变特征变换) HOG方向梯度特征图 SIFT和HOG的比较 LBP 建筑物轮廓提取 介绍 代码 API说明 车道线检测 介 ...
- Python OpenCV车道线识别侦测
Python OpenCV车道线识别侦测 如需安装运行环境或远程调试,可加QQ905733049, 或QQ2945218359由专业技术人员远程协助! 运行结果如下: 代码如下: import cv2 ...
- Python OpenCV GrabCut进行前景分割和提取
Python OpenCV GrabCut进行前景分割和提取 1. 效果图 1.1 边界框GrabCut效果图 1.2 Mask GrabCut效果图 2. GrabCut原理 2.1 GrabCut ...
最新文章
- Servlet、MySQL中文乱码
- 牛客 [编程题] 回文解码
- vMotion svMotion HA FT概念区别
- 多线程訪问共享数据(1)
- MySQL的MyISAM和InnoDB存储引擎表结构
- Fedora15安装NVIDIA显卡驱动全过程
- [react] 在react中无状态组件有什么运用场景
- gridview中的种种超级链接
- python socket读取数据不能解析_通过实例解析return运行原理,除了quot;生孩子quot;python真是无所不能啊...
- Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)
- net安装 0x80096004 无法验证证书的签名_如何购买iOS签名证书
- 机器学习面试-Keras/tensorflow
- Python爬取行政区划代码(最新版)
- 计算机英文字符点阵矩阵显示,点阵字库
- python判断手机号码是否正确_python检测手机号码是否合法
- SN3FAP反激式开关电源12V2A输出电路
- Frank-Wolf算法
- 银河麒麟高级服务器操作系统V10——安装Tuxedo12
- 【剖析 | SOFARPC 框架】之SOFARPC 线程模型剖析
- MyBatisPuls入门案例