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

0 投票
1 回答
8262 浏览
提问于 2025-04-18 12:09

我在使用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的函数。不过,这个函数是用来比较两张图像的。所以,我想你需要制作一个和模板大小一样的窗口,然后把它在原始图像上移动,以找出哪个部分最匹配(也就是这个函数的最小值)。

撰写回答