zhangmeng
2019-11-29 c9810a63191b9f4dff1c9d02a9545785fddd85e2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef SY_HUMAN_TRACKER
#define SY_HUMAN_TRACKER
 
#include <math.h>
 
#define MAX_BG_NUM 2000
#define FEATURESIZE 128
//ImgData
#ifndef __SY_IMG__    
#define __SY_IMG__
typedef struct sy_img
{
    unsigned char * data_;//按opencv Mat格式存储的图像数据(bgrbgrbgr…)
    int w_;//图像宽度
    int h_;//图像高度
    int c_;//图像通道数,目前仅支持3通道
    // void set_data(int m_w, int m_h, int m_c, unsigned char * m_data)
    // {
    //     w_ = m_w;
    //     h_ = m_h;
    //     c_ = m_c;
    //     data_ = m_data;    //Shallow copy
    // }
} sy_img;
#endif
 
typedef struct fgInfo {
    int left;//行人包围框左上角横坐标
    int right;//行人包围框右下角横坐标
    int top;//行人包围框左上角纵坐标
    int bottom;//行人包围框右下角纵坐标
    float confidence;//行人检测框置信度得分
    int center_x;//行人包围框中心点x
    int center_y;//行人包围框中心点y
    int ID;//行人跟踪ID
    float feature[FEATURESIZE];//行人专属特征,可用来做ReID
}fgInfo;
 
typedef struct fgRet {
    fgInfo fginfo[MAX_BG_NUM];//上述结构体,代表一幅图中所有的框,最大支持2000个框,暂不可修改
    int fgNum;//一幅图中框的数量(fginfo中的有效框数)
}fgRet;
 
 
/*功能:整个检测跟踪程序初始化,创建句柄
参数:
Gpuid: 显卡ID,
batch_size: 批处理数量,可以设置为视频路数
wh_flag: 视频帧的图像宽大于高时,设置为0,否则设置为1。
返回值:句柄
*/
void *human_tracker_create( int gpuid, int batch_size, int wh_flag);
 
/*
功能:资源释放
参数:句柄的地址
返回值:void
*/
void human_tracker_release(void **handle);
 
/*
功能:对多张图像进行检测跟踪
参数:
handle:句柄
batch_mat: sy_img类型的数组,存放多张图像。
batch_img_length:图像数量
trackresult: 每张图像的检测和跟踪结果,提前声明好的数组,数量为图像数,以fgRet类型存储。
返回值:-1 失败或其他错误码 0 成功
*/
int human_tracker_process(void * handle,   sy_img  batch_mat[], int batch_img_length, fgRet trackresult[]);
 
/*
功能:获得版本信息
参数:void
返回值:版本信息char*
*/
const char* getVersion();
 
 
/*
功能:特征值比对
参数:特征值1和特征值2
返回值:得分
*/
double FF_Similarity(float * feaA, float * feaB)
{
    double norm1 = 0, norm2 = 0;
    int i = 0;
    double score = 0;
    for (i = 0; i < FEATURESIZE; i++)
    {
        norm1 += feaA[i] * feaA[i];
        norm2 += feaB[i] * feaB[i];
        score += feaA[i] * feaB[i];
    }
 
    norm1 = sqrt(norm1);
    norm2 = sqrt(norm2);
 
    score = score / (norm1 * norm2);
 
    if (score < 0) // 制去除小数部分
        score = 0;
    return score;
}
 
#endif