Skip to content

cuixing158/Video-Stabilization

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Real-Time Video Stabilization Using Kalman Filter

View Video-Stabilization on File Exchange Open in MATLAB Online

本项目实现了基于 光流估计 + Kalman 滤波 的实时视频防抖算法1,能够在视频播放时同时显示防抖前后对比效果。核心算法来源于光流法计算相邻帧的平移、旋转、缩放参数,并通过 Kalman 滤波器进行平滑,最终生成防抖后的稳定视频序列。关于常规Kalman滤波算法原理理解可以参考我于2018年写的博客2,仅供类比参考。

output.mp4

左边为抖动视频,右边为稳定视频

Requirements

  • MATLAB R2022b or later
  • Computer Vision Toolbox™
  • Image Processing Toolbox™

Example

% 输入视频路径
videoPath = "./data/videoShake.m4v";  % 抖动视频

% 读取视频
vReader = VideoReader(videoPath);

% 创建防抖对象
stab = VideoStab();

% 读取第一帧
if hasFrame(vReader)
    prevFrame = readFrame(vReader);
else
    error('视频为空');
end

frameCount = 0;
showObj = imshow([prevFrame,prevFrame]);
t = title(sprintf('Frame %d', frameCount));
while hasFrame(vReader)
    currFrame = readFrame(vReader);
    frameCount = frameCount + 1;

    % 调用 stabilize
    smoothedFrame = stab.stabilize(prevFrame, currFrame);

    % 拼接前后对比
    canvas = imtile({prevFrame,smoothedFrame},GridSize=[1,2]);

    % 如果分辨率太大可以缩放
    if size(canvas,2) > 1920
        scaleFactor = 1920 / size(canvas,2);
        canvas = imresize(canvas, scaleFactor);
    end

    % 显示
    showObj.CData = canvas;
    t.String = sprintf('Frame %d', frameCount);

    % 当前帧变为下一轮的 prevFrame
    prevFrame = currFrame;

    drawnow;
end

References

Footnotes

  1. L. Kejriwal and I. Singh, "A Hybrid Filtering Approach of Digital Video Stabilization for UAV Using Kalman and Low Pass Filter," Procedia Computer Science, vol. 93, pp. 359-366, 2016, doi: 10.1016/j.procs.2016.07.221.

  2. 基于卡尔曼滤波算法在三维球轨迹中跟踪应用

About

Real-Time Video Stabilization Using Kalman Filter

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages