视频稳像或防抖

参考链接:

https://zhuanlan.zhihu.com/p/250839967

写的挺好的,很详细,python+opencv和C+opencv的代码都有,但是并不是实时的

效果:个人视频效果没法上传,可以参考链接中效果,或者评论获取

 

遇到问题:

1. Opencv高版本引发的问题:estimateRigidTransform

调用cv2.estimateRigidTransform(prev_pts, curr_pts, fullAffine=False)函数,结果报错:AttributeError: module ‘cv2.cv2‘ has no attribute ‘estimateRigidTransform‘

个人opencv版本4.4

解决办法:

当最后一个参数为fullAffine=False时,使用cv2.estimateAffinePartial2D替代

当最后一个参数为fullAffine=True时,使用cv2.estimateAffine2D替代

视频稳像或防抖

上结果:

视频稳像或防抖

将上面一行代码改为下面一行代码,程序运行成功​

真的想问一下那些一遇到类似问题就降软件版本的大哥,老这么降来降去的,你的电脑受的了吗,别再来坑了行不行

本问题参考链接:

https://blog.****.net/Hold2u/article/details/109179574

https://blog.****.net/qq_43872529/article/details/104343964

2. np.cumsum使用方法:

 

 

视频稳像或防抖

如图所示,按照指定坐标轴,累计加和,维度不发生改变而是逐渐累积

3. fixBorder 说明:

视频稳像或防抖

 

当将1.04改为0.8时得到图像

视频稳像或防抖

当将1.04改为1.2时得到图像

视频稳像或防抖

 

一些个人理解程序步骤:

1. 先求特征点,特征点是使用cv2.goodFeaturesToTrack函数获得的,个人没去确定是哪种特征点

2. 使用光流法进行跟踪,cv2.calcOpticalFlowPyrLK

光流算法具体的算法解析:https://zhuanlan.zhihu.com/p/105998058

3. 得到变换参数cv2.estimateAffinePartial2D

4. 对整个视频得到的运动曲线进行平滑 smooth(trajectory)

5. 得到平滑参数  transforms_smooth = transforms + difference

6. 对于每一帧图像根据得到的平滑参数,变换图像 cv2.warpAffine(frame, m, (w, h))

 

个人理解部分仅供参考,欢迎批评指正

个人想做全景相机的防抖部分,但是现在没有太好的方法,也欢迎大牛指导