Visual Vibration Tracking 0.2
Загрузка...
Поиск...
Не найдено
main_menu.cpp
1#include "GUI/main_menu.h"
2
3MainMenu::MainMenu(std::string params_file_name) :
4 params_file_name_{ params_file_name },
5 winname_{ MAIN_MENU_WINDOW_NAME },
6 menu_width_{ 500 },
7 menu_height_{ 500 },
8 button_amount_{ 4 },
9 mode_chosen_{ false }
10{
11 namedWindow(winname_, WINDOW_AUTOSIZE);
12 // Инициализируем отступы
13 int x = 20;
15 top_offset_ = 3 * x;
16 bottom_offset_ = 5 * x;
17 width_offset_ = 3 * x;
20 // Надписи на кнопках
21 button_text_[0] = "CALIBRATION";
22 button_text_[1] = "UNDISTORTION";
23 button_text_[2] = "VIBRATION MONITORING";
24 button_text_[3] = "MOVEMENT ENLARGEMENT";
25 // Инициализируем контейнер цветов кнопок
26 for (int i = 0; i < button_amount_; i++)
27 {
28 buttons_color_.push_back(Scalar(255, 255, 255));
29 }
30 // Инициализируем атрибуты текста
31 font = FONT_HERSHEY_PLAIN;
32 font_scale = 1;
33 thickness = 2;
34 baseline = 0;
35 // Создание меню на Mat-объекте
36 CreateMenu();
37}
38
40{
41 std::ifstream params_file;
42 params_file.open(params_file_name_);
43
44 if (!params_file.is_open())
45 {
46 std::cout << "Wrong filename" << std::endl;
47 }
48
49 std::getline(params_file, input_calibration_video_);
50 std::getline(params_file, input_distorted_video_);
51 std::getline(params_file, output_undistorted_video_);
52 std::getline(params_file, input_vibration_detection_);
53 std::getline(params_file, output_vibration_detection_);
54 std::getline(params_file, chessboards_path_);
55 std::getline(params_file, input_movement_enlargment_);
56 std::getline(params_file, output_movement_enlargement_);
57}
58
59void MainMenu::ExecuteCameraCalibration(std::string chessboards_path)
60{
61 CameraCalibrator camera_calibrator(chessboards_path);
62 camera_calibrator.ExecuteCameraCalibration();
63}
64
65void MainMenu::ExecuteVideoUndistortion(std::string input_file_name, std::string output_file_name)
66{
67 std::string params;
68
69 std::cout << "Please attach the parameters.txt file: ";
70 std::cin >> params;
71 std::cout << std::endl;
72
73 VideoUndistorter video_undistorter(input_file_name, output_file_name, params);
74 video_undistorter.ExecuteVideoUndistortion();
75}
76
77void MainMenu::ExecuteVibrationMonitoring(std::string input_file_name, std::string output_file_name)
78{
79 VibrationDetector vibration_detector(input_file_name, output_file_name, MAIN_WINDOW_NAME);
80 vibration_detector.ExecuteVibrationDetection();
81}
82
83void MainMenu::ExecuteMotionMagnification(std::string input_file_name, std::string output_file_name)
84{
85 MovementEnlarger movement_enlarger(input_file_name, output_file_name);
86 movement_enlarger.ExecuteLaplaceEnlargement();
87}
88
90{
91 // Создадим кнопки в соответствии с их позициями
92 for (int i = 0; i < button_amount_; i++)
93 {
94 buttons_.push_back
95 (
96 Rect(
97 Point2i(
100 ),
101 Point2i(
104 )
105 )
106 );
107 }
108
109 menu_ = Mat(Size(menu_width_, menu_height_), CV_8UC3, Scalar(0, 0, 0));
110
111 // Подсказка для пользователя
112 std::string tip = "Press 'Q' to quit";
113 putText(
114 menu_,
115 tip,
116 Point(
117 (menu_width_ - getTextSize(tip, font, font_scale, thickness, &baseline).width) / 2,
118 menu_height_ - (bottom_offset_ - getTextSize(tip, font, font_scale, thickness, &baseline).height) / 2),
119 font,
121 Scalar(75, 75, 75),
122 thickness / 2,
123 4
124 );
125
126 Idle();
127}
128
130{
131 for (int i = 0; i < button_amount_; i++)
132 {
133 // Рисуем очертания кнопки
134 rectangle(menu_, buttons_[i], buttons_color_[i], FILLED);
135 // Размеры текста в пикселях
136 Size current_text_size = getTextSize(button_text_[i], font, font_scale, thickness, &baseline);
137 // Координаты текущего текста
138 Point text_coordinates = Point(
139 buttons_[i].tl().x + button_width_ / 2 - current_text_size.width / 2,
140 buttons_[i].tl().y + button_height_ / 2 + (current_text_size.height) / 2);
141 // Рисуем текст кнопки
142 putText(
143 menu_,
144 button_text_[i],
145 text_coordinates,
146 font,
148 Scalar(255, 255, 255),
149 thickness,
150 4 // тип линии. вроде отличаются сглаживанием. выбрал 4-й просто так :)
151 );
152
153 }
154}
155
156void MainMenu::OnMouse(int event, int x, int y, int flags, void* userdata)
157{
158 MainMenu* d = static_cast<MainMenu*>(userdata);
159 d->DetectEvent(event, x, y, flags);
160}
161
162void MainMenu::DetectEvent(int event, int x, int y, int flags)
163{
164 // Загружаем названия директорий
165 LoadPaths();
166
167 switch (event)
168 {
169 case EVENT_LBUTTONDOWN:
170 {
171 for (int i = 0; i < buttons_.size(); i++)
172 {
173 // Если клик пользователя был по кнопке
174 if (buttons_[i].contains(Point(x, y)))
175 {
176 switch (i)
177 {
178 case CALIBRATION:
179 {
180 std::cout << "u've chosen camera calibration" << std::endl;
182 break;
183 }
184 case UNDISTORTION:
185 {
186 std::cout << "u've chosen undistortion" << std::endl;
188 break;
189 }
190 case VIBRATION_MONITORING:
191 {
192 std::cout << "u've chosen vibration monitoring" << std::endl;
194 break;
195 }
196 case MOVEMENT_ENLARGEMENT:
197 {
198 std::cout << "u've chosen movement enlarging" << std::endl;
200 break;
201 }
202 }
203 }
204 }
205 break;
206 }
207 case EVENT_MOUSEMOVE:
208 {
211 break;
212 }
213 }
214}
215
217{
218 // Устанавливаем хэндлер окна
219 setMouseCallback(winname_, OnMouse, (void*)this);
220
221 while (!mode_chosen_)
222 {
223 for (int i = 0; i < buttons_.size(); i++)
224 {
225 if (buttons_[i].contains(last_mouse_position_))
226 {
227 buttons_color_[i] = Scalar(0, 0, 255);
228 }
229 else buttons_color_[i] = Scalar(25, 25, 25);
230 }
231 // Обновляем текущие цвета кнопок
233
234 imshow(winname_, menu_);
235 switch (waitKey(10))
236 {
237 case 'q':
238 {
239 mode_chosen_ = true;
240 break;
241 }
242 }
243 }
244}
Класс для нахождения коэффициентов для конкретной линзы (с помощью которой было снято видео)
Класс для создания начального меню выбора режима работы программы
Definition: main_menu.h:26
void ExecuteCameraCalibration(std::string chessboards_path)
Запускает калибровку камеры по картинкам шахматных досок
Definition: main_menu.cpp:59
std::string input_vibration_detection_
Имя (путь) входного файла (видео) для детекции вибрации
Definition: main_menu.h:201
int button_height_
Высота кнопки
Definition: main_menu.h:134
int font
Шрифт
Definition: main_menu.h:154
Mat menu_
Изображение меню, на котором будет происходить отрисовка
Definition: main_menu.h:106
int thickness
Толщина шрифта
Definition: main_menu.h:162
std::string output_movement_enlargement_
Имя (путь) выходного файла (видео) для усиления движения
Definition: main_menu.h:217
double font_scale
Величина шрифта
Definition: main_menu.h:158
std::string params_file_name_
Путь файла с параметрами
Definition: main_menu.h:98
void ExecuteVideoUndistortion(std::string input_file_name, std::string output_file_name)
Запускает удаление дисторсии
Definition: main_menu.cpp:65
int button_spacing_
Отступ между кнопками
Definition: main_menu.h:138
Point2i last_mouse_position_
Последние найденные в callback координаты курсора
Definition: main_menu.h:171
std::string input_distorted_video_
Имя (путь) входного файла (видео) для удаления дисторсии
Definition: main_menu.h:193
std::string output_vibration_detection_
Имя (путь) выходного файла (видео) после детекции вибрации
Definition: main_menu.h:205
std::string input_calibration_video_
Имя (путь) входного файла (видео) для калибровки
Definition: main_menu.h:189
void CreateMenu()
Строит сетку меню с кнопками и надписями на Mat-объекте menu_.
Definition: main_menu.cpp:89
void Idle()
Definition: main_menu.cpp:216
std::string button_text_[4]
Тексты кнопок
Definition: main_menu.h:114
void ExecuteMotionMagnification(std::string input_file_name, std::string output_file_name)
Запускает увеличение движения
Definition: main_menu.cpp:83
int top_offset_
Отступ от застаканных кнопок сверху
Definition: main_menu.h:142
int menu_width_
Ширина меню
Definition: main_menu.h:118
bool mode_chosen_
Флаг выбранного режима
Definition: main_menu.h:179
std::string winname_
Название окна
Definition: main_menu.h:102
int baseline
Параметр для cv::getText()
Definition: main_menu.h:166
void DetectEvent(int event, int x, int y, int flags)
callback функция для определения события (используется для хэндлинга клика мышью)
Definition: main_menu.cpp:162
void ExecuteVibrationMonitoring(std::string input_file_name, std::string output_file_name)
Запускает детекцию вибрации (основной режим)
Definition: main_menu.cpp:77
int button_width_
Ширина кнопки
Definition: main_menu.h:130
MainMenu(std::string txt_file_name)
Конструктор этого класса
Definition: main_menu.cpp:3
std::string input_movement_enlargment_
Имя (путь) входного файла (видео) для усиления движения
Definition: main_menu.h:213
std::vector< Rect > buttons_
Контейнер, хранящий в себе прямоугольники-кнопки (фактически тут хранятся координаты кнопок)
Definition: main_menu.h:110
int width_offset_
Отступ с двух сторон от кнопки по ширине
Definition: main_menu.h:150
void LoadPaths()
Открывает нужные пути
Definition: main_menu.cpp:39
int button_amount_
Количество кнопок
Definition: main_menu.h:126
std::vector< Scalar > buttons_color_
Контейнер для хранения цвета каждой кнопки
Definition: main_menu.h:175
std::string output_undistorted_video_
Имя (путь) выходного файла (видео) после удаления дисторсии
Definition: main_menu.h:197
int menu_height_
Высота меню
Definition: main_menu.h:122
std::string chessboards_path_
Путь к папке с фотографиями шахматной доски
Definition: main_menu.h:209
int bottom_offset_
Отступ от застаканных кнопок снизу
Definition: main_menu.h:146
void UpdateBtnColorAndText()
Раскрашивает кнопки и наносит на них текст
Definition: main_menu.cpp:129
static void OnMouse(int event, int x, int y, int flags, void *userdata)
callback функция для определения события (используется для хэндлинга клика мышью)
Definition: main_menu.cpp:156
Дочерний (от EulerEnlarger) класс для визуального увеличения вибрации на видео
void ExecuteLaplaceEnlargement()
Выполняет визуальное увеличение движения
Класс для создания объектов-детекторов вибрации
void ExecuteVibrationDetection()
Выполняет детекцию вибрации
Класс для удаления дисторсии на видео
int ExecuteVideoUndistortion()
Основная часть. Выполняет удаление дисторсии из видео