Visual Vibration Tracking 0.2
Загрузка...
Поиск...
Не найдено
video_undistorter.cpp
1#include "CamCalib\video_undistorter.h"
2
3VideoUndistorter::VideoUndistorter(std::string input_file_name, std::string output_file_name, std::string txt_file_name) :
4 input_file_name_{ input_file_name },
5 output_file_name_{ output_file_name },
6 txt_file_name_{ txt_file_name },
7 winname_{ "Undistortion" }
8{
9 input_cap_ = new VideoCapture(input_file_name);
10
11 frame_width_ = input_cap_->get(CAP_PROP_FRAME_WIDTH);
12 frame_height_ = input_cap_->get(CAP_PROP_FRAME_HEIGHT);
13 frame_count_ = input_cap_->get(CAP_PROP_FRAME_COUNT);
14 fps_ = input_cap_->get(CAP_PROP_FPS);
15
16 output_cap_ = new VideoWriter
17 (
19 cv::VideoWriter::fourcc('m', 'p', '4', 'v'), // codec
20 fps_,
22 );
23
24 namedWindow(winname_, WINDOW_NORMAL);
25}
26
27VideoUndistorter::~VideoUndistorter()
28{
29 input_cap_->release();
30 output_cap_->release();
31
32 delete input_cap_;
33 delete output_cap_;
34
35 destroyWindow(winname_);
36}
37
39{
40 // read distortion parameters from txt file
42
43 std::cout << frame_count_ << std::endl;
44
45 int frame_num = 0;
46 Mat mapX, mapY;
47 initUndistortRectifyMap(camera_matrix_, distortion_coefficients_, Matx33f::eye(), camera_matrix_, Size(frame_width_, frame_height_), CV_32FC1, mapX, mapY);
48 //undistort each frame in loop
49 while (input_cap_->get(CAP_PROP_POS_FRAMES) < frame_count_)
50 {
52 if (!current_frame_.empty())
53 {
54 std::cout << "Processing frame " << input_cap_->get(CAP_PROP_POS_FRAMES) << "/" << frame_count_ << std::endl;
55 //imshow(winname_, current_frame_);
56
57 //undistort(current_frame_, undistorted_frame_, camera_matrix_, distortion_coefficients_);
58 remap(current_frame_, undistorted_frame_, mapX, mapY, INTER_LINEAR);
62
63 int code = waitKey(20);
64 switch (code)
65 {
66 // Пауза
67 // Клавиши - пробел (ASCII code)
68 case 32:
69 {
70 waitKey(0);
71 break;
72 }
73 case 'q':
74 {
75 return 0;
76 break;
77 }
78 }
79 }
80 }
81
82 std::cout << "Undistortion completed" << std::endl;
83 return 1;
84}
85
86void VideoUndistorter::AddTips(Mat& frame, std::string tip)
87{
88 int font = FONT_HERSHEY_PLAIN;
89 double font_scale = 1.5;
90 int thickness = 2;
91
92 putText(
93 frame,
94 tip,
95 Point(frame.cols * 0.05, frame.rows * 0.05),
96 font,
97 font_scale,
98 Scalar(0, 255, 0),
99 thickness
100 );
101}
102
104{
105 output_cap_->write(frame);
106}
107
108void VideoUndistorter::LoadFoundParamsFromFile(std::string txt_file_name)
109{
110
111 std::vector<double> dist;
112
113 std::ifstream file;
114 std::string line;
115 std::vector<std::vector<double>> read_data;
116
117 file.open(txt_file_name);
118 if (file.is_open())
119 {
120 std::cout << "Param file opened" << std::endl;
121
122 while (!file.eof())
123 {
124 file >> line;
125 std::vector<std::string> delimited_line = SplitString(line, ";");
126 delimited_line.erase(delimited_line.begin());
127
128 std::vector<double> data;
129
130 for (int i = 0; i < delimited_line.size(); i++)
131 {
132 data.push_back(std::stod(delimited_line[i]));
133 }
134 read_data.push_back(data);
135 }
136
137 file.close();
138 }
139
140 fx_ = read_data[0][0];
141 fy_ = read_data[1][0];
142 px_ = read_data[2][0];
143 py_ = read_data[3][0];
144 dist = { read_data[4][0], read_data[4][1], read_data[4][2], read_data[4][3], read_data[4][4] };
145
146 std::vector<double> intrin_arr = { fx_, 0, px_, 0, fy_, py_, 0, 0, 1 };
147
148 camera_matrix_ = Mat(3, 3, CV_64F, intrin_arr.data());
149 distortion_coefficients_ = Mat(1, dist.size(), CV_64F, dist.data());
150
151 std::cout << camera_matrix_.size() << std::endl;
152 std::cout << distortion_coefficients_.size() << std::endl;
153 std::cout << camera_matrix_ << std::endl;
154 std::cout << distortion_coefficients_ << std::endl;
155}
156
157std::vector<std::string> VideoUndistorter::SplitString(std::string input_string, std::string delimiter)
158{
159 int start_position = 0;
160 int end_position;
161 int delimiter_length = delimiter.length();
162
163 std::string token;
164 std::vector<std::string> left;
165
166 while ((end_position = input_string.find(delimiter, start_position)) != std::string::npos) {
167 token = input_string.substr(start_position, end_position - start_position);
168 start_position = end_position + delimiter_length;
169 left.push_back(token);
170 }
171
172 left.push_back(input_string.substr(start_position));
173 return left;
174}
175
void AddTips(Mat &frame, std::string tip)
По аналогии с FrameHandler::AddTips добавляет подсказки пользователя. В данном случае это - номер тек...
int ExecuteVideoUndistortion()
Основная часть. Выполняет удаление дисторсии из видео
double fy_
Коэффициент матрицы VideoUndistorter::camera_matrix_.
double frame_height_
Ширина кадра (входного и выходного)
VideoCapture * input_cap_
"Поток" из кадров входного видео (последовательности)
double px_
Коэффициент матрицы VideoUndistorter::camera_matrix_.
double frame_width_
Ширина кадра (входного и выходного)
double fps_
ФПС входного видео
Mat current_frame_
Текущий кадр с дисторсией
double frame_count_
Количество кадров входного видео
Mat camera_matrix_
Та самая матрица, присущая конкретной паре - линща + камера.
Mat distortion_coefficients_
Коэффициенты дисторсии
double py_
Коэффициент матрицы VideoUndistorter::camera_matrix_.
double fx_
Коэффициент матрицы VideoUndistorter::camera_matrix_.
VideoUndistorter(std::string input_file_name_, std::string output_file_name, std::string txt_file_name)
Конструктор этого класса
VideoWriter * output_cap_
"Поток" из кадров выходного видео (последовательности)
std::string winname_
Название главного окна
void SaveFrame(Mat frame)
Сохраняет кадр в выходную последовательность (видео)
void LoadFoundParamsFromFile(std::string txt_file_name)
Загружает параметры (коэффициенты fx, fy, cx, cy), необходимые для удаления дисторсии....
std::string output_file_name_
Путь к выходному видео
std::vector< std::string > SplitString(std::string line, std::string delimiter)
Разделяет строку на некоторое количество подстрок по специальному символу - разделителю
Mat undistorted_frame_
Текущий кадр с удалённой дисторсией
std::string txt_file_name_
Путь к файлу с коэффициентами
std::string ToStringWithPrecision(const T value, const int n=9)
Выполняет округление числа с определенной точностью
Definition: helper.h:49