1#include "VVT-V2/vibrating_point.h"
5 bool absolute_peak =
false;
7 std::vector<Point2f> fft_result;
8 std::vector<Point2f> p2;
9 std::vector<Point2f> p1;
10 std::vector<double> frequencies;
11 std::vector<int> indexes_of_peak_frequencies;
12 std::vector<float> magnitudes;
14 std::vector<double> peak_frequencies;
20 double meaned_x = mean_coordinates_of_point_.val[0];
21 double meaned_y = mean_coordinates_of_point_.val[1];
36 for (
int i = 0; i < fft_result.size(); i++)
39 tmp.x = abs(fft_result[i].x / samples_amount);
40 tmp.y = abs(fft_result[i].y / samples_amount);
45 for (
int i = 0; i < p2.size(); i++)
48 idx = (int)(((
double)(i)) / 2.0 + 1.0);
49 p1.push_back(p2[idx]);
53 for (
int i = 0; i < samples_amount; i++)
56 frequencies.push_back(tmp);
59 for (
int i = 0; i < p1.size(); i++)
61 float current_magnitude = sqrt(p1[i].x * p1[i].x + p1[i].y * p1[i].y);
62 magnitudes.push_back(current_magnitude);
98 bool candidate_for_being_full_zero =
false;
109 zero_flag = indexes_of_peak_frequencies.size();
114 for (
int i = 0; i < indexes_of_peak_frequencies.size(); i++)
116 peak_frequencies.push_back(frequencies[indexes_of_peak_frequencies[i]]);
119 mag_sum += magnitudes[indexes_of_peak_frequencies[i]];
120 if ((magnitudes[indexes_of_peak_frequencies[i]]) < 0.01f)
127 float mean_diff_of_max_diffs = 0;
131 if (mean_diff_of_max_diffs <
sensivity_ || std::isnan(mean_diff_of_max_diffs))
136 if (zero_flag == 0 && indexes_of_peak_frequencies.size() != 0)
181 float max_meaned_x = 0;
182 float max_meaned_y = 0;
189 float relative_amplitude_x = 0.0f;
190 float relative_amplitude_y = 0.0f;
193 double meaned_mean_x = mean_of_mean_coordinates_of_point.val[0];
194 double meaned_mean_y = mean_of_mean_coordinates_of_point.val[1];
199 relative_amplitude_x = (max_meaned_x) / (max_meaned_x + max_meaned_y);
200 relative_amplitude_y = (max_meaned_y) / (max_meaned_x + max_meaned_y);
223 if (!(std::isnan(relative_amplitude_x) || std::isnan(relative_amplitude_y)))
void ExecuteFFT()
Выполняет БПФ для нахождения частоты вибрации.
bool interacted_
Флаг взаимодействия с точкой
double GetCurrentConfidenceLevel()
Возвращает последний найденный уровень достоверности
void AddNewPointPosition(Point2f position)
Добавляет новую пространственную координату в конец контейнера VibratingPoint::point_coordinates_;.
virtual void DrawHistogram()=0
Отрисовывает гистограмму спектра частот колебаний точки (полученную после БПФ в методе ExecuteFFT())
std::vector< double > GetCurrentVibrationFrequency()
Возвращает вектор текущих частот точки
bool IsInteracted(Point2i coordinates)
Проверяет точку на наличие взаимодействия с ней (если курсор попал в область взаимодействия точки Vib...
void AddNewPointTime(double time)
Добавляет новую временную координату (время кадра, на котором новая позиция точки была трекнута) в ко...
Point3f current_amplitude_
Фактические амплитуды вибрации по x, y. Выражаюытся в пикселях
Rect interaction_box_
Прямоугольник (область) взаимодействия с точкой
double GetCurrentMainFrequency()
Возвращает текущую "основную" частоту
std::vector< double > y_coordinates_
Контейнер для координат точки по оси Y.
std::vector< double > x_
Контейнер для хранения координат гистограммы по оси X (фактически - найденный спектр частот вибрации ...
std::vector< double > x_coordinates_
Контейнер для координат точки по оси X.
double sampling_rate_
Частота сэмплирования (фактически - FPS исходного видео)
std::vector< float > mag_max_differences_
Максимальная разнциа в магнитудах в найденном спектре после БПФ
double confidence_level_
Рейтинг достоверности вибрации
int interaction_offset_
Половина длины прямоугольника взаимодействия
Point3f relative_amplitude_
Относительные амплитуды вибрации по x, y. Выражается отношением амплитуды
double main_frequency_
Главная частота (основная)
std::vector< float > y_
Контейнер для хранения координат гистограммы по оси Y (фактически - найденные магнитуды точки после в...
std::vector< cv::Point2f > vec_meaned_coordinates_of_point_
Контейнер для координат точки относительно нулевого уровня
double sensivity_
Чувствительность определения вибрации
Point3f GetCurrentAmplitude()
Возвращает последнюю найденную относительную амплитуду
std::vector< double > point_time_coordinates_
Контейнер для временных координат точки
void SetSensivity(double sensivity)
Устанавливает чувствительность, влияющую на confidence.
std::vector< double > frequencies_
Контейнер для частот точки
Point3f GetRelativeAmplitude()
Возвращает последнюю найденную относительную амплитуду
Point2f GetLastFoundCoordinates()
Возвращает последний элемент вектора координат
std::vector< Point2f > point_coordinates_
Контейнер для координат точки
void CalculateAmplitude()
Проводит необходимые для вычисления амплитуды вычисления
void DeadzoneFilter(std::vector< T > &input_vector)
Частотный фильтр для нижней части диапазона
int FindGlobalMaxIdx(std::vector< T > src)
Возвращает индекс самого большого элемента вектора src.
T CalculateMaxDifferenceInVector(std::vector< T > src)
Вычисляет максимальное значение разности элементов массива
T CalculateMeanDifferenceInVector(std::vector< T > src)
Вычисляет среднее значение разности элементов массива в виде ((a0 - a1) + (a1 - a2)) / 3.
void findPeaks(std::vector< float > x0, std::vector< int > &peakInds, bool includeEndpoints=true, float extrema=1)