如何从 DrawMatches() 方法返回的 Mat 对象中分离查询和训练图像

How to separate the query and the train image from the Mat object returned from DrawMatches() method

我正在尝试检测视频中的对象。我使用 SURF 作为特征检测和描述符提取器,使用 BRUTFORCE 作为匹配器。我用人脸测试了我的工作,我拍了一张我的照片,当我 运行 相机并将它对准我时,我的脸被检测到,并在它周围画了一个矩形。我尝试进行另一项测试,我拍摄了鼠标的图像并调整了它的大小,当我 运行 摄像头时,它没有被检测到

我面临的问题是:

1-在这种情况下,query/object 图片的大小是否重要?我问这个问题是因为我拍摄的自己的图像比鼠标的图像大,而且面部被检测到而鼠标没有。

2-无论我将哪个图像用作 query/object 图像,如何仅显示 train/scene 图像而不显示 query/object 图像的相机预览。我问这个问题是因为,我得到的是下面发布的图片中显示的内容,而我想做的是显示的内容 here,我检查了其中的代码 link ,它是在 C++ 中,但我遵循了同样的事情,而且教程使用了 'drawMatches' 方法,它在 java 中有一个对等体,它是 Features2D.DrawMatches() 并且它们都 returns 一个 Mat query/object 图像在左侧,train/scene 图像在右侧的对象,如下图所示。

我想要做的是,在没有 query/object 图像的情况下在相机输出上显示,我希望为相机输出指定的区域仅显示从 train/scene 捕获的图像相机。

请让我知道如何解决这个问题,我想按照我在 link.

中引用的教程中所示进行操作

1 - 大小很重要,但在你的情况下,我认为最关键的问题是 "textureness"。 SURF 检测 "texture gradient" 强的兴趣点。对于您的鼠标,除了徽标 (fujitsu)、按钮和图像边框外,渐变主要是平滑的。在您指向的教程中,您注意到它使用非常有质感的对象来演示效果。

2 - 据我所知,有全自动方法可以完成您想要的操作,但只需几个步骤即可完成。基本上,您必须确定对象的周围框,然后绘制它。要绘制,使用 cv::rectangle 更容易,但使用四个(或更多....)cv::line 可以更精确。要确定周围的框,您可以估计过滤匹配中的极值点。

祝你好运!