1#include "VVT-V2\frame_handler.h"
3FrameHandler::FrameHandler(
const std::string input_file_name,
const std::string output_file_name,
const std::string main_window_name) :
4 input_cap_{ new VideoCapture(input_file_name) },
5 input_cap_status_{ false },
6 output_cap_{ new VideoWriter(output_file_name, VideoWriter::fourcc(
'D',
'I',
'V',
'X'), input_cap_->get(CAP_PROP_FPS), Size(input_cap_->get(CAP_PROP_FRAME_WIDTH), input_cap_->get(CAP_PROP_FRAME_HEIGHT))) },
7 main_window_name_{ main_window_name },
8 current_time_of_frame_{ 0 },
9 current_pos_of_frame_{ 0 },
11 input_fps_{ input_cap_->get(CAP_PROP_FPS) },
12 input_frame_height_{ input_cap_->get(CAP_PROP_FRAME_HEIGHT) },
13 input_frame_width_{ input_cap_->get(CAP_PROP_FRAME_WIDTH) },
14 input_frame_size_ratio_{ input_frame_width_ / input_frame_height_ },
15 text_resize_factor_{ 1.0f }
17 std::cout <<
"Input fps is: " <<
input_fps_ << std::endl;
26 tip_text_.push_back(
"ROI selecting mode (Press 'R')");
27 tip_text_.push_back(
"Pause (Press 'Space')");
28 tip_text_.push_back(
"Fullscreen (Press 'F')");
31FrameHandler::~FrameHandler()
70 std::vector<Mat> vec_of_frames;
71 vec_of_frames.push_back(left_frame);
72 vec_of_frames.push_back(right_frame);
73 hconcat(vec_of_frames, dst);
80 std::vector<Mat> vec_of_frames;
81 vec_of_frames.push_back(top_frame);
82 vec_of_frames.push_back(bottom_frame);
83 vconcat(vec_of_frames, dst);
90 int channels_number = foreground_frame.channels();
92 if (channels_number != background_frame.channels())
93 return background_frame;
96 std::vector<Mat> foreground_planes(channels_number);
97 split(foreground_frame, foreground_planes);
100 std::vector<Mat> background_planes(channels_number);
101 split(background_frame, background_planes);
104 for (
int foreground_row = 0; foreground_row < foreground_frame.rows; foreground_row++)
107 for (
int foreground_col = 0; foreground_col < foreground_frame.cols; foreground_col++)
110 int translated_col = foreground_col + translation_vector.x;
111 int translated_row = foreground_row + translation_vector.y;
114 if (!((translated_col) < background_frame.cols && (translated_row) < background_frame.rows))
120 auto backgnd_it = background_planes.begin();
121 auto foregnd_it = foreground_planes.begin();
122 while (backgnd_it != background_planes.end())
125 backgnd_it->at<uchar>(translated_row, translated_col) = foregnd_it->at<uchar>(foreground_row, foreground_col);
133 merge(background_planes, result);
141 if (!frame_to_be_grayed.empty())
144 cvtColor(frame_to_be_grayed, grayed_frame, COLOR_BGR2GRAY);
145 GaussianBlur(grayed_frame, grayed_frame, Size(3, 3), 0);
204 int font = FONT_HERSHEY_PLAIN;
208 int line_spacing = 5;
209 int border_offset = 15;
210 Scalar default_tip_color(150, 150, 150);
211 Scalar mode_color(100, 255, 100);
213 for (
int i = 0; i <
tip_text_.size() - 1; i++)
215 Scalar font_color = default_tip_color;
218 font_color = mode_color;
237 Scalar font_color = default_tip_color;
240 font_color = Scalar(255, 100, 100);
261 int font = FONT_HERSHEY_PLAIN;
266 int font_height = getTextSize(
"tmp", font, font_scale, thickness, &baseline).height;
269 int scale_height = 10;
270 int mat_height = scale_height + font_height + font_offset;
274 Mat frame = Mat(Size(mat_width, mat_height),
current_frame_.type(), Scalar(0, 0, 0));
275 float interval =
static_cast<float>(scale_width) /
static_cast<float>(right_limit - left_limit + 1);
280 for (
int x = left_limit; x <= right_limit; x++)
282 Rect scale_unit = Rect(
283 Point2f(interval * iteration + scale_left_offset, 0),
284 Point2f(interval + interval * iteration + scale_left_offset, scale_height)
293 std::string scale_signature = std::to_string(x);
294 Size current_text_size = getTextSize(scale_signature, font, font_scale, thickness, &baseline);
300 scale_unit.tl().x + (interval) / 2 - current_text_size.width / 2,
301 scale_unit.br().y + scale_height + (current_text_size.height) / 2
305 Scalar(255, 255, 255),
315 std::string coloring_points_mode_tips[3] = {
"Default",
"Coloring by Frequency",
"Coloring by Amplitude" };
316 Size current_text_size = getTextSize(coloring_points_mode_tips[colored_point_mode], font, font_scale, thickness, &baseline);
318 std::cout <<
"current mode: " << coloring_points_mode_tips[colored_point_mode] << std::endl;
322 coloring_points_mode_tips[colored_point_mode],
324 scale_left_offset / 2 - current_text_size.width / 2,
325 mat_height / 2 + current_text_size.height / 2
329 Scalar(255, 255, 255),
bool fullscreen_
Флаг полноэкранного режима
int GetAmountOfFrames()
Возвращает общее количество кадров
double current_time_of_frame_
Текущее время кадра из последовательности
String GetMainWindowName()
Возвращает название главного окна, в которое выводятся кадры
int GetFrameWidth()
Возвращает ширину исходного видео
Mat AddTips(Mat frame, int mode)
Добавляет (отрисовывает) подсказки для пользователя на кадр
bool GetInputCapStatus()
Возвращает текущий статус input_cap.
void ShowFrame(Mat frame, bool fullscreen)
Выводит в главное окно принимаемое изображение
FrameHandler(const std::string input_file_name, const std::string output_file_name, const std::string main_window_name)
Конструктор этого класса
Mat current_frame_
Последнний прочитанный кадр
Mat GetCurrentFrame()
Возвращает последний прочитанный на данный момент кадр
std::vector< std::string > tip_text_
Тексты подсказок для пользователя
void ReadNextFrame()
Считывает следующий кадр видео
void WriteFrame(Mat frame)
Записывает кадр с помощью output_cap.
Mat MakeGrayFrame(Mat frame_to_be_grayed)
Возвращает серый кадр с блюром
float text_resize_factor_
Коэффициент масштабирования текста (зависит от разрешения исходного видео)
double input_fps_
FPS исходного видео
VideoCapture * input_cap_
Указатель на объект-захватчик входных кадров видео
double GetCurrentTimeOfFrame()
Возвращает текущее время кадра (таймкод в мс)
bool input_cap_status_
Флаг, принимающий true при удачном чтении кадра и false, если следующий кадр не был считан
int GetInputFps()
Возвращает FPS считываемого видео
int GetCurrentPosOfFrame()
Возвращает текущее положение кадра относительно первого
Mat PutFrameOverFrame(Mat foreground_frame, Mat background_frame, Point2i translation_vector)
Накладывает изображение (переднний план) на другое изображение (задний план)
double input_frame_height_
Высота кадра исходного видео
Mat ConcatenateFramesVertically(Mat top_frame, Mat bottom_frame)
Объединяет два кадра вертикально
Mat ConcatenateFramesHorizontally(Mat left_frame, Mat right_frame)
Объединяет два кадра горизонтально
int GetFrameHeight()
Возвращает высоту считываемого видео
Mat GenerateGradScale(int left_limit, int right_limit, int colored_point_mode)
Генерирует шкалу с градиентом и подписями. Ширина шкалы - ширина исходного видео. Высота регулируется...
double input_frame_width_
Ширина кадра исходного видео
void InitTextResizeFactors()
Инициализирует коэффициент масштабирования текста в зависимости от разрешения видео
float GetTextResizeFactor()
Возвращает коэффициент масштабирования
int current_pos_of_frame_
Текущий номер кадра из последовательности
std::string main_window_name_
Имя главного окна
VideoWriter * output_cap_
Указатель на объект, сохраняющий кадры в последовательность (видео) в зависимости от выбранного кодек...
double input_frame_size_ratio_
Соотношение сторон исходного видео
cv::Scalar RatioToRgb(double ratio)
Генерирует имя TXT файла для сохранени