码迷,mamicode.com
首页 > 编程语言 > 详细

python下用OpenCV的圆形检测

时间:2018-02-07 12:07:07      阅读:521      评论:0      收藏:0      [点我收藏+]

标签:window   waitkey   噪点   www   str   图像处理   调整   调用   round   

 写在文章前

这些天因为工作需要要学习图像检测,笨笨的我啥都不会要盯着OpenCV重头开始学(;′⌒`),甚至查资料能力都很弱弱〒▽〒

夸一下我最好的男票(*^▽^*)  男盆友也不是做图像处理的 但是心疼我的笨(〃‘▽‘〃) 

让我把要求给他(っ??ω??)っ???  他放下手中的游戏 花了一两天给我做出来然后写了份详细说明书φ(>ω<*) 

当然是记下来 ?(?????)?

??▽ ???3?? 学习去咯

 

一.简介:

初次使用python的你一定感受到了python的便捷。作为高级编程语言只需调用类库即可。

对于圆形物体识别问题,opencv提供了大量方法。

代码文末附上

二.检测步骤:

2.1读取图像

窗口1(初始图像未经过处理)

 技术分享图片

2.2降噪处理

由于图像中存在大量噪点(什么是噪点参考https://www.zhihu.com/question/23877970

利用降噪方法cv2.blur(img, (5,5))

其中两个参数为横向纵向的模糊程度,数值越大越模糊

这是55的模糊程度

 技术分享图片

这是2020的模糊程度

 技术分享图片

这里我们用55效果测试下来最佳

2.3灰度化

灰度化常用于色彩丰富的图像,类似ps中的失色操作。

方法:cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)

 技术分享图片

由于原图像就是黑白主色调,所以去色改变不大

2.4霍夫变化圆检测

之前的降噪和灰度化都是为了这一步的检测

参考文章http://lib.csdn.net/article/opencv/24037

方法如下:

cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)

参数1 image:传递图像

参数2 method:默认,不用理解

参数3 dp:默认,不用理解

参数4 minDist:不同圆心的最小距离,单位为像素

参数涉及到Canny算法,这里的80canny算法的上限,这里的canny算法下限自动设置为为上限一半,马上介绍canny算法

参数6 需要理解上面的参考文章,可以认为是需要达到的累加数量

参数78 为最小半径和最大半径,避免识别白色的圆圈

技术分享图片

那么什么是canny算法呢?简单来说就是边缘检测算法

具体实现效果可以参考方法:cv2.Canny(img, 27, 54),显示效果为

 技术分享图片

加大参数边缘就越少,我们用到的就是这种效果,即设置上限为80

cv2.Canny(img, 40, 80)

技术分享图片

最终

circles=cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)

会将所有识别的圆形参数(圆心位置,半径)保存到circles

可以认为是一个数组中

2.5标记

根据2.4获取的图像信息利用cv2.circle()方法进行圈画

技术分享图片

大功告成,可以调整参数达到满意的效果。

三.附上代码

# -*- coding: utf-8 -*-
import  cv2
#载入并显示图片
img=cv2.imread(‘1.jpg‘)
cv2.imshow(‘1‘,img)
#降噪(模糊处理用来减少瑕疵点)
result = cv2.blur(img, (5,5))
cv2.imshow(‘2‘,result)
#灰度化,就是去色(类似老式照片)
gray=cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)
cv2.imshow(‘3‘,gray)

#param1的具体实现,用于边缘检测    
canny = cv2.Canny(img, 40, 80)   
cv2.imshow(‘4‘, canny)  


#霍夫变换圆检测
circles= cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)
#输出返回值,方便查看类型
print(circles)

#输出检测到圆的个数
print(len(circles[0]))

print(‘-------------我是条分割线-----------------‘)
#根据检测到圆的信息,画出每一个圆
for circle in circles[0]:
    #圆的基本信息
    print(circle[2])
    #坐标行列(就是圆心)
    x=int(circle[0])
    y=int(circle[1])
    #半径
    r=int(circle[2])
    #在原图用指定颜色圈出圆,参数设定为int所以圈画存在误差
    img=cv2.circle(img,(x,y),r,(0,0,255),1,8,0)
#显示新图像
cv2.imshow(‘5‘,img)

#按任意键退出
cv2.waitKey(0)
cv2.destroyAllWindows()

python下用OpenCV的圆形检测

标签:window   waitkey   噪点   www   str   图像处理   调整   调用   round   

原文地址:https://www.cnblogs.com/wy0904/p/8425447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!