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图像处理—— 模板匹配

opencv python:模板匹配

Python+OpenCV图像处理之模板匹配

使用Python+OpenCV进行图像模板匹配(Match Template)

使用Python+OpenCV进行图像模板匹配(Match Template)

#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现模板匹配