Visual Vibration Tracking 0.2
Загрузка...
Поиск...
Не найдено
Открытые члены | Статические открытые данные | Защищенные члены | Защищенные данные | Закрытые данные | Полный список членов класса
Класс VibratingPointabstract

Абстрактный класс для описания вибрирующей точки Подробнее...

#include <vibrating_point.h>

Граф наследования:VibratingPoint:
Inheritance graph
[см. легенду]

Открытые члены

void ExecuteFFT ()
 Выполняет БПФ для нахождения частоты вибрации. Подробнее...
 
void AddNewPointPosition (Point2f position)
 Добавляет новую пространственную координату в конец контейнера VibratingPoint::point_coordinates_;. Подробнее...
 
void AddNewPointTime (double time)
 Добавляет новую временную координату (время кадра, на котором новая позиция точки была трекнута) в конец контейнера VibratingPoint::point_time_coordinates_;. Подробнее...
 
bool IsInteracted (Point2i coordinates)
 Проверяет точку на наличие взаимодействия с ней (если курсор попал в область взаимодействия точки VibratingPoint::interaction_box_) Подробнее...
 
void SetSensivity (double sensivity)
 Устанавливает чувствительность, влияющую на confidence. Подробнее...
 
void CalculateAmplitude ()
 Проводит необходимые для вычисления амплитуды вычисления Подробнее...
 
virtual void Draw (Mat &frame)=0
 Отрисовывает точку на кадре Подробнее...
 
Point2f GetLastFoundCoordinates ()
 Возвращает последний элемент вектора координат Подробнее...
 
std::vector< double > GetCurrentVibrationFrequency ()
 Возвращает вектор текущих частот точки Подробнее...
 
double GetCurrentMainFrequency ()
 Возвращает текущую "основную" частоту Подробнее...
 
Point3f GetRelativeAmplitude ()
 Возвращает последнюю найденную относительную амплитуду Подробнее...
 
Point3f GetCurrentAmplitude ()
 Возвращает последнюю найденную относительную амплитуду Подробнее...
 
double GetCurrentConfidenceLevel ()
 Возвращает последний найденный уровень достоверности Подробнее...
 

Статические открытые данные

static std::pair< double, double > extremum_amplitude_
 Максимум и минимум амплитуды среди всех VibratingPoint объектов-наследников Подробнее...
 

Защищенные члены

virtual void DrawHistogram ()=0
 Отрисовывает гистограмму спектра частот колебаний точки (полученную после БПФ в методе ExecuteFFT()) Подробнее...
 
virtual void UpdatePointColor ()=0
 Обновляем текущий цвет точки Подробнее...
 

Защищенные данные

Rect interaction_box_
 Прямоугольник (область) взаимодействия с точкой Подробнее...
 
int interaction_offset_
 Половина длины прямоугольника взаимодействия Подробнее...
 
bool interacted_
 Флаг взаимодействия с точкой Подробнее...
 
Point3f relative_amplitude_
 Относительные амплитуды вибрации по x, y. Выражается отношением амплитуды Подробнее...
 
Point3f current_amplitude_
 Фактические амплитуды вибрации по x, y. Выражаюытся в пикселях Подробнее...
 
std::vector< Point2f > point_coordinates_
 Контейнер для координат точки Подробнее...
 
std::vector< double > x_coordinates_
 Контейнер для координат точки по оси X. Подробнее...
 
std::vector< double > y_coordinates_
 Контейнер для координат точки по оси Y. Подробнее...
 
std::vector< cv::Point2f > vec_meaned_coordinates_of_point_
 Контейнер для координат точки относительно нулевого уровня Подробнее...
 
std::vector< double > frequencies_
 Контейнер для частот точки Подробнее...
 
double main_frequency_
 Главная частота (основная) Подробнее...
 
std::vector< double > point_time_coordinates_
 Контейнер для временных координат точки Подробнее...
 
double sampling_rate_
 Частота сэмплирования (фактически - FPS исходного видео) Подробнее...
 
