参考链接:

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替代


基于opencv视频质量检测拍摄角度 opencv视频稳像_基于opencv视频质量检测拍摄角度

上结果:

基于opencv视频质量检测拍摄角度 opencv视频稳像_视频处理_02

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

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

本问题参考链接:



2. np.cumsum使用方法:

基于opencv视频质量检测拍摄角度 opencv视频稳像_视频处理_03

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

3. fixBorder 说明:

基于opencv视频质量检测拍摄角度 opencv视频稳像_资源整理_04

 

当将1.04改为0.8时得到图像

基于opencv视频质量检测拍摄角度 opencv视频稳像_基于opencv视频质量检测拍摄角度_05

当将1.04改为1.2时得到图像

基于opencv视频质量检测拍摄角度 opencv视频稳像_特征点_06

 

一些个人理解程序步骤:

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))

 

说明:

为啥将个人理解放在最后呢,一方面是个人的理解有一定的片面性,并不是十分准,仅供参考;另一方面之前遇到过一个领导,我做知识分享的时候,想根据分享的那个理论探讨一下个人的见解,彼此交流,然后那个领导说大家为什么要听你的理论,浪费时间,确实是有一些道理,个人的一些理论见解水平有限。因此将个人见解放在最后,仅供大家参考。

个人还是比较喜欢分享一些个人的见解,因为调研一篇论文或者一个方向理论知识的时候,自己理解的东西时常不全面或者有一定偏差,大家彼此探讨后能够很好地纠正自己的偏差或者补充一些理解不上去的地方

仅使用图像特征进行防抖的方式,天花板太明显了。需要增加其他硬件设备,例如IMU。

 

分享一个调研时觉得特别有意思的事

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

叫了一只鸡来做防抖

基于opencv视频质量检测拍摄角度 opencv视频稳像_资源整理_07

将摄像头绑在鸡头上,然后带着这只鸡去。。。

基于opencv视频质量检测拍摄角度 opencv视频稳像_视频处理_08

基于opencv视频质量检测拍摄角度 opencv视频稳像_特征点_09

基于opencv视频质量检测拍摄角度 opencv视频稳像_视频处理_10

基于opencv视频质量检测拍摄角度 opencv视频稳像_视频处理_11

笑死我了,太有意思了,真想知道那只鸡的感受

 

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

已实现使用IMU进行视频防抖