一.简介:

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

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

(代码文末附上)

二.检测步骤:

2.1读取图像

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

2.2降噪处理

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

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

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

这是5,5的模糊程度

这是20,20的模糊程度

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

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:不同圆心的最小距离,单位为像素

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

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

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

那么什么是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的圆形检测的更多相关文章

  1. OpenCV-Python(1)在Python中使用OpenCV进行人脸检测

    OpenCV是如今最流行的计算机视觉库,而我们今天就是要学习如何安装使用OpenCV,以及如何去访问我们的摄像头.然后我们一起来看看写一个人脸检测程序是如何地简单,简单到只需要几行代码. 在开始之前, ...

  2. Python下的OpenCV学习 01 —— 在Linux下安装OpenCV

    一.OpenCV简要介绍 OpenCV是一个跨平台的计算机视觉库,可以运行在Windows.Linux.MacOS等操作系统上.OpenCV提供了众多语言的接口,其中就包含了Python,Python ...

  3. Python下的OpenCV学习 02 —— 图像的读取与保存

    OpenCV提供了众多对图片操作的函数,其中最基本的就是图片的读取与输出了. 一.读取图片 利用OpenCV读取一张图片是非常容易的,只需要用到 imread() 函数,打开shell或者cmd,进入 ...

  4. python中使用Opencv进行人脸检测

    这两天学习了人脸识别,看了学长写的代码,边看边码边理解搞完了一边,再又是自己靠着理解和记忆硬码了一边,感觉还是很生疏,就只能来写个随笔加深一下印象了. 关于人脸识别,首先需要了解的是级联分类器Casc ...

  5. python下使用opencv拍照

    首先在命令中安装opencv: pip install opencv-python 然后打开notebook: jupyter notebook 建立文件,写入如下代码: import cv2 cap ...

  6. python 下 安装openCV

    安装openCV openCV是Intel 创建的计算机视觉库,用于计算机图像处理. 安装anaconda,在命令行中输入conda install cv2/opencv 报错汇总 网络连接问题 报错 ...

  7. 【python下使用OpenCV实现计算机视觉读书笔记1】输入输出

    说明: 该部分内容为<OpenCV Computer Vision with Python>读书笔记. 1.读入文件与保存. import cv2 image=cv2.imread('a. ...

  8. 【python下使用OpenCV实现计算机视觉读书笔记4】保存摄像头视频

    读取摄像头内容,然后保存一段十秒钟的视频. import cv2 cameraCapture = cv2.VideoCapture(0) fps = 30 # an assumption size = ...

  9. Python下的opencv小问题大智慧

    1.今晚日了狗了,图像显示不按照预期出现,然后突然就好了...... 2.根据第一个问题举一个例子,另一个我没保存... 是不是分不清楚????   plt.imshow(wjy2, cmap='gr ...

随机推荐

  1. echarts图表属性设置

    原地址:http://blog.csdn.net/she_lover/article/details/51448967theme = { // 全图默认背景 // backgroundColor: ‘ ...

  2. Gradient Boosted Regression

    3.2.4.3.6. sklearn.ensemble.GradientBoostingRegressor class sklearn.ensemble.GradientBoostingRegress ...

  3. 江西理工大学南昌校区cool code竞赛

    这次比赛原本就是来打酱油的,想做个签到题就走!一开始不知道1002是签到题,一直死磕1001,WA了四发过了,回头一看Rank,三十名,我靠!看了1001的AC率,在我AC之前只有一个人AC了,当时我 ...

  4. Codility:Titanium 2016 challenge:BracketsRotation

    发现codility上很难找到自己的代码,所以来存一下. 用的一种水法,不知道是结论对还是数据水. 处理出所有极大合法串最后就只剩)))((((状的括号,然后枚举右端点,左端点单调. 但是未匹配点数量 ...

  5. bzoj:1700: [Usaco2007 Jan]Problem Solving 解题

    Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场 ...

  6. 树状数组-HDU1541-Stars一维树状数组 POJ1195-Mobile phones-二维树状数组

    树状数组,学长很早之前讲过,最近才重视起来,enmmmm... 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据 ...

  7. POJ2503-Babelfish-二分

    Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 44545   Accepted: 18803 Descr ...

  8. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  9. [国嵌笔记][025][ARM指令分类学习]

    算术和逻辑指令 1.mov 格式:mov {条件}{s} <dest>, <op> 作用:把一个值从一个地方移动到另一个地方,<dest>必须是寄存器 示例: @m ...

  10. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...