int current_point_radius_
 Радиус точки, который нужен для её отрисовки Подробнее...
 
int default_point_radius_
 Дефолтный радиус точки Подробнее...
 
std::vector< double > x_
 Контейнер для хранения координат гистограммы по оси X (фактически - найденный спектр частот вибрации точки после выполнения БПФ) Подробнее...
 
std::vector< float > y_
 Контейнер для хранения координат гистограммы по оси Y (фактически - найденные магнитуды точки после выполнения БПФ) Подробнее...
 
double sensivity_
 Чувствительность определения вибрации Подробнее...
 
double confidence_level_
 Рейтинг достоверности вибрации Подробнее...
 

Закрытые данные

std::vector< float > mag_max_differences_
 Максимальная разнциа в магнитудах в найденном спектре после БПФ Подробнее...
 

Подробное описание

Абстрактный класс для описания вибрирующей точки

Объект класса-наследника будет иметь возможность добавления новых пространственных и временных позиций, нахождения частоты вибрации точки на кадре на основе этих данных (ExecuteFFT())

А также проверить пересечение курсором области взаимодействия с точкой (метод IsInteracted())

См. определение в файле vibrating_point.h строка 24

Методы

◆ AddNewPointPosition()

void VibratingPoint::AddNewPointPosition ( Point2f  position)

Добавляет новую пространственную координату в конец контейнера VibratingPoint::point_coordinates_;.

Аргументы
positionкоординаты точки

См. определение в файле vibrating_point.cpp строка 149

150{
151 // Обновляем прямоугольник взаимодействия
152 interaction_box_ = Rect(
153 Point2i(position.x - interaction_offset_, position.y - interaction_offset_),
154 Point2i(position.x + interaction_offset_, position.y + interaction_offset_)
155 );
156
157 point_coordinates_.push_back(position);
158}
Rect interaction_box_
Прямоугольник (область) взаимодействия с точкой
int interaction_offset_
Половина длины прямоугольника взаимодействия
std::vector< Point2f > point_coordinates_
Контейнер для координат точки

◆ AddNewPointTime()

void VibratingPoint::AddNewPointTime ( double  time)

Добавляет новую временную координату (время кадра, на котором новая позиция точки была трекнута) в конец контейнера VibratingPoint::point_time_coordinates_;.

Аргументы
timeвремя в миллисекундах

См. определение в файле vibrating_point.cpp строка 160

161{
162 point_time_coordinates_.push_back(time);
163}
std::vector< double > point_time_coordinates_
Контейнер для временных координат точки

◆ CalculateAmplitude()

void VibratingPoint::CalculateAmplitude ( )

Проводит необходимые для вычисления амплитуды вычисления

for amplitude calculation

См. определение в файле vibrating_point.cpp строка 176

