送上一篇初学open cv霍夫找圆,识别率低下,自娱自乐。
pyrMeanShiftFiltering:这个函数严格来说并不是图像的分割,而是图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域。
第一个参数src,输入图像,8位,三通道的彩色图像,并不要求必须是RGB格式,HSV、YUV等Opencv中的彩色图像格式均可;
第二个参数dst,输出图像,跟输入src有同样的大小和数据格式;(自带参数好复杂,我直接用参数的方式将图像传出)
第三个参数sp,定义的漂移物理空间半径大小;
第四个参数sr,定义的漂移色彩空间半径大小;
第五个参数maxLevel,定义金字塔的最大层数;
第六个参数termcrit,定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合;
o(* ̄︶ ̄*)o(很好,以上的黑色参数我全都用不到,涉及到源文件,漂移最大的半径以及平滑程度,你就理解为模糊程度吧)
模糊程度相当的决定了识别率哈,真的是,改了10分钟的模糊度才最终找圆成功。后面的代码灰度图的转化,在上一周的单通道灰度形成对比cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)。主要是为了再多通道中(你可以理解为在彩色图片中增加识别率二转化为黑白的图片)应为cv3推出了通道自定义,没搞懂,返回来使用cv2。
我大概模糊到这个程度就成功识别圆了。下面步入正题,霍夫函数的理解:
cv2.HoughCircles(image,method,dp,minDist[, circles[,param1, param2[,minRadius[,maxRadius]]]]])
image 不用多说,输入矩阵
method cv2.HOUGH_GRADIENT 也就是霍夫圆检测,梯度法
dp 计数器的分辨率图像像素分辨率与参数空间分辨率的比值(官方文档上写的是图像分辨率与累加器分辨率的比值,它把参数空间认为是一个累加器,毕竟里面存储的都是经过的像素点的数量),dp=1,则参数空间与图像像素空间(分辨率)一样大,dp=2,参数空间的分辨率只有像素空间的一半大(楼主理解不到)
minDist 圆心之间最小距离,如果距离太小,会产生很多相交的圆,如果距离太大,则会漏掉正确的圆
param1 canny检测的双阈值中的高阈值,低阈值是它的一半
param2 最小投票数(基于圆心的投票数)
minRadius 需要检测圆的最小半径
maxRadius 需要检测圆的最大半径
for i in circles[0]:
cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)#画圆
cv.circle(image, (i[0], i[1]), 2, (255, 0, 255), 2)#画圆心
在这儿我遍历了前面find方法找到的所有的圆形,分别画出他们的圆的边缘线和圆心,(i[0], i[1])指的是坐标行列,i[2]存放的是半径,2为内径圆的半径,用来表示圆心。
import cv2 as cv
import numpy as np
#圆检测
def circles_find(image):
dst = cv.pyrMeanShiftFiltering(image, 10, 200)
cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)#灰度转换哈
cv.imshow("show",cimage)
circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0]:
cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)#画圆
cv.circle(image, (i[0], i[1]), 5, (255, 0, 255), 2)#画圆心
cv.imshow("circle", image)
src = cv.imread("find5.jpg")
cv.imshow("cicle", src)
circles_find(src)
cv.waitKey(0)
cv.destroyAllWindows()
在这儿贴上代码吧,后面尝试了两个没怎么用过的函数,试一试。