本文,介绍的是基于Hough变换的圆形检测算法。
工具/原料
电脑
python
opencv模块
方法/步骤
1、先检测边界。img0=cv2.imread('0.png')img=cv2.Canny(img0,0,255)
2、构造一个计数器:u,v=img.shapeacc=img*0
3、检测半径为100的圆:r=100foriinrange(u):forjinrange(v):ifimg[i,j]!=0:forminrange(360):t=m*np.pi/180x=int(i-r*np.cos(t))y=int(j-r*np.sin(t))if0<x<uand0<y<v:acc[x,y]=acc[x,y]+1没有明显的极值点,就表示没有半径为100的圆。
4、无论怎么样,先在原图中标注出检测到的"圆":x,y=np.where(acc==np.max(acc))cv2.circle(img0,(x[0],y[0]),r,(0,0,255),2)确实检测无效,见下图。
5、用for循环检测不同半径的圆:forrinrange(45,50):ac罕铞泱殳c=img*0fo鸡堕樱陨riinrange(u):forjinrange(v):ifimg[i,j]!=0:forminrange(360):t=m*np.pi/180x=int(i-r*np.cos(t))y=int(j-r*np.sin(t))if0<x<uand0<y<v:acc[x,y]=acc[x,y]+1ifnp.max(acc)<300:passelse:cv2.imwrite('2.png',acc)x,y=np.where(acc==np.max(acc))cv2.circle(img0,(x[0],y[0]),r,(0,0,255),2)检测失败,而且很耗时。
6、opencv内置检测方法,可以同张虢咆噘时检测不同半径的圆,而且时间很短:img0=cv2.imread('0.png')img=cv2.Canny(img0,0,2笙剽茑镙55)circles=cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,100,param1=100,param2=30,minRadius=45,maxRadius=100)forcircleincircles[0]:x=int(circle[0])y=int(circle[1])r=int(circle[2])cv2.circle(img0,(x,y),r,(0,0,255),2)cv2.imwrite('3.png',img0)