177{
181 float max_meaned_x = 0;
182 float max_meaned_y = 0;
183
184 // Создаем контей
185
188
189 float relative_amplitude_x = 0.0f;
190 float relative_amplitude_y = 0.0f;
191
192 Scalar mean_of_mean_coordinates_of_point = mean(vec_meaned_coordinates_of_point_);
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];
195
197 if (point_coordinates_.size() > 2)
198 {
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);
201 }
202
203 /*
204 // FOR DEBUG PURPOSES
205 if (std::isnan(relative_amplitude_x) || std::isnan(relative_amplitude_y))
206 {
207 std::cout << "!DEBUG first inf (x): " << relative_amplitude_x << " second inf (y): " << relative_amplitude_y << std::endl;
208 std::cout << "!DEBUG max_meaned_x: " << vec_meaned_coordinates_of_point_[HelperFunctions::FindGlobalMaxIdx(x_coordinates)].x << " max_meaned_y: " << vec_meaned_coordinates_of_point_[HelperFunctions::FindGlobalMaxIdx(y_coordinates)].y << std::endl;
209 std::cout << "vec size: " << point_coordinates_.size() << std::endl;
210 for (int i = 0; i < point_coordinates_.size(); i++)
211 {
212 std::cout << i << "-th coords: " << point_coordinates_[i] << std::endl;
213 }
214 }
215
216 if ((relative_amplitude_x > 1) || (relative_amplitude_y > 1))
217 {
218 std::cout << "!DEBUG first big (x): " << relative_amplitude_x << " second big (y): " << relative_amplitude_y << std::endl;
219 std::cout << "!DEBUG max_meaned_x: " << max_meaned_x << " max_meaned_y: " << max_meaned_y << std::endl;
220 }
221 */
222
223 if (!(std::isnan(relative_amplitude_x) || std::isnan(relative_amplitude_y)))
224 {
225 relative_amplitude_.x = relative_amplitude_x;
226 relative_amplitude_.y = relative_amplitude_y;
227 current_amplitude_.x = max_meaned_x - meaned_mean_x;
228 current_amplitude_.y = max_meaned_y - meaned_mean_y;
229 }
230}
Point3f current_amplitude_
Фактические амплитуды вибрации по x, y. Выражаюытся в пикселях
std::vector< double > y_coordinates_
Контейнер для координат точки по оси Y.
std::vector< double > x_coordinates_
Контейнер для координат точки по оси X.
Point3f relative_amplitude_
Относительные амплитуды вибрации по x, y. Выражается отношением амплитуды
std::vector< cv::Point2f > vec_meaned_coordinates_of_point_
Контейнер для координат точки относительно нулевого уровня
int FindGlobalMaxIdx(std::vector< T > src)
Возвращает индекс самого большого элемента вектора src.
Definition: helper.h:127

◆ Draw()

virtual void VibratingPoint::Draw ( Mat &  frame)
pure virtual

Отрисовывает точку на кадре

Аргументы
frameизображение, на котором будет происходить отрисовка

Замещается в ColoredPointHandler и LonelyPointHandler.

◆ DrawHistogram()

virtual void VibratingPoint::DrawHistogram ( )
protectedpure virtual

Отрисовывает гистограмму спектра частот колебаний точки (полученную после БПФ в методе ExecuteFFT())

Замещается в ColoredPointHandler и LonelyPointHandler.

◆ ExecuteFFT()

void VibratingPoint::ExecuteFFT ( )

Выполняет БПФ для нахождения частоты вибрации.

После выполнения записывает в контейнер frequencies_ найденные пики, а также добавляет в контейнер x_ найденный спектр частот вибрации (для отображения гистограммы)

См. определение в файле vibrating_point.cpp строка 3

