代码拉取完成,页面将自动刷新
#include "headfile.h"
#include "antishake.h"
using namespace cv;
using namespace std;
/*灰度投影法*/
int shift_h, shift_w; // h、w偏移量
typedef struct GrayVector
{
vector<int> col; // 列灰度 w
vector<int> row; // 行灰度 h
};
GrayVector begin_gray; // 参考灰度向量
// 获取行.列灰度值信息
// 返回 GrayVector
GrayVector get_gray_data(Mat frame)
{
Mat channels[3];
int nCols = frame.cols;
int nRows = frame.rows;
cv::split(frame, channels);
GrayVector temp;
temp.col.resize(nCols, 0);
temp.row.resize(nRows, 0);
while (1)
{
for (int i = 0; i < nRows; i++)
{
for (int j = 0; j < nCols; j++)
{
int data = channels[1].at<uchar>(i, j);
temp.col[j] = temp.col[j] + data;
temp.row[i] = temp.row[i] + data;
}
temp.row[i] = temp.row[i] / nRows;
}
break;
}
for (int j = 0; j < nCols; j++)
{
temp.col[j] = temp.col[j] / nCols;
}
return temp;
}
void antishake_main()
{
Mat frame;
LadleVideo.set(CAP_PROP_POS_FRAMES, 10);
GrayVector master_data,slave_data;
LadleVideo >> frame;
master_data = get_gray_data(frame);
LadleVideo.set(CAP_PROP_POS_FRAMES, 30);
LadleVideo >> frame;
slave_data = get_gray_data(frame);
GrayVector result;
result = cross_correlation(master_data, slave_data);
cout << "size " << result.col.size() << endl;
cout << "number " << result.col[0] << endl;
cout << "size " << result.row.size() << endl;
cout << "number " << result.row[0] << endl;
}
typedef struct MinValueDistance
{
int vaule;
int distance;
}MinValueDistance;
// 返回值: 偏移量
GrayVector cross_correlation(GrayVector master, GrayVector slave)
{
int length_col, length_row;
length_col = master.col.size();
length_row = master.row.size();
GrayVector ReturnValue; // 返回值
int search_distance = 200; // 单侧搜索距离长度 以master为参考 左-右+
MinValueDistance minvalue_col = { 999999,999999 };
MinValueDistance minvalue_row = { 999999,999999 };
// 左搜索
int temp_data = 0;
for (int i = 0; i < search_distance; i++)
{
for (int num = 0; num < length_col - i; num++)
{
int temp = master.col[num] - slave.col[num + i];
temp = temp > 0 ? temp : -temp;
temp_data += temp;
}
if (temp_data < minvalue_col.vaule)
{
minvalue_col.vaule = temp_data;
minvalue_col.distance = -i;
}
temp_data = 0;
}
// 右
for (int i = 0; i < search_distance; i++)
{
for (int num = 0; num < length_col - i; num++)
{
int temp = master.col[num + i] - slave.col[num];
temp = temp > 0 ? temp : -temp;
temp_data += temp;
}
if (temp_data < minvalue_col.vaule)
{
minvalue_col.vaule = temp_data;
minvalue_col.distance = i;
}
temp_data = 0;
}
// 左搜索
for (int i = 0; i < search_distance; i++)
{
for (int num = 0; num < length_row - i; num++)
{
int temp = master.row[num] - slave.row[num + i];
temp = temp > 0 ? temp : -temp;
temp_data += temp;
}
if (temp_data < minvalue_row.vaule)
{
minvalue_row.vaule = temp_data;
minvalue_row.distance = -i;
}
temp_data = 0;
}
// 右
for (int i = 0; i < search_distance; i++)
{
for (int num = 0; num < length_row - i; num++)
{
int temp = master.row[num + i] - slave.row[num];
temp = temp > 0 ? temp : -temp;
temp_data += temp;
}
if (temp_data < minvalue_row.vaule)
{
minvalue_row.vaule = temp_data;
minvalue_row.distance = i;
}
temp_data = 0;
}
ReturnValue.col.push_back(minvalue_col.distance);
ReturnValue.row.push_back(minvalue_row.distance);
return ReturnValue;
}
void show_anti_video()
{
Mat frame;
Mat save_img;
VideoWriter vw;
int fps = LadleVideo.get(CAP_PROP_FPS);
vw.open("./zzzout.avi",
VideoWriter::fourcc('X', '2', '6', '4'),
fps,
Size(LadleVideo.get(CAP_PROP_FRAME_WIDTH),
LadleVideo.get(CAP_PROP_FRAME_HEIGHT))
);
GrayVector master_data, slave_data;
LadleVideo >> frame;
master_data = get_gray_data(frame);
#define ANTISHAKE_SHOW_SAVE 0 /*1-显示 0-保存*/
while (1)
{
LadleVideo >> frame;
if (frame.empty()) {
break;
}
slave_data = get_gray_data(frame);
GrayVector result;
result = cross_correlation(master_data, slave_data);
Mat warp_matrix = (cv::Mat_<float>(2, 3) <<
cos(0), -sin(0), result.col[0], // w
sin(0), cos(0), result.row[0]); // h
warpAffine(frame, save_img, warp_matrix, cv::Size(frame.cols, frame.rows), cv::INTER_LINEAR);
#if 0 == ANTISHAKE_SHOW_SAVE
vw.write(save_img);
std::cout << "第" << LadleVideo.get(CAP_PROP_POS_FRAMES) << std::endl;
#elif 1 == ANTISHAKE_SHOW_SAVE
namedWindow("srcImg", WINDOW_GUI_EXPANDED);
cv::imshow("srcImg", save_img);
cv::waitKey(33);
#endif
}
LadleVideo.release();
vw.release();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。