如何在opencv python中使用颜色直方图比较图像并找到最接近的匹配
我在我的项目中这样做是为了使用opencv python识别相机中显示的标志。我已经尝试过使用surf,但由于一些旗帜的功能较少,例如将红色和蓝色作为旗帜的功能,因此它并不总是给出正确的识别。 有什么建议我可以做这个项目的识别国旗的基础上,他们的颜色直方图?非常感谢您的帮助 例如,我展示了越南国旗,程序会将展示的国旗与国旗图像数据库进行比较,并识别出它是越南国旗 注意:这是相同的问题,在这些链接是由我张贴,但我不能编辑它,因为缓慢的连接如何在opencv python中使用颜色直方图比较图像并找到最接近的匹配,python,opencv,image-processing,Python,Opencv,Image Processing,我在我的项目中这样做是为了使用opencv python识别相机中显示的标志。我已经尝试过使用surf,但由于一些旗帜的功能较少,例如将红色和蓝色作为旗帜的功能,因此它并不总是给出正确的识别。 有什么建议我可以做这个项目的识别国旗的基础上,他们的颜色直方图?非常感谢您的帮助 例如,我展示了越南国旗,程序会将展示的国旗与国旗图像数据库进行比较,并识别出它是越南国旗 注意:这是相同的问题,在这些链接是由我张贴,但我不能编辑它,因为缓慢的连接 import cv2 import numpy
import cv2
import numpy as np
import pyttsx
import sys
import os
import operator
hbins = 180
sbins = 255
hrange = [0,180]
srange = [0,256]
ranges = hrange+srange
flags=["Cambodia.jpg","Laos.jpg","Malaysia.jpg","Myanmar.jpg","Philippines.jpg","Singapore.jpg","Thailand.jpg","Vietnam.jpg","Indonesia.jpg","Brunei.jpg"]
list_of_pics=[]
valueCompare=[]
cam = cv2.VideoCapture(0)
while True:
_, frame = cam.read(0)
cv2.imshow('asdas',frame)
list_of_pics=[]
valueCompare=[]
k=cv2.waitKey(10)
if(k==32):
cv2.imwrite("pic.jpg",frame)#the image from the camera
img = "pic.jpg"
for i in flags:
base = cv2.imread(img)
test1 = cv2.imread(i)#the flags to be compared with
rows,cols = base.shape[:2]
basehsv = cv2.cvtColor(base,cv2.COLOR_BGR2HSV)
test1hsv = cv2.cvtColor(test1,cv2.COLOR_BGR2HSV)
histbase = cv2.calcHist(basehsv,[0,1],None,[180,256],ranges)
cv2.normalize(histbase,histbase,0,255,cv2.NORM_MINMAX)
histtest1 = cv2.calcHist(test1hsv,[0,1],None,[180,256],ranges)
cv2.normalize(histtest1,histtest1,0,255,cv2.NORM_MINMAX)
comHist=cv2.compareHist(histbase,histtest1,3)
valueCompare.append(comHist)
picDict={"comhist":comHist,"name":i}
list_of_pics.append(picDict)
newlist = sorted(list_of_pics, key=operator.itemgetter('comhist')) #get the max value of all the compared images
#print newlist
matched_image=newlist[0]['name']
print matched_image
elif k == 27:
break
cv2.destroyAllWindows()
用于模板匹配代码
k=cv2.waitKey(10)
methods = 'cv2.TM_CCOEFF_NORMED'#only the one method to be used
list_of_pics=[]
if(k==32):
for flag in flags:
img = cv2.imread('Singapore.jpg',0)
#img = img.copy()
template = cv2.imread(flag,0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
method = eval(methods)#
#print method
# Apply template Match
res = cv2.matchTemplate(img,template,method)
#print res
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
#print min_val, max_val
matchVal=res[0][0]
picDict={"matchVal":matchVal,"name":flag}
list_of_pics.append(picDict)
#print res[0][0]
newlist = sorted(list_of_pics, key=operator.itemgetter('matchVal'),reverse=True)
print newlist
matched_image=newlist[0]['name']
print matched_image
elif k == 27:
break
cv2.destroyAllWindows()
计算直方图后,可以使用直方图匹配功能
double result = compareHist( image, template, compare_method );
结果的值取决于您使用的compare\u方法。例如,如果使用correlation
作为比较方法,则result
的值将介于0-1和更高之间。匹配值越高
备选方案:
如果您认为数据库中标志的大小和方向与当前图像几乎相似,那么您甚至不需要计算直方图。在这种情况下,您可以直接使用openCV的。谢谢,如果可以正确执行,我将尝试实现此功能并发布更新。big thanksive尝试使用compareList(),但它没有返回正确的标志名称。我正在使用acer笔记本电脑的内置摄像头。我将定位代码。我还尝试使用模板匹配。但它确实正确识别标志。我将在代码模板中发布我使用的代码