Files

124 lines
3.9 KiB
C

#ifndef __SVP_BYTETRACKER__
#define __SVP_BYTETRACKER__
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <math.h>
#include <stdlib.h>
#include "xmedia_svp_std.h"
#include "xmedia_svp.h"
#include "xmedia_svp_quantize.h"
#ifdef __cplusplus
extern "C" {
#endif
#define SVP_TRACK_EPSILON 0.000001f
// bytetracker
#define SVP_STD_POSITION (1.0f / 20.0f)
#define SVP_STD_VELOCITY (1.0f / 160.0f)
#define SVP_MAX_LOST_COUNT 30
#define SVP_TRACKER_HIGH_SCORE_THRESHOLD 0.5f
#define SVP_ACTIVATED_TRACKER_THRESHOLD 0.1f
#define SVP_TRACKED_TRACKER_THRESHOLD 0.1f
#define SVP_UNACTIVATED_TRACKER_THRESHOLD 0.1f
#define SVP_TRACK_AGE_THRESHOLD 3
#define SVP_TRACK_AGE_LIMIT 240
#define SVP_ALG_MAX_TARGET_NUM 10
// 卡尔曼滤波矩阵
#define SVP_KALMAN_FILTER_X 8
#define SVP_KALMAN_FILTER_Y 4
#define SVP_KALMAN_FILTER_STATE 1
typedef struct {
xmedia_float x; /* 中心点坐标x */
xmedia_float y; /* 中心点坐标y */
xmedia_float a; /* 宽高比 */
xmedia_float h; /* 高度 */
} svp_kalman_measure;
typedef struct {
xmedia_float state[SVP_KALMAN_FILTER_X][SVP_KALMAN_FILTER_STATE];
xmedia_float R[SVP_KALMAN_FILTER_Y][SVP_KALMAN_FILTER_Y]; // 测量噪声矩阵 不需要保存
xmedia_float K[SVP_KALMAN_FILTER_X][SVP_KALMAN_FILTER_Y]; // 卡尔曼增益
xmedia_float H[SVP_KALMAN_FILTER_Y][SVP_KALMAN_FILTER_X]; // 观测矩阵
xmedia_float P[SVP_KALMAN_FILTER_X][SVP_KALMAN_FILTER_X]; // 协方差矩阵
xmedia_float F[SVP_KALMAN_FILTER_X][SVP_KALMAN_FILTER_X]; // 状态转移矩阵
xmedia_float Q[SVP_KALMAN_FILTER_X][SVP_KALMAN_FILTER_X]; // 运动噪声矩阵 不需要保存
} svp_kalman_filter;
typedef enum {
SVP_TRACKER_STATE_NEW = 0, // 新轨迹
SVP_TRACKER_STATE_TRACKED, // 跟踪成功
SVP_TRACKER_STATE_LOST, // 未跟踪成功
SVP_TRACKER_STATE_REMOVED,
SVP_TRACKER_STATE_UNDEFINED
} svp_tracker_state;
typedef struct {
svp_tracker_state state;
xmedia_svp_class_type class_type;
xmedia_float score;
xmedia_s32 id;
xmedia_u8 age;
xmedia_float iou;
xmedia_u8 lost_count;
xmedia_svp_rect rect;
xmedia_svp_rect predicted_rect;
svp_kalman_filter kalman_filter;
xmedia_u8 target_idx; // 检测结果索引
} svp_bytetracker;
typedef struct {
xmedia_bool enable;
xmedia_float high_score_thres;
xmedia_float activated_tracker_thres;
xmedia_float tracked_tracker_thres;
xmedia_float unactivated_tracker_thres;
xmedia_u8 track_age_thres;
xmedia_u16 num;
svp_bytetracker* tracker;
} svp_tracklet;
typedef struct {
xmedia_svp_alg_type alg_type; // 检测类别
xmedia_svp_class_type class_type; // 检测结果类别
xmedia_float detect_score; // 检测模型结果置信度
xmedia_s32 tracker_id; // 检测结果追踪id
xmedia_u32 tracker_age; // 检测结果追踪age
xmedia_svp_rect rect; // 检测结果目标框
xmedia_u8 target_idx; // 检测结果索引
} xmedia_svp_tracker_single_result;
typedef struct {
xmedia_u32 target_num;
xmedia_svp_tracker_single_result tracker_single[XMEDIA_SVP_MAX_TARGET_NUM];
} xmedia_svp_tracker_result;
xmedia_s32 svp_detect_bytetracker(xmedia_svp_tracker_result* result, svp_tracklet* tracklet,
xmedia_s32* tracker_idx, xmedia_u8* id_flag);
/*
xmedia_s32 assignment_optimal(xmedia_s32* assignment, xmedia_float* dist_matrix_in, xmedia_u32 row,
xmedia_u32 col);
xmedia_s32 svp_bytetracker_set_attr(detect_param *param, const xmedia_svp_bytetracker_attr attr);
xmedia_s32 svp_bytetracker_get_attr(detect_param *param, xmedia_svp_bytetracker_attr *attr);
*/
#ifdef __cplusplus
}
#endif
#endif