一、原理
通过霍夫检测圆的个数来识别小人位置。
二、过程
1.二值图像
2.去掉宫格内容,便于分割
3.对二值图填补,减少纹理
4.分割九宫格,依次检测每个宫格中圆个数
5.最终显示小人所在宫格图片,在img6.jpg中
详细程序运行结果
三、代码
image = cv2.imread('mancar.jpg',0)
ret,bw = cv2.threshold(image,180,255,cv2.THRESH_BINARY)
cv2.imshow("bin",bw)
#闭运算,去掉九宫格内的内容,便于检测每个宫格轮廓
kernel = np.ones((10,10),np.uint8)
bw2 = cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel)
cv2.imshow("bw2",bw2)
#开运算减少纹理
kerne2 = np.ones((4,4),np.uint8)
bw = cv2.morphologyEx(bw, cv2.MORPH_OPEN, kerne2)
cv2.imshow("bw3",bw)
pictue_size=bw2.shape
picture_height=pictue_size[0]
picture_width=pictue_size[1]
#边界提取
contours, hierarchy = cv2.findContours(bw2,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#九宫格分割
img=[0 for i in range(len(contours))]
print("宫格区域数量",len(contours))
for j in range(0,len(contours)):
x, y, w, h = cv2.boundingRect(contours[j])
img[j]=bw[y:y+h,x:x+w]
cv2.imwrite('img%s.jpg'%str(j),img[j])
countor=[]
for i in range(0,len(contours)):
circles= cv2.HoughCircles(img[i],cv2.HOUGH_GRADIENT,1,20,param1=100,param2=14,minRadius=17,maxRadius=150)
#输出检测到圆的个数
print('宫格检测圆边个数',len(circles[0]))
countor.append(len(circles[0]))
#根据检测到圆的信息,画出每一个圆
for circle in circles[0]:
if (circle[2] >= 100):
continue
#坐标行列
x=int(circle[0])
y=int(circle[1])
#半径
r=int(circle[2])
#在原图用指定颜色标记出圆的位置
img[i]=cv2.circle(img[i],(x,y),r,(0,255,0),1)
#显示新图像
cv2.imshow('circledetect',img[i])
cv2.waitKey(0)
min=0
for k in range(len(contours)):
if countor[min]>countor[k]:
min=k
print("小人在宫格img%s中"%min)
man=cv2.imread('img6.jpg')
cv2.imshow('man',man)
cv2.waitKey(0)