1、先检测边界。img0=cv2.imread('0.png')img=cv2.Canny(img0,0,255)
2、构造一个计数器:u,v=img.shapeacc=img*0
3、检测半径为100的圆:r=100for i in range(u): for j in range(v): if img[i,j]!=0: for m in range(360): t=m*np.pi/180 x=int(i-r*np.cos(t)) y=int(j-r*np.sin(t)) if 0<x<u and 0<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循环检测不同半径的圆:for r in range(45,50): acc=img*0 for i in range(u): for j in range(v): if img[i,j]!=0: for m in range(360): t=m*np.pi/180 x=int(i-r*np.cos(t)) y=int(j-r*np.sin(t)) if 0<x<u and 0<y<v: acc[x,y]=acc[x,y]+1 if np.max(acc)<300: pass else: 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,255)circles= cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,100, param1=100,param2=30, minRadius=45,maxRadius=100)for circle in circles[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)