Visual Vibration Tracking 0.2
Загрузка...
Поиск...
Не найдено
movement_enlargement.cpp
1#include "MovEn/movement_enlargement.h"
2
3MovementEnlarger::MovementEnlarger(std::string input_file_name, std::string output_file_name) :
4 input_file_name_{ input_file_name },
5 output_file_name_{ output_file_name },
6 win_name_{ "Movement Enlarger" }
7
8{
9 std::cout << "Movement Enlarger constructor" << std::endl;
10}
11
12MovementEnlarger::~MovementEnlarger()
13{
14 std::cout << "Movement Enlarger destructor" << std::endl;
15}
16
18{
20 int current_num_of_frame = 0;
21 int amount_of_frames = frame_handler.GetAmountOfFrames();
22
23 std::vector<Mat> input_pyramid;
24 std::vector<Mat> motion_pyramid;
25 while (current_num_of_frame < amount_of_frames)
26 {
27 frame_handler.ReadNextFrame();
28 // обновляем номер кадра после чтения
29 current_num_of_frame = frame_handler.GetCurrentPosOfFrame();
30 frame_to_be_enlarged_ = frame_handler.GetCurrentFrame();
31
32 // Конвертим цвет
33 frame_to_be_enlarged_.convertTo(frame_to_be_enlarged_, CV_32FC3, 1.0 / 255.0f);
34 cvtColor(frame_to_be_enlarged_, frame_to_be_enlarged_, cv::COLOR_BGR2Lab);
35
36 // Строим пирамиду
38
39 // Если кадр первый - "инициализируем" его "нетронутой" пирамидой (до фильтрации)
40 if (current_num_of_frame == 1)
41 {
42 low_pass_high_pyramid_ = input_pyramid;
43 low_pass_low_pyramid_ = input_pyramid;
44 motion_pyramid = input_pyramid;
45 }
46 else
47 {
48 for (int current_level = 0; current_level < levels_amount_; ++current_level)
49 {
50 IirFilter(input_pyramid[current_level], motion_pyramid[current_level], low_pass_high_pyramid_[current_level], low_pass_low_pyramid_[current_level], cutoff_low_, cutoff_high_);
51 }
52
53 int width = frame_handler.GetFrameWidth();
54 int height = frame_handler.GetFrameHeight();
55
56 delta_ = lambda_cutoff_ / (8.0 * (1.0 + alpha_));
57
58 // Посчитаем показательную длину волны lambda_ для
59 // самых низких частот пространств пирамиды Лапласиан
60 lambda_ = sqrt((width * width + height * height)) / 3.0;
61
62 // Увеличиваем движение на каждом уровне пирамиды
63 for (int current_level = levels_amount_; current_level >= 0; --current_level)
64 {
65 LaplaceEnlarge(motion_pyramid[current_level], current_level);
66 lambda_ /= 2.0;
67 std::cout << "current lambda_ is " << lambda_ << " on level " << current_level << std::endl;
68 }
69 }
70
71 // Теперь соберем изображения обратно из пирамиды
73
74 // Приглушаем побежавшие цвета
75 //Attenuate(frame_with_motion_info_);
76
77 // Добавляем движение на изначальное изображение, исключая первый кадр
78 if (current_num_of_frame > 1)
80 else
82
83 // Конвертим обратно
84 cvtColor(frame_enlarged_, frame_enlarged_, cv::COLOR_Lab2BGR);
85 frame_enlarged_.convertTo(frame_enlarged_, CV_8UC3, 255.0, 1.0 / 255.0);
86
87 // DEBUG
88 std::cout << "frame " << current_num_of_frame << " is processed. The are also " << amount_of_frames - current_num_of_frame << " frames left. " << std::endl;
89
90 frame_handler.ShowFrame(frame_enlarged_, false);
91 frame_handler.WriteFrame(frame_enlarged_);
92
93 int code = waitKey(20);
94 switch (code)
95 {
96 // пауза (пробел)
97 case 32:
98 {
99 waitKey(0);
100 break;
101 }
102 case 'q':
103 {
104 current_num_of_frame = amount_of_frames;
105 std::cout << frame_handler.GetInputCapStatus() << std::endl;
106 break;
107 }
108 }
109 }
110
111}
double lambda_
Показательная длина волны
void IirFilter(Mat &input_pyramid_level, Mat &motion_pyramid_level, Mat &low_pass_high_level, Mat &low_pass_low_level, double cutoff_low, double cutoff_high)
Фильтр для отсекания низких и высоких "пространственных" частот ("фильтр с бесконечной импульсной хар...
void BuildFromLaplacePyramid(std::vector< Mat > &motion_pyramid, Mat &motion_frame, int levels)
Извлекаем выходное изображение из пирамиды Лапласа
int levels_amount_
Количество уровней (слоев) пирамиды
void LaplaceEnlarge(Mat &motion_pyramid_level, int current_level)
Осуществляет увеличение движения на конкретном уровне пирамиды
double delta_
Коэффициент, использующийся при увеличении
void BuildLaplacePyramid(const Mat &input_frame, std::vector< Mat > &input_pyramid, const int levels)
Создает пирамиду изображений
Класс для чтения и сохранения кадров видео, а также различной их обработки
Definition: frame_handler.h:29
int GetAmountOfFrames()
Возвращает общее количество кадров
int GetFrameWidth()
Возвращает ширину исходного видео
bool GetInputCapStatus()
Возвращает текущий статус input_cap.
void ShowFrame(Mat frame, bool fullscreen)
Выводит в главное окно принимаемое изображение
Mat GetCurrentFrame()
Возвращает последний прочитанный на данный момент кадр
void ReadNextFrame()
Считывает следующий кадр видео
void WriteFrame(Mat frame)
Записывает кадр с помощью output_cap.
int GetCurrentPosOfFrame()
Возвращает текущее положение кадра относительно первого
int GetFrameHeight()
Возвращает высоту считываемого видео
void ExecuteLaplaceEnlargement()
Выполняет визуальное увеличение движения
std::string win_name_
Имя окна, в которое будет выводиться обработанный кадр
std::string input_file_name_
имя (путь) входного файла (видео)
Mat frame_with_motion_info_
Mat-сущность, содержащая информацию об увеличенном движении
Mat frame_to_be_enlarged_
Изображение (кадр), движение на котором будет увеличено
std::string output_file_name_
имя (путь) выходного файла (видео)
Mat frame_enlarged_
Изображение (кадр), движение на котором было увеличено
MovementEnlarger(std::string input_file_name, std::string output_file_name)
Конструктор этого класса