opencv python中的图像匹配
Posted
技术标签:
【中文标题】opencv python中的图像匹配【英文标题】:image matching in opencv python 【发布时间】:2014-03-18 13:13:33 【问题描述】:我一直致力于使用 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()
【问题讨论】:
【参考方案1】:我不认为你可以从 SURF/SIFT 中获得好的结果,因为:
SURF/SIFT 需要关键点来检测对象,但在您的情况下,您必须检测标志,并且大多数标志大多是统一的,并且不提供太多关键点。
在您的网络摄像头框架中,您有几个东西,而不是只有标志。这几件事也有助于获得关键点。
解决方案:我仍然认为你应该使用你已经尝试过的opencv的matchTemplate()
,但你的版本中的问题是你没有考虑matchTemplate()
不是尺度和方向不变。因此,解决方案是使用Gaussian pyramid
并创建不同大小(一半、四分之一、两倍等)的样本标志。在获得 2-5 个不同尺寸的相同标志后,您应该在每个尺寸的标志和网络摄像头框架之间执行matchTemplate()
。
策略:
接收网络摄像头帧
加载标志的图像。
使用高斯金字塔,为该标志创建越来越小的图像(您不需要存储它们。)
在网络摄像头框架和每种大小的标志之间执行matchTemplate()
。
结果 = 获得最大相关值的图像就是网络摄像头中存在的标志。
记住: matchTemplate
不是比例和方向不变的。因此,如果您在网络摄像头框架中旋转图像或使其变大/变小......您将不会获得好的结果。
【讨论】:
你能告诉我在 python 中使用高斯金字塔有多热吗?这对我来说是新事物。我只是一个初学者。如果您可以举一个创建模板图像的较小图像的示例,我可以很快做到这一点。我需要它 我会在 python 中使用 pyrDown 函数吗?对吗? 相关值是什么意思?matchTemplate中的结果? 你试过我的代码了吗?正确吗?希望你能帮助我【参考方案2】:SURF 不能应用于没有角的图像(当梯度主要是在一个方向上,如条纹标志时)。整个对象的颜色直方图可能不起作用,因为您的两个示例都有相似的颜色。但是,如果您可以将直方图应用于图像的不同部分,效果会更好。
您需要做的是将您的训练图像拆分为 4 个象限并创建 4 个颜色直方图。测试阶段将整合这 4 个back projected 直方图并检查响应的正确空间顺序。颜色直方图对旋转、缩放和透视非常稳健。它随照明而变化,因此您需要有宽松的匹配阈值。来自 4 个象限的空间分辨率将有助于改善这种情况。
对于未来,我建议更详细地研究方法以了解它们的适用性,而不是随意尝试它们。
【讨论】:
在 python 中是否有任何现有的代码或教程?我非常需要做这些..你能给一些链接吗?我只是opencv的初学者 在谷歌搜索直方图反投影。例如,opencvpython.blogspot.com/2013/03/… 要在 4 上分割图像,您可以使用 Mat 的 ROI 功能 如何使用这个直方图反投影?你能给出这样做的过程吗?它会很有帮助。涉及的过程或策略是什么...... 购买一本书或使用在线资源 p。 103:google.com/… 对不起,我不知道如何在 c++ 中使用 opencv。如果有任何可行的例子,它会很有帮助..以上是关于opencv python中的图像匹配的主要内容,如果未能解决你的问题,请参考以下文章
使用Python+OpenCV进行图像模板匹配(Match Template)