在Python中使用OpenCV中的Hu矩进行形状识别

时间:2014-07-04 20:05:45

标签: python opencv

使用Hu时刻进行形状识别时遇到问题。目标是能够识别图片左侧的两个白色圆圈和两个白色方块。 http://i.stack.imgur.com/wVzYa.jpg

我尝试使用cv2.approxPolyDP方法,但在轮换时它并不能正常工作。对于白色圆圈,我使用了cv2.HoughCircles方法,它运行得很好。但是,我真的需要使用胡时刻,因为它似乎是一种更好的方法。 我有以下代码:

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不变量。我尝试旋转图片,我发现只有最后两个正在改变。它还说它只发现了一个明显超过它的物体。这是正常的吗? 我想过使用模板进行形状识别,但我不知道该怎么做:我相信我应该利用模板中的Hu时刻,看看它适合的地方,但我不确定如何实现它。 我很感激帮助。

1 个答案:

答案 0 :(得分:2)

您可以创建方块的模板图像并实施template matching技术,以便在图像上检测它。

您还可以检测模板图像的轮廓并使用函数cv2.matchshapes。但是,此功能用于比较两个图像。所以,我猜你必须用你的模板制作一个大小相同的窗口并在原始图像中运行它,以便检测哪个部分是最佳匹配(函数matchshape的最小值)。