使用OpenCV中的Hu矩进行Python形状识别
我在使用Hu矩来识别形状时遇到了问题。我的目标是能够识别图片左边的两个白色圆圈和两个白色方块。https://i.stack.imgur.com/wVzYa.jpg
我尝试使用cv2.approxPolyDP这个方法,但在旋转的时候效果不太好。对于白色圆圈,我使用了cv2.HoughCircles这个方法,效果还不错。不过,我真的需要使用Hu矩,因为它似乎是一个更好的方法。以下是我写的代码:
import cv2
import numpy as np
nomeimg = "coded_target.jpg"
img = cv2.imread(nomeimg)
gray = cv2.imread(nomeimg,0)
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(4,4))
imgbnbin = thresh
imgbnbin = cv2.dilate(imgbnbin, element)
#find contour
contours,hierarchy=cv2.findContours(imgbnbin,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#Elimination small contours
Areacontours = list()
for i in Areacontours:
area = cv2.contourArea(contours[i])
if (area > 90 ):
Areacontours.append(contours[i])
contours = Areacontours
print('found objects')
print(len(contours))
print("humoments")
mom = cv2.moments(contours[0])
Humoments = cv2.HuMoments(mom)
Humoments2 = -np.sign(Humoments)*np.log10(np.abs(Humoments))
print(Humoments2)
这个方法返回7个数字,这些就是Hu不变量。我尝试旋转图片,发现只有最后两个数字在变化。它还显示只找到1个物体,但显然还有更多。这正常吗?我考虑过使用模板来识别形状,但我不知道该怎么做:我认为我应该利用模板的Hu矩,看看它们适合哪里,但我不确定该怎么实现。感谢大家的帮助。
1 个回答
2
你可以先制作一个方块的模板图像,然后使用一种叫做模板匹配的方法来在图片中找到它。
你还可以检测模板图像的轮廓,并使用一个叫做cv2.matchShapes的函数。不过,这个函数是用来比较两张图像的。所以,我想你需要制作一个和模板大小一样的窗口,然后把它在原始图像上移动,以找出哪个部分最匹配(也就是这个函数的最小值)。