4{
5 bool absolute_peak = false;
6
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;
13
14 std::vector<double> peak_frequencies;
15
16 int samples_amount = point_coordinates_.size();
17
18 Scalar mean_coordinates_of_point_ = mean(point_coordinates_);
19 //std::cout << mean_coordinates_of_point_ << std::endl;
20 double meaned_x = mean_coordinates_of_point_.val[0];
21 double meaned_y = mean_coordinates_of_point_.val[1];
22
24 x_coordinates_.clear();
25 y_coordinates_.clear();
26 for (int i = 0; i < point_coordinates_.size(); i++)
27 {
28 vec_meaned_coordinates_of_point_.push_back(Point2f(point_coordinates_[i].x - meaned_x, point_coordinates_[i].y - meaned_y));
29 x_coordinates_.push_back(point_coordinates_[i].x - meaned_x);
30 y_coordinates_.push_back(point_coordinates_[i].y - meaned_y);
31 }
32
33 dft(vec_meaned_coordinates_of_point_, fft_result);
34
35 // computing two-sided spectrum P2
36 for (int i = 0; i < fft_result.size(); i++)
37 {
38 Point2f tmp;
39 tmp.x = abs(fft_result[i].x / samples_amount);
40 tmp.y = abs(fft_result[i].y / samples_amount);
41 p2.push_back(tmp);
42 }
43
44 // computing single-sided spectrum P1 based on P2 and the even-valued signal length (the same as size_of_vecs_)
45 for (int i = 0; i < p2.size(); i++)
46 {
47 size_t idx = 0;
48 idx = (int)(((double)(i)) / 2.0 + 1.0);
49 p1.push_back(p2[idx]);
50 }
51
52 // possible frequencies
53 for (int i = 0; i < samples_amount; i++)
54 {
55 float tmp = sampling_rate_ * ((double)(i) / 2) / samples_amount;
56 frequencies.push_back(tmp);
57 }
58
59 for (int i = 0; i < p1.size(); i++)
60 {
61 float current_magnitude = sqrt(p1[i].x * p1[i].x + p1[i].y * p1[i].y);
62 magnitudes.push_back(current_magnitude);
63 }
64
67
68 /*
69 * FOR DEBUG
70 *
71 if (point_coordinates_.size() > 5)
72 {
73 std::fstream file;
74 file.open("C:/Users/seeyo/source/repos/Visual-Vibration-Tracking-V2/docs/magnitudes.txt", 'w');
75
76 //for (int i = 0; i < magnitudes.size(); i++)
77 //{
78 // std::string tmp = std::to_string(frequencies[i]) + " " + std::to_string(magnitudes[i]) + " " + std::to_string(p1[i].x) + " " + std::to_string(p1[i].y);
79 // file << tmp << std::endl;
80 //}
81
82 for (int i = 0; i < point_coordinates_.size(); i++)
83 {
84 std::string tmp = std::to_string(point_coordinates_[i].x) + " " + std::to_string(point_coordinates_[i].y) + " " + std::to_string(point_time_coordinates_[i]);
85 file << tmp << std::endl;
86 }
87
88 file.close();
89 }
90 */
91
92 x_ = frequencies;
93 y_ = magnitudes;
94
95 // Вызов отрисовщика гистограммы
97
98 bool candidate_for_being_full_zero = false;
99 int zero_flag = 0;
100
101 if (!absolute_peak)
102 {
103 // searching peaks in output vector of magnitudes
104
105 PeakFinder::findPeaks(magnitudes, indexes_of_peak_frequencies, false, 1);
106
107 int maxIdx = 0;
108
109 zero_flag = indexes_of_peak_frequencies.size();
110
111 double mag_sum = 0;
112
113 // filling in vector of peak_frequencies with the just found peak frequencies
114 for (int i = 0; i < indexes_of_peak_frequencies.size(); i++)
115 {
116 peak_frequencies.push_back(frequencies[indexes_of_peak_frequencies[i]]);
117
118 //std::cout << "mag: " << magnitudes[indexes_of_peak_frequencies[i]] << std::endl;
119 mag_sum += magnitudes[indexes_of_peak_frequencies[i]];
120 if ((magnitudes[indexes_of_peak_frequencies[i]]) < 0.01f)
121 zero_flag--;
122 }
123
124 main_frequency_ = frequencies[HelperFunctions::FindGlobalMaxIdx(magnitudes)];
125 float max_diff = HelperFunctions::CalculateMaxDifferenceInVector(magnitudes);
126 mag_max_differences_.push_back(max_diff);
127 float mean_diff_of_max_diffs = 0;
128 if (mag_max_differences_.size() > 1)
130
131 if (mean_diff_of_max_diffs < sensivity_ || std::isnan(mean_diff_of_max_diffs))
132 confidence_level_ -= 0.01;
133 else
134 confidence_level_ += 0.01;
135
136 if (zero_flag == 0 && indexes_of_peak_frequencies.size() != 0)
137 {
138 frequencies_.clear();
139 frequencies_.push_back(0.0);
140 }
141 else
142 {
143 frequencies_ = peak_frequencies;
144 }
145 }
146
147}
virtual void DrawHistogram()=0
Отрисовывает гистограмму спектра частот колебаний точки (полученную после БПФ в методе ExecuteFFT())
std::vector< double > x_
Контейнер для хранения координат гистограммы по оси X (фактически - найденный спектр частот вибрации ...
double sampling_rate_
Частота сэмплирования (фактически - FPS исходного видео)
std::vector< float > mag_max_differences_
Максимальная разнциа в магнитудах в найденном спектре после БПФ
double confidence_level_
Рейтинг достоверности вибрации
double main_frequency_
Главная частота (основная)
std::vector< float > y_
Контейнер для хранения координат гистограммы по оси Y (фактически - найденные магнитуды точки после в...
double sensivity_
Чувствительность определения вибрации
std::vector< double > frequencies_
Контейнер для частот точки
void DeadzoneFilter(std::vector< T > &input_vector)
Частотный фильтр для нижней части диапазона
Definition: helper.h:61
T CalculateMaxDifferenceInVector(std::vector< T > src)
Вычисляет максимальное значение разности элементов массива
Definition: helper.h:171
T CalculateMeanDifferenceInVector(std::vector< T > src)
Вычисляет среднее значение разности элементов массива в виде ((a0 - a1) + (a1 - a2)) / 3.
Definition: helper.h:96
void findPeaks(std::vector< float > x0, std::vector< int > &peakInds, bool includeEndpoints=true, float extrema=1)
Definition: peak_finder.cpp:66

◆ GetCurrentAmplitude()

Point3f VibratingPoint::GetCurrentAmplitude ( )

Возвращает последнюю найденную относительную амплитуду

См. определение в файле vibrating_point.cpp строка 252

253{
254 return current_amplitude_;
255}

◆ GetCurrentConfidenceLevel()

double VibratingPoint::GetCurrentConfidenceLevel ( )

Возвращает последний найденный уровень достоверности

См. определение в файле vibrating_point.cpp строка 257

258{
259 return confidence_level_;
260}

◆ GetCurrentMainFrequency()

double VibratingPoint::GetCurrentMainFrequency ( )

Возвращает текущую "основную" частоту

См. определение в файле vibrating_point.cpp строка 242

243{
244 return main_frequency_;
245}

◆ GetCurrentVibrationFrequency()

std::vector< double > VibratingPoint::GetCurrentVibrationFrequency ( )

Возвращает вектор текущих частот точки

См. определение в файле vibrating_point.cpp строка 237

238{
239 return frequencies_;
240}

◆ GetLastFoundCoordinates()

Point2f VibratingPoint::GetLastFoundCoordinates ( )

Возвращает последний элемент вектора координат

См. определение в файле vibrating_point.cpp строка 232

233{
234 return point_coordinates_.back();
235}

◆ GetRelativeAmplitude()

Point3f VibratingPoint::GetRelativeAmplitude ( )

Возвращает последнюю найденную относительную амплитуду

См. определение в файле vibrating_point.cpp строка 247

248{
249 return relative_amplitude_;
250}

◆ IsInteracted()

bool VibratingPoint::IsInteracted ( Point2i  coordinates)

Проверяет точку на наличие взаимодействия с ней (если курсор попал в область взаимодействия точки VibratingPoint::interaction_box_)

Аргументы
coordinatesкоординаты курсора

См. определение в файле vibrating_point.cpp строка 165

166{
167 interacted_ = interaction_box_.contains(coordinates);
168 return interacted_;
169}
bool interacted_
Флаг взаимодействия с точкой

◆ SetSensivity()

void VibratingPoint::SetSensivity ( double  sensivity)

Устанавливает чувствительность, влияющую на confidence.

См. определение в файле vibrating_point.cpp строка 171

172{
173 sensivity_ = sensivity;
174}

◆ UpdatePointColor()

virtual void VibratingPoint::UpdatePointColor ( )
protectedpure virtual

Обновляем текущий цвет точки

Замещается в ColoredPointHandler и LonelyPointHandler.

Данные класса

◆ confidence_level_

double VibratingPoint::confidence_level_
protected

Рейтинг достоверности вибрации

См. определение в файле vibrating_point.h строка 188

◆ current_amplitude_

Point3f VibratingPoint::current_amplitude_
protected

Фактические амплитуды вибрации по x, y. Выражаюытся в пикселях

См. определение в файле vibrating_point.h строка 131

◆ current_point_radius_

int VibratingPoint::current_point_radius_
protected

Радиус точки, который нужен для её отрисовки

См. определение в файле vibrating_point.h строка 167

◆ default_point_radius_

int VibratingPoint::default_point_radius_
protected

Дефолтный радиус точки

См. определение в файле vibrating_point.h строка 171

◆ extremum_amplitude_

std::pair<double, double> VibratingPoint::extremum_amplitude_
inlinestatic

Максимум и минимум амплитуды среди всех VibratingPoint объектов-наследников

inline - для совмещенного объявления с определением переменной внутри класса

См. определение в файле vibrating_point.h строка 106

◆ frequencies_

std::vector<double> VibratingPoint::frequencies_
protected

Контейнер для частот точки

См. определение в файле vibrating_point.h строка 151

◆ interacted_

bool VibratingPoint::interacted_
protected

Флаг взаимодействия с точкой

True - в случае взаимодействия, false - в противном

См. определение в файле vibrating_point.h строка 122

◆ interaction_box_

Rect VibratingPoint::interaction_box_
protected

Прямоугольник (область) взаимодействия с точкой

См. определение в файле vibrating_point.h строка 112

◆ interaction_offset_

int VibratingPoint::interaction_offset_
protected

Половина длины прямоугольника взаимодействия

См. определение в файле vibrating_point.h строка 116

◆ mag_max_differences_

std::vector<float> VibratingPoint::mag_max_differences_
private

Максимальная разнциа в магнитудах в найденном спектре после БПФ

См. также
ExecuteFFT() и confidence_level_ - используется для определения "уровня достоверности" результатов у конкретной точки

См. определение в файле vibrating_point.h строка 195

◆ main_frequency_

double VibratingPoint::main_frequency_
protected

Главная частота (основная)

См. определение в файле vibrating_point.h строка 155

◆ point_coordinates_

std::vector<Point2f> VibratingPoint::point_coordinates_
protected

Контейнер для координат точки

См. определение в файле vibrating_point.h строка 135

◆ point_time_coordinates_

std::vector<double> VibratingPoint::point_time_coordinates_
protected

Контейнер для временных координат точки

См. определение в файле vibrating_point.h строка 159

◆ relative_amplitude_

Point3f VibratingPoint::relative_amplitude_
protected

Относительные амплитуды вибрации по x, y. Выражается отношением амплитуды

См. определение в файле vibrating_point.h строка 127

◆ sampling_rate_

double VibratingPoint::sampling_rate_
protected

Частота сэмплирования (фактически - FPS исходного видео)

См. определение в файле vibrating_point.h строка 163

◆ sensivity_

double VibratingPoint::sensivity_
protected

Чувствительность определения вибрации

См. определение в файле vibrating_point.h строка 184

◆ vec_meaned_coordinates_of_point_

std::vector<cv::Point2f> VibratingPoint::vec_meaned_coordinates_of_point_
protected

Контейнер для координат точки относительно нулевого уровня

См. определение в файле vibrating_point.h строка 147

◆ x_

std::vector<double> VibratingPoint::x_
protected

Контейнер для хранения координат гистограммы по оси X (фактически - найденный спектр частот вибрации точки после выполнения БПФ)

См. определение в файле vibrating_point.h строка 176

◆ x_coordinates_

std::vector<double> VibratingPoint::x_coordinates_
protected

Контейнер для координат точки по оси X.

См. определение в файле vibrating_point.h строка 139

◆ y_

std::vector<float> VibratingPoint::y_
protected

Контейнер для хранения координат гистограммы по оси Y (фактически - найденные магнитуды точки после выполнения БПФ)

См. определение в файле vibrating_point.h строка 180

◆ y_coordinates_

std::vector<double> VibratingPoint::y_coordinates_
protected

Контейнер для координат точки по оси Y.

См. определение в файле vibrating_point.h строка 143


Объявления и описания членов классов находятся в файлах: