1#include "VVT-V2\vibration_detector.h"
4 input_file_name_{ input_file_name },
5 output_file_name_{ output_file_name },
6 window_name_{ window_name },
7 warping_figure_selecting_{ false },
8 colored_point_mode_{ COLORING_BASED_ON_FREQUENCY },
9 sensivity_in_percents_{ 1 },
10 roi_selecting_{ false },
12 current_mode_{ DEFAULT },
26VibrationDetector::~VibrationDetector()
68 bool flag_colored_interacted_ =
false;
74 flag_colored_interacted_ =
true;
77 if (flag_colored_interacted_ ==
false)
83 bool flag_lonely_interacted_ =
false;
84 bool flag_colored_interacted_ =
false;
92 flag_lonely_interacted_ =
true;
100 flag_colored_interacted_ =
true;
103 if (flag_lonely_interacted_ ==
false && flag_colored_interacted_ ==
false)
117 std::vector<int> lon_point_ids_to_be_deleted_;
118 std::vector<int> col_point_ids_to_be_deleted_;
126 lon_point_ids_to_be_deleted_.push_back(i);
134 col_point_ids_to_be_deleted_.push_back(i);
137 std::cout <<
"DEBUG: deleting " << lon_point_ids_to_be_deleted_.size() + col_point_ids_to_be_deleted_.size() <<
" point" << std::endl;
140 while (!lon_point_ids_to_be_deleted_.empty())
146 lon_point_ids_to_be_deleted_.erase(std::begin(lon_point_ids_to_be_deleted_));
148 for (
int i = 0; i < lon_point_ids_to_be_deleted_.size(); i++)
151 lon_point_ids_to_be_deleted_[i] = lon_point_ids_to_be_deleted_[i] - 1;
155 while (!col_point_ids_to_be_deleted_.empty())
161 col_point_ids_to_be_deleted_.erase(std::begin(col_point_ids_to_be_deleted_));
163 for (
int i = 0; i < col_point_ids_to_be_deleted_.size(); i++)
166 col_point_ids_to_be_deleted_[i] = col_point_ids_to_be_deleted_[i] - 1;
249 case EVENT_LBUTTONDOWN:
258 case EVENT_RBUTTONDOWN:
264 case EVENT_MOUSEMOVE:
276 case EVENT_LBUTTONDOWN:
287 case EVENT_LBUTTONUP:
300 case EVENT_MOUSEMOVE:
314 Point2f src[4] = { warping_figure[0], warping_figure[1], warping_figure[2], warping_figure[3] };
316 for (
int i = 0; i < 4; i++)
318 src[i].x = src[i].x * coeff;
319 src[i].y = src[i].y * coeff;
320 warping_figure[i].x = warping_figure[i].x * coeff;
321 warping_figure[i].y = warping_figure[i].y * coeff;
329 sqrt((warping_figure[1].x - warping_figure[3].x) * (warping_figure[1].x - warping_figure[3].x)
331 (warping_figure[1].y - warping_figure[3].y) * (warping_figure[1].y - warping_figure[3].y));
334 Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };
336 Mat matrix = getPerspectiveTransform(src, dst);
337 warpPerspective(frame, frame, matrix, Point(w, h));
347 std::vector<Point2f> PrevPts;
348 std::vector<Point2f> NextPts;
349 std::vector<uchar> status;
350 std::vector<float> error;
366 calcOpticalFlowPyrLK(
376 TermCriteria::MAX_ITER | TermCriteria::EPS,
380 OPTFLOW_LK_GET_MIN_EIGENVALS
386 std::cout <<
"DEBUG: ERROR - NextPts size doesnt match vec_point_handlers_ size" << std::endl;
389 std::vector<double> point_amplitudes;
402 point_amplitudes.push_back(sqrt(ampl_x * ampl_x + ampl_y * ampl_y));
419 point_amplitudes.push_back(sqrt(ampl_x * ampl_x + ampl_y * ampl_y));
434 std::vector<Point2f> good_features;
436 if (frame.channels() > 2)
437 cvtColor(frame, frame, COLOR_BGR2GRAY);
440 Mat frame_with_roi = frame(roi);
441 goodFeaturesToTrack(frame_with_roi, good_features, 1000, 0.1, 20, noArray(), 3);
444 for (
int i = 0; i < good_features.size(); i++)
446 good_features[i].x = good_features[i].x + roi.tl().x;
447 good_features[i].y = good_features[i].y + roi.tl().y;
453 auto itt = features_to_be_append.begin();
455 while (itt != features_to_be_append.end())
457 good_features.push_back(*itt);
462 return good_features;
475 Point2i translation_vector = Point2i(x_translation, y_translation);
493 Rect debug_lk_win_size = Rect(
497 rectangle(frame, debug_lk_win_size, Scalar(0, 0, 255), 1);
520 int current_num_of_frame = 0;
526 while ((current_num_of_frame < amount_of_frames - 1) &&
running_ ==
true)
572 int code = waitKey(20);
599 circle(unchanged_frame,
warping_figure_[i], 10, Scalar(255, 207, 64), 2);
620 namedWindow(
"Sensivity Window", WINDOW_FULLSCREEN);
625 destroyWindow(
"Sensivity Window");
681 bool wanna_quit =
false;
692 rectangle(frame, roi, Scalar(0, 255, 0), 1 * (1 /
res_mp_));
Дочерний (от VibratingPoint) класс. Предназначен для помещения множества цветных точек на кадр и отсл...
Класс для создания объектов-обработчиков контуров.
std::vector< Point2f > GetContinousContours()
Возвращает найденные контура в виде { contour_1, contour_2, ... , contour_n }.
Класс для чтения и сохранения кадров видео, а также различной их обработки
int GetAmountOfFrames()
Возвращает общее количество кадров
String GetMainWindowName()
Возвращает название главного окна, в которое выводятся кадры
Mat AddTips(Mat frame, int mode)
Добавляет (отрисовывает) подсказки для пользователя на кадр
bool GetInputCapStatus()
Возвращает текущий статус input_cap.
void ShowFrame(Mat frame, bool fullscreen)
Выводит в главное окно принимаемое изображение
Mat GetCurrentFrame()
Возвращает последний прочитанный на данный момент кадр
void ReadNextFrame()
Считывает следующий кадр видео
void WriteFrame(Mat frame)
Записывает кадр с помощью output_cap.
Mat MakeGrayFrame(Mat frame_to_be_grayed)
Возвращает серый кадр с блюром
double GetCurrentTimeOfFrame()
Возвращает текущее время кадра (таймкод в мс)
int GetInputFps()
Возвращает FPS считываемого видео
int GetCurrentPosOfFrame()
Возвращает текущее положение кадра относительно первого
Mat PutFrameOverFrame(Mat foreground_frame, Mat background_frame, Point2i translation_vector)
Накладывает изображение (переднний план) на другое изображение (задний план)
Mat GenerateGradScale(int left_limit, int right_limit, int colored_point_mode)
Генерирует шкалу с градиентом и подписями. Ширина шкалы - ширина исходного видео. Высота регулируется...
float GetTextResizeFactor()
Возвращает коэффициент масштабирования
Дочерний (от VibratingPoint) класс. Предназначен для помещения точки на кадр и отслеживания её вибрац...
bool IsInteracted(Point2i coordinates)
Проверяет точку на наличие взаимодействия с ней (если курсор попал в область взаимодействия точки Vib...
static std::pair< double, double > extremum_amplitude_
Максимум и минимум амплитуды среди всех VibratingPoint объектов-наследников
Класс для создания объектов-детекторов вибрации
Mat next_img_gray_
Следующий (или текущий после "предыдущего" - смотря как удобнее для понимания) кадр видео в грейскейл...
void CreateNewPoint(Point2f mouse_coordinates)
Создаем "обычную" точку
void DefaultModeHandler(int event, int x, int y)
Обычный режим
std::vector< Point2i > delete_queue_
Очередь на удаление точек
int level_amount_
Количество слоев пирамиды изображений в алгоритме Л-К
void RoiSelectionModeHandler(int event, int x, int y)
Режим выделения региона интереса
static void OnMouse(int event, int x, int y, int flags, void *userdata)
callback functions for detecting the click
bool warping_figure_selecting_
Флаг, показывающий, происходит ли в данный момент выделение фигуры (эта возможность отключена временн...
Mat prev_img_gray_
Предыдущий кадр видео в грейскейл и с небольшим блюром (FrameHandler::MakeGrayFrame())
Mat current_tracking_frame_
Текущий Mat-instance только что найденного кадра из видео
Mat grad_scale_
Изображение цветной шкалы внизу экрана
int sensivity_in_percents_
Чувствительность при трекинге вибрации
std::vector< Point2f > c_point_queue_
Очередь на создание "цветных" точек
bool fullscreen_
Флаг для полноэкранного режима
double frame_time_
Текущее время кадра в мс (таймкод)
std::vector< LonelyPointHandler * > vec_lonely_point_handlers_
Вектор обработчиков "одиноких" точек
VibrationDetector(std::string input_file_name, std::string output_file_name, std::string window_name)
Конструктор класса
std::vector< Point2i > l_click_queue_
Очередь на создание "обычных" точек
FrameHandler * frame_handler
Фреймпроцессор
std::vector< Point2f > FindGoodFeatures(Mat frame, Rect roi)
Находит подходящие для трекинга точки на изображении
float res_mp_
Коэффициент автоскейла размеров окна в зависимости от разрешения исходного видео
std::string input_file_name_
Имя (путь) входного видео
Point last_mouse_position_
Последняя позиция курсора в главном окне
void DeletePoints(Point2i mouse_coordinates)
Удаляем объект "обычную" точку
void CreateNewColoredPoint(Point2f mouse_coordinates)
Обработчик "цветных" точек
int fps_
ФПС входного видео (две ширины полосы частот вибрации, которые можно отследить)
void DetectEvent(int event, int x, int y, int flags)
callback functions for detecting the click
std::string output_file_name_
Имя (путь) видео, в котором будет результат детектинга
void TrackAndCalc()
Трекает точки алгоритмом Лукаса-Канаде и вызывает БПФ
std::vector< Point > warping_figure_
Координаты фигуры для исправления перспективы
void LeftClickHandler(Point2f mouse_coordinates)
Обработчик левых кликов
bool roi_selecting_
Флаг, показывающий происходит ли в данный момент выделение ROI.
void DeleteColoredPoints()
Удаляем объекты "цветная" точка
bool running_
Флаг запущенного основного алгоритма
void FindAndDeleteUncofidentPoints()
Удаляет "цветные" и "обычные" точки, если уровень доверия к нми слишком низкий
int lk_win_size_
Размер окна для алгоритма Лукаса-Канаде
Mat frame_to_be_shown_
Mat-instance, который будет показан в окне
int current_mode_
Основной режим работы (enum main_mode)
void DrawAndOutput(Mat &frame)
Масштабирует, рисует и выводит на экран обработанный кадр с точками
void DrawDebugLkWinRectangle(Mat &frame)
Рисует точки и выводит данные
std::vector< ColoredPointHandler * > vec_colored_point_handlers_
Вектор обработчиков "цветных" точек
std::string output_csv_file_name_
Имя (путь) файла для хранения метаданных
Mat MakeWarpedFrame(Mat frame, std::vector< Point2i > warping_figure)
Удаляет перспективные искажения
void ExecuteVibrationDetection()
Выполняет детекцию вибрации
Point2i tl_click_coords_
Координаты первой точки прямоугольник (top left, bottom left, top right, bottom right - смотря "в как...
void ServeTheQueues()
Обслуживает очереди на удаление и создание. Необходимо для того, чтобы не нарушить нумерацию точек во...
int point_id_
Псевдо-id (порядковывй номер точки)
int colored_point_mode_
Текущий режим подсветки точек при выбранном регионе интереса (по амплитуде/по частоте)
bool roi_selected_
Флаг, показывающий был ли выделен ROI или нет
std::string GenerateCsvFilename(std::string additional_text="")
Генерирует имя CSV файла для сохранения метаданных
int FindGlobalMinIdx(std::vector< T > src)
Возвращает индекс самого маленького элемента вектора src.
int FindGlobalMaxIdx(std::vector< T > src)
Возвращает индекс самого большого элемента вектора src.