Цель использования фильтра Калмана для отслеживания объектов (не обязательно для сглаживания).Если реализация C ++ в порядке, вы, вероятно, захотите использовать этот популярный репозиторий github https://github.com/AlexeyAB/darknet
Если вы читаете документацию, у него есть C ++ API, в котором вы можете использовать darknet в качестве библиотеки (так что вы можете использовать свою модель yolo)и загрузите его в свою C ++ программу.Взгляните на пример программы на C ++, которая использует библиотеку darknet здесь https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp.
В этом коде C ++ автор предоставляет 3 варианта для отслеживания объектов, 1 из них использует фильтр Калмана:
- Алгоритм отслеживания оптического потока , но он работает только для обнаружения в реальном времени, а не для видео.Вы можете использовать алгоритм, раскомментировав эту строку
//#define TRACK_OPTFLOW
.Взгляните на строку 508 ~ 522
#ifdef TRACK_OPTFLOW
if (detection_data.new_detection) {
tracker_flow.update_tracking_flow(detection_data.cap_frame, detection_data.result_vec);
while (track_optflow_queue.size() > 0) {
draw_frame = track_optflow_queue.back();
result_vec = tracker_flow.tracking_flow(track_optflow_queue.front(), false);
track_optflow_queue.pop();
}
}
else {
track_optflow_queue.push(cap_frame);
result_vec = tracker_flow.tracking_flow(cap_frame, false);
}
detection_data.new_detection = true; // to correct kalman filter
#endif //TRACK_OPTFLOW
Фильтр Калмана , не очень рекомендуется, потому что он не очень точный, но может работать для CCTV или стационарной камеры.Чтобы использовать фильтр Калмана, измените это значение на true
bool const use_kalman_filter = false;
.Взгляните на строку 524 ~ 532
// track ID by using kalman filter
if (use_kalman_filter) {
if (detection_data.new_detection) {
result_vec = track_kalman.correct(result_vec);
}
else {
result_vec = track_kalman.predict();
}
}
Custom Object Tracker , я использовал эту пользовательскую функцию, и в моем случае она работает лучше, чем фильтр Калмана, он даст вам идентификатор трека для каждого объекта.
// track ID by using custom function
else {
int frame_story = std::max(5, current_fps_cap.load());
result_vec = detector.tracking_id(result_vec, true, frame_story, 40);
}