匹配不同视频帧之间的对象

时间:2016-01-13 13:31:36

标签: c++ opencv

当相机不稳定并且实时移动时,我尝试使用OPENCV检测连续视频帧的移位,如图所示。two frames and the camera is a bit shifted in the angle。为了补偿摇动或角度变化的影响,我希望匹配图像中的一些物体,例如时钟,并且从连续帧中的同一物体的中心,我可以检测到移位值并补偿其效果。我不知道实时做这种方式的方法,或者有多少种方法可以做到这一点并且准确无误。 提前谢谢你,我希望我的问题很明确。

2 个答案:

答案 0 :(得分:3)

这是一个相当标准的操作,因为它在MPEG-4压缩中被广泛使用。它被称为"运动估计"而且你不会在物体上做(太难了,需要图像分割)。在OpenCV中,它涵盖在Video Stabilization

答案 1 :(得分:1)

如果你想尝试自己编写代码,那么一种方法是首先裁剪框架,以生成实际图像的子图像,该图像比每个维度上的实际图像略小。这将为您提供一些移动空间。

接下来,您希望能够在OpenCV中查找和跟踪形状 - 代码的示例在此处 - http://opencv-srf.blogspot.co.uk/2011/09/object-detection-tracking-using-contours.html - 一直播放,直到您在每个帧上出现几个几何图元形状。

接下来你想要在每个形状的中心之间建立一些向量 - 这些将决定相机的运动 - 如果在下一帧中大多数向量被移位但是平行,这是相机具有的良好指示移动。

最后一步是计算位移,这应该是测量检测到的平行向量之间的距离。如果这比您的子图像裁剪小,那么您可以裁剪原始图像以否定位移。

每次迭代的伪代码都是 -

//Variables
image wholeFrame1, wholeFrame2, subImage, shapesFrame1, shapesFrame2
vectorArray vectorsFrame1, vectorsFrame2; parallelVectorList
vector cameraDisplacement = [0,0]

//Display image
subImage = cropImage(wholeFrame1, cameraDisplacement)
display(subImage);

//Find shapes to track
shapesFrame1 = findShapes(wholeFrame1)
shapesFrame2 = findShapes(wholeFrame2)

//Store a list of parallel vectors
parallelVectorList = detectParallelVectors(shapesFrame1, shapesFrame2)

//Find the mean displacement of each pair of parallel vectors
cameraDisplacement = meanDisplacement(parallelVectorList)

//Crop the next image accounting for camera displacement
subImage = cropImage(wholeFrame1, cameraDisplacement)

有更好的方法可以做到这一点,但这对于第一次尝试使用OpenCV经验的人来说非常容易。