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

标签 opencv pattern-matching video-capture feature-detection feature-descriptor

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

我面临的问题是:

1-在这种情况下查询/对象图像的大小是否重要?我问这个问题是因为我捕捉到的自己的图像比鼠标的大,并且面部被检测到而鼠标没有。

2-无论我使用哪个图像作为查询/对象图像,如何在没有查询/对象图像的情况下仅显示火车/场景图像的相机预览。我问这个问题是因为,我得到的是下面发布的图片中所示的内容,而我想要做的是显示的内容 here ,我检查了该链接中的代码,它是用 C++ 编写的,但我遵循了同样的方法,并且本教程使用了“drawMatches”方法,该方法在 java 中有一个对等点,即 Features2D.DrawMatches()并且它们都返回一个 Mat 对象,左侧是查询/对象图像,右侧是火车/场景图像,如下图所示。

我想要做的是,要在没有查询/对象图像的情况下显示在相机输出上,我希望为相机输出指定的区域仅显示从相机捕获的火车/场景图像。

请让我知道如何解决这个问题,我想做一些我在链接中引用的教程中所示的事情。

img_1
img_2

最佳答案

1 - 大小很重要,但在你的情况下,我认为最关键的问题是“纹理”。 SURF 检测“纹理梯度”较强的兴趣点。就您的鼠标而言,渐变主要是平滑的,除了 Logo (fujitsu)、按钮和图像的边框周围。在您指向的教程中,您注意到它使用了一个非常有纹理的对象来演示效果。

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

祝你好运!

关于opencv - 如何从 DrawMatches() 方法返回的 Mat 对象中分离查询和训练图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29608098/

相关文章:

python - 当输入来自CGI时,如何在OpenCV中读取解析图像

c++ - OpenCV 3.0 : Calibration not fitting as expected

c++ - Opencv C++ 在阈值图像中寻找运动

scala - Scala/Unfiltered 中的模式匹配语法

sql - 从SQLite中的表中选择模式

c++如何将视频序列放入OpenCV中的vector <Mat>中?

encoding - 如何在录制和输入实时视频流之间同步?

python - Opencv-Python输入数组错误

windows - 为什么在 Windows 上使用 FFMPEG 重新编码视频总是出错?

java - 替换为这种模式并不能像我预期的那样工作,出了什么问题?