資源簡介
基于特征點匹配的視頻穩像,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? {
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? {
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? {
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\
評論
共有 條評論