当我的相机移动时,检测视频中物体运动(不包括相机的自我运动)的最佳方法是什么?
我有实时 50 FPS 全高清 1920x1080 视频流。相机有自我运动。
即我必须这样做:
- 估计我的相机在第一帧和第二帧之间的运动(平移、缩放和旋转)
- 补偿我的相机的这种移动 - 反向移动第二帧
- 用于
gpu::MOG2_GPU
检测物体的运动 - 两帧之间的差异
补偿相机移动的最佳方式(最快和最好的质量)是什么?
phaseCorrelate()
- 只得到翻译而且很慢cv::videostab
- 旨在消除抖动和视频稳定的类- 为每一帧计算(
gpu::SURF_GPU
或goodFeaturesToTrack()
)并estimateRigidTransform()
获得仿射变换(平移、缩放和旋转),但对于高清实时视频来说非常慢 - 每 50 帧(每 1 秒 1 次)计算 (
gpu::SURF_GPU
或goodFeaturesToTrack()
) 和estimateRigidTransform()
- 使用方法 4,但自定义实现
estimateRigidTransform()
- 使用(calcOpticalFlowSF()
或calcOpticalFlowFarneback()
或DenseOpticalFlow::calc
)而不是calcOpticalFlowPyrLK()
:https ://github.com/Itseez/opencv/blob/3942b1f36261b196a264eb35c996222848fe3c93/modules/video/src/lkpyramid.cpp#L1439
这 5 种方法中最好的是什么,如果是 4 种,那么最好的 OpticalFlow 函数是什么: