1 Star 0 Fork 0

wzx046/灰度投影法

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
antishake.cpp 4.68 KB
一键复制 编辑 原始数据 按行查看 历史
wzx046 提交于 2023-04-15 07:35 . 源文件
#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();
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/wzx046/grayscale-projection-method.git
git@gitee.com:wzx046/grayscale-projection-method.git
wzx046
grayscale-projection-method
灰度投影法
master

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385