【问题标题】:Determine movement/motion (in pixels) between two frames确定两帧之间的运动/运动(以像素为单位)
【发布时间】:2014-06-25 10:54:50
【问题描述】:

首先,我是图像处理的新手,所以请不要对我太苛刻。 话虽如此,我正在开发一个应用程序,使用相机获得的热图像来分析四肢血流的变化。用户可以通过在当前图像上放置一个形状(圆形、矩形等)来定义感兴趣的区域。然后,用户应该能够看到在指定的 ROI 内,平均温度是如何逐帧变化的。

问题在于,由于测试对象的(小)移动,某些图像不稳定。我的问题是如何确定帧之间的移动,以便相应地重新定位 ROI?

我正在使用 Emgu OpenCV .Net 包装器进行图像处理。 到目前为止,我尝试的是在找到的最大轮廓上使用GetMoments() 计算重心,并计算此重心与前一个重心之间的方向矢量。然后使用该向量转换 ROI,但结果还没有那么乐观。

这是正确的做法还是我完全找错了树?

-----编辑------

以下是两张显示向右下方轻微移动的示例图片:

http://postimg.org/image/wznf2r27n/

轮廓之间的比较:

http://postimg.org/image/4ldez2di1/

如您所见,轮廓的形状几乎相同,尽管脚趾附近有一些细微差别。

【问题讨论】:

  • 光流(图像之间的速度向量)或 sift/homography(一个图像中的点在哪里结束)
  • 如果 ROI 的非易失部分之间有足够的相似性,也许模板匹配是可以的。
  • 在最坏的情况下,两帧之间的运动(以像素为单位)有多大?有多少纹理信息(因为您正在处理热图像)?你能给我们一些示例图像吗?也许可以显示运动的示例图像。
  • 你会说(你的印象)提取的轮廓可以匹配吗?如果是,计算 cog 是常用 icp 算法(迭代最近点)的第一部分。也许你也看看它并实施其他步骤;)
  • 感谢您的回答。我将看看光流和筛选。我还编辑了我的帖子并提供了一些示例图片。

标签: opencv emgucv motion-detection


【解决方案1】:

似乎我终于能够使用基于 Lukas-Kanade 方法的光流找到解决问题的方法。

以防万一其他人想知道如何在 Emgu/C# 中实现它,这里是 Emgu 示例项目的链接,他们使用 Lukas-Kanade 和 Farneback 的算法: http://sourceforge.net/projects/emguexample/files/Image/BuildBackgroundImage.zip/download

您可能需要调整一些东西,例如角点检测的参数(frame.GoodFeaturesToTrack(..) 方法),但它肯定是开始的。

感谢所有的想法!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多