我一直在使用opencv python识别相机中显示的标志的项目。
我已经尝试使用冲浪,颜色直方图匹配和模板匹配。但是,在这3个中,它并不总是返回正确的答案。我现在想要的是对我的这个问题的最佳解决方案。
模板图片示例:
这是相机中显示的标志的示例。
如果这是我要识别的图像,该怎么用?
更新matchTemplate中的代码
flags=["Cambodia.jpg","Laos.jpg","Malaysia.jpg","Myanmar.jpg","Philippines.jpg","Singapore.jpg","Thailand.jpg","Vietnam.jpg","Indonesia.jpg","Brunei.jpg"]
while True:
methods = 'cv2.TM_CCOEFF_NORMED'
list_of_pics=[]
for flag in flags:
template= cv2.imread(flag,0)
img = cv2.imread('philippines2.jpg',0)
# generate Gaussian pyramid for A
G = template.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpA.append(G)
n=0
for x in gpA:
w, h = x.shape[::-1]
method = eval(methods)#
# Apply template Match
res = cv2.matchTemplate(img,x,method)
matchVal=res[0][0]
picDict={"matchVal":matchVal,"name":flag}
list_of_pics.append(picDict)
n=n+1
newlist = sorted(list_of_pics, key=operator.itemgetter('matchVal'),reverse=True)
#print newlist
matched_image=newlist[0]['name']
print matched_image
k=cv2.waitKey(10)
if (k==27):
break
cv2.destroyAllWindows()
最佳答案
我认为您不能从SURF / SIFT获得好的结果,因为:
解决方案:我仍然认为您应该使用已经尝试过的opencv的
matchTemplate()
,但您的版本中存在的问题是您没有考虑matchTemplate()
的缩放比例和方向不变的事实。因此,解决方案是使用Gaussian pyramid
并创建不同大小的样本标志(一半,四分之一,两倍等)。在获得2-5个不同大小的相同标志后,应在每个标志大小和网络摄像头框架之间执行matchTemplate()
。策略:
matchTemplate()
。 请记住:
matchTemplate
的大小和方向不变。因此,如果您旋转图像或在网络摄像头框架中将其放大/缩小,您将不会获得良好的效果。