资源简介
基于特征点匹配的视频稳像,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\
相关资源
- 人脸识别(opencv_facedetect_v4l2)
- 基于opencv的模板匹配代码
- opencv图片扫描以及校正
- opencv手部轮廓识别以及轨迹识别
- opencv2 3D标定.cpp
- 基于opencv漫水填充算法综合
- opencv激光中心线的提取
- OpenCV Computer Vision Application Programming
- 基于图割的图像分割OpenCV+MFC实现
- 识别魔方颜色
- opencv版俄罗斯方块源码
- VS2013 / MFC + OpenCV 2.4.9实现视频的播放
- 粒子滤波器+目标跟踪的C++实现,VS2
- 张平OpenCV算法精讲基于python和C++教材
- 虹膜识别开源代码OSIRIS4.1基于opencv
- Sift特征点提取与匹配opencv库
- YCbCr、混合高斯以及YCbCg肤色检测模型
- 光流法代码
- OpenCV打开摄像机显示在MFC窗口工程源
- 使用c++读取图像到二维矩阵
- 三维点云的圆柱面拟合
- MFC+OPENCV摄像机标定程序
- 基于特征脸的人脸识别MFC+OpenCV
- opencv图像处理MFC
- OPENCV人脸检测加角点检测并输出坐标
- FillHole.rar
- 道路提取算法 c++ opencv
- PCA代码实现详解
- opencv卡尔曼滤波
- SeamCarving opencv c++
评论
共有 条评论