Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opencvpython中的图像匹配_Python_Opencv_Python 2.7_Image Processing - Fatal编程技术网

opencvpython中的图像匹配

opencvpython中的图像匹配,python,opencv,python-2.7,image-processing,Python,Opencv,Python 2.7,Image Processing,我一直在做一个项目,使用opencv python识别摄像机中显示的标志。 我已经尝试过使用surf、颜色直方图匹配和模板匹配。但在这三个问题中,它并不总是返回正确答案。我现在想要的,是解决我这个问题的最好办法。 模板图像的示例: 以下是摄像机中显示的标志示例。 如果这是我想要识别的图像类型,该使用什么 更新matchTemplate中的代码 flags=["Cambodia.jpg","Laos.jpg","Malaysia.jpg","Myanmar.jpg","Philipp

我一直在做一个项目,使用opencv python识别摄像机中显示的标志。 我已经尝试过使用surf、颜色直方图匹配和模板匹配。但在这三个问题中,它并不总是返回正确答案。我现在想要的,是解决我这个问题的最好办法。 模板图像的示例:

以下是摄像机中显示的标志示例。

如果这是我想要识别的图像类型,该使用什么

更新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()/<代码>,但是你的版本中的问题是,你没有考虑“代码> MatCHEMTEPLAL())/代码>不是缩放和方向不变的事实。因此,解决方案是使用

高斯金字塔
并创建不同大小的样本标志(一半、四分之一、两倍等)。在获得2-5个不同大小的相同标志后,您应该在每个大小的标志和网络摄像头框架之间执行
matchTemplate()

策略:

  • 接收网络摄像头帧

  • 加载标志的图像

  • 使用高斯金字塔,创建该标志的越来越大的图像(您不需要存储它们)

  • 在网络摄像头框架和每个标志大小之间执行
    matchTemplate()

  • 结果=您获得的最大相关值是网络摄像头中显示的标志


记住:
匹配模板
不是缩放和方向不变的。因此,如果您旋转图像或在网络摄像头框架中使其变大/变小……您将不会得到好的结果。

冲浪不能应用于没有角的图像(当渐变主要沿一个方向移动时,如在条纹标志中)。整个对象的颜色直方图可能不起作用,因为两个示例的颜色相似。但是,如果您可以将直方图应用于图像的不同部分,则效果会更好

你需要做的是将你的训练图像分割成4个象限,并创建4个颜色直方图。测试阶段将整合这4个直方图,并检查响应的正确空间顺序。颜色直方图对旋转、缩放和透视非常鲁棒。它随照明而变化,因此您需要具有自由的匹配阈值。4个象限的空间分辨率将有助于改善这种情况


对于未来,我建议更详细地研究方法,以了解其适用性,而不是随机尝试

你能告诉我如何在python中使用高斯金字塔吗?这对我来说是件新鲜事,我只是个初学者。若你们能给出一个创建更小的模板图像的例子,我很快就能做到。我需要它我会在python中使用pyrDown函数吗?我正确吗?你在相关值中的意思是什么?matchTemplate中的结果?你试过我的代码吗?它正确吗?我希望你能帮助我在python中有任何现有的代码或教程吗?我非常需要做这些。你能给我一些链接吗?我只是opencvSearch谷歌直方图反投影的初学者。例如,要在4上分割图像,您可以使用Mathow的ROI功能来使用此直方图反投影?您可以给出这样做的过程吗?这将非常有用。过程涉及哪些内容或策略…购买一本书或使用在线资源p。103:对不起,我不知道如何使用OpenCV在C++中。如果有任何工作实例,这将是非常有益的。