当前位置: 首页 > 面试题库 >

BFMatcher匹配OpenCV中的抛出错误

鲁德佑
2023-03-14
问题内容

我正在使用SURF描述符进行图像匹配。我正计划将给定的图像与图像数据库匹配。

import cv2
import numpy as np
surf = cv2.xfeatures2d.SURF_create(400)

img1 = cv2.imread('box.png',0)
img2 = cv2.imread('box_in_scene.png',0)

kp1,des1 = surf.detectAndCompute(img1,None)
kp2,des2 = surf.detectAndCompute(img2,None)


bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=True)
#I am planning to add more descriptors
bf.add(des1)

bf.train()

#This is my test descriptor
bf.match(des2)

问题是bf.match我遇到以下错误:

OpenCV Error: Assertion failed (type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U)) in batchDistance, file /build/opencv/src/opencv-3.1.0/modules/core/src/stat.cpp, line 3749
Traceback (most recent call last):
  File "image_match4.py", line 16, in <module>
    bf.match(des2)
cv2.error: /build/opencv/src/opencv-3.1.0/modules/core/src/stat.cpp:3749: error: (-215) type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U) in function batchDistance

错误类似于此帖子。给出的说明不完整且不充分。我想知道如何解决此问题。我已经将ORB描述符与具有NORM_HAMMING距离的BFMatcher一起使用。错误再次浮出水面。任何帮助将不胜感激。

我为此使用的两个图像是:

box.png

box.png

box_in_scene.png

box_in_scene.png

我在Linux中使用Python 3.5.2和OpenCV3.1.x。


问题答案:

要在两个图像的描述符之间进行搜索,请 使用:

img1 = cv2.imread('box.png',0)
img2 = cv2.imread('box_in_scene.png',0)

kp1,des1 = surf.detectAndCompute(img1,None)
kp2,des2 = surf.detectAndCompute(img2,None)


bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=False)
matches = bf.match(des1,des2)

在多张图像中搜索

add方法用于添加多个测试图像的描述符。一旦所有描述符都建立索引,就可以运行train方法来构建基础的数据结构(示例:KdTree,在FlannBasedMatcher的情况下将用于搜索)。然后,您可以运行match以查找哪个测试图像与哪个查询图像更匹配。您可以检查K-d_tree并查看如何将其用于搜索多维矢量(Surf提供64维矢量)。

注意:- 顾名思义,BruteForceMatcher没有内部搜索优化数据结构,因此具有空训练方法。

用于多图像搜索的代码示例

import cv2
import numpy as np
surf = cv2.xfeatures2d.SURF_create(400)

# Read Images
train = cv2.imread('box.png',0)
test = cv2.imread('box_in_scene.png',0)

# Find Descriptors    
kp1,trainDes1 = surf.detectAndCompute(train, None)
kp2,testDes2  = surf.detectAndCompute(test, None)

# Create BFMatcher and add cluster of training images. One for now.
bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=False) # crossCheck not supported by BFMatcher
clusters = np.array([trainDes1])
bf.add(clusters)

# Train: Does nothing for BruteForceMatcher though.
bf.train()

matches = bf.match(testDes2)
matches = sorted(matches, key = lambda x:x.distance)

# Since, we have index of only one training image, 
# all matches will have imgIdx set to 0.
for i in range(len(matches)):
    print matches[i].imgIdx

有关bf.match的DMatch输出,请参阅docs。

在此处查看完整示例:Opencv3.0
docs

其他资讯

操作系统:Mac。
的Python:2.7.10。
Opencv:3.0.0-dev [如果没记错,请使用brew安装。



 类似资料:
  • 问题内容: 我正在使用ORB特征检测器使用以下代码查找两个图像之间的匹配项: 我的问题是我找不到过滤匹配项的方法,因此仅当它们在照片中具有相似位置时才匹配。即使一个关键点在位置上距离很远,我也总是会得到多个匹配。 有没有办法更好地过滤它们? 问题答案: 为了获得更好的匹配结果,您应该以给定的顺序包括这些过滤方法。 在两个方向上执行匹配,即对于第一张图像中的每个点,在第二张图像中找到最佳匹配,反之亦

  • 请尝试在java中创建一个新的应用程序来匹配图片和视频,图片中模板的匹配工作正常,但当我尝试为视频执行此操作时,总是会出现以下错误消息: OpenCV错误:断言失败((深度==CV_8U||深度==CV_32F) 这是我的视频图片匹配功能,有人可以帮忙。

  • 问题内容: 我正在尝试基本上在Java上进行模板匹配。我使用简单的算法来找到匹配项。这是代码: 但这是非常缓慢的方法。我测试了2张图像(768×1280)和子图像(384 x 640)。这持续了很长时间。openCV是否可以使用现成的函数cvMatchTemplate()快速执行模板匹配? 问题答案: 您会发现openCV cvMatchTemplate()比您已实现的方法快得多。您创建的是一种统

  • 问题内容: 我无法使用此功能。基本上,我正在进行特征检测并与参考图像进行匹配。我想将匹配的功能叠加在输入图像的顶部。这是我的代码: 这是Feature2d.drawMatches,特别是这个问题。根据我收到的Android错误,某些尺寸没有对齐。说实话,我什至不知道应该如何在Android上工作,因为任何地方都没有文档。 我想要做的是在inputImage顶部绘制匹配项。我已经开始工作,但是不确定

  • 有人能帮我弄清楚发生了什么吗? 我正在尝试加载测试一个用户可以上传和下载文件的应用程序。 旅程: 步骤1:当用户从磁盘选择文件(POST请求)时,它会创建一个文件ID和带有uuid的路径。 响应如下: 第2步:使用这些(POST请求),它用s3 uri响应,并带有评估码ID、秘书访问码和会话令牌。 响应如下:

  • 我正在进行一个小型的个人项目,我必须知道所显示的图像是否是一辆汽车。我使用的是基本的基于OpenCV python的模板匹配。 汽车俯视图:-https://i.stack.imgur.com/zXr1U.jpg 简单的模板匹配是使用一个正图像对另一个正图像进行匹配,从而得到所需的结果。 但是当我们使用像https://i.stack.imgur.com/YLVwc.jpg这样的负面图像时,模板查

  • 我正在尝试将customRepository与CRUDRepository一起使用。获取以下错误: 在JpaRepositoriesRegistrar上声明的@EnableJpaRepositories中定义的ConfigRepository。EnableJpaRepositoriesConfiguration:调用init方法失败;嵌套异常为org。springframework。数据存储库。查

  • 问题内容: 我正在尝试实现一个非常简单的程序来查找两个图像之间的相似性。 我正在为此任务使用ORB特征检测器和图像描述符,并且正在使用 knnMatch 识别匹配 项 : 我能够按照以下方式绘制比赛: 问题是比赛太多,而且还包括相距遥远的比赛。我似乎找不到如何仅提取好的匹配项(超过某个阈值)?有人可以指出我正确的方向还是将我重定向到一些基本的工作示例?我已经花了几个小时,似乎迷路了。 问题答案: