• 大小: 8.44MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-10-09
  • 语言: C/C++
  • 标签: opencv  

资源简介

基于特征点匹配的视频稳像,opencv。有C++和python代码。 这个文件夹里面的代码有更新,详细见https://blog.csdn.net/luohenyj/article/details/88355444

资源截图

代码片段和文件信息

// video_stabilization.cpp : 此文件包含 “main“ 函数。程序执行将在此处开始并结束。
//

#include “pch.h“
#include 
#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

// In frames. The larger the more stable the video but less reactive to sudden panning 移动平均滑动窗口大小
const int SMOOTHING_RADIUS = 50; 

/**
 * @brief 运动信息结构体
 *
 */
struct TransformParam
{
TransformParam() {}
//x轴信息,y轴信息,角度信息
TransformParam(double _dx double _dy double _da)
{
dx = _dx;
dy = _dy;
da = _da;
}

double dx;
double dy;
// angle
double da;

void getTransform(Mat &T)
{
// Reconstruct transformation matrix accordingly to new values 重建变换矩阵
T.at(0 0) = cos(da);
T.at(0 1) = -sin(da);
T.at(1 0) = sin(da);
T.at(1 1) = cos(da);

T.at(0 2) = dx;
T.at(1 2) = dy;
}
};

/**
 * @brief 轨迹结构体
 *
 */
struct Trajectory
{
Trajectory() {}
Trajectory(double _x double _y double _a)
{
x = _x;
y = _y;
a = _a;
}

double x;
double y;
// angle
double a;
};

/**
 * @brief 轨迹累积
 *
 * @param transforms 运动信息结构体
 * @return vector 轨迹结构体
 */
vector cumsum(vector &transforms)
{
// trajectory at all frames 所有帧的运动轨迹
vector trajectory;
// Accumulated frame to frame transform 累加计算xy以及a(角度)
double a = 0;
double x = 0;
double y = 0;

//累加
for (size_t i = 0; i < transforms.size(); i++)
{
x += transforms[i].dx;
y += transforms[i].dy;
a += transforms[i].da;

trajectory.push_back(Trajectory(x y a));
}

return trajectory;
}

/**
 * @brief 平滑运动轨迹
 *
 * @param trajectory 运动轨迹
 * @param radius 窗格大小
 * @return vector
 */
vector smooth(vector &trajectory int radius)
{
//平滑后的运动轨迹
vector smoothed_trajectory;
//移动滑动窗格
for (size_t i = 0; i < trajectory.size(); i++)
{
double sum_x = 0;
double sum_y = 0;
double sum_a = 0;
int count = 0;

for (int j = -radius; j <= radius; j++)
{
if (i + j >= 0 && i + j < trajectory.size())
{
sum_x += trajectory[i + j].x;
sum_y += trajectory[i + j].y;
sum_a += trajectory[i + j].a;

count++;
}
}

double avg_a = sum_a / count;
double avg_x = sum_x / count;
double avg_y = sum_y / count;

smoothed_trajectory.push_back(Trajectory(avg_x avg_y avg_a));
}

return smoothed_trajectory;
}

/**
 * @brief 
 * 
 * @param frame_stabilized 
 */
void fixBorder(Mat &frame_stabilized)
{
//将原图扩大为1.04倍,然后截取原图尺寸相等大小区域
Mat T = getRotationMatrix2D(Point2f(frame_stabilized.cols / 2 frame_stabilized.rows / 2) 0 1.04);
//仿射变换
warpAffine(frame_stabilized frame_stabilized T frame_stabilized.size());
}

int main(int argc char **argv)
{
// Read input video 读取视频
VideoCapture cap(“./video/detect.mp4“);

// Get frame count 读取

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件     8843772  2019-03-07 08:34  video\detect.mp4
     文件       15990  2019-03-08 16:56  video_stabilization.cpp
     文件        4604  2019-03-08 16:48  video_stabilization.py
     目录           0  2019-03-08 16:44  video\

评论

共有 条评论