资源简介
基于特征点匹配的视频稳像,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\
相关资源
- 制作自己的MFC MDI OPENCV程序框架
- 基于opencv开发的谷歌小恐龙的小游戏
- OpenCV图像模糊程序 by浅墨
- Opencv和vc++6.0一些常用图像处理算法程
- c++开发ocx入门实践三--基于opencv的简易
- opencv+c++实现人脸识别
- 基于OPENCV的完整图像处理程序
- MFC下opencv的图像处理源码
- OpenCV C++完整的车牌识别系统.rar
- OpenCV_MFC_版本1.0.1
- OpenCV_MFC_版本1.0
- opencv MFC 摄像头 人脸识别
- 实用的角度识别OPENCV
- opencv结合MFC进行人脸检测
- 基于opencv的傅里叶描述子VC++代码
- 简单的OpenCV实现摄像头实时显示和视
- Mastering Opencv3英文第二版
- Opencv+MFC框架图像处理
- opencv之数字识别
- grabcut的c++源代码
- 遥感图像拉伸代码
- 车牌识别 openCV mfc BP神经网络
- 基于VC++与OpenCV的圆心坐标提取
- vc下的sift程序
- 用openCV实现图像灰度化并保存,MFC实
- OpenCV多通道图像混合程序 by浅墨
- 经典手眼标定算法C++代码
- OpenCV打开图片和网络摄像头(C++)
- python3.x Opencv Toturial
- 利用MFC和OpenCV实现的图片浏览器,支
评论
共有 条评论