header.h 10.9 KB
#pragma once

#ifdef _MSC_VER
#include <windows.h>
#else
#include <stddef.h>
#endif

#include "sy_common.h"

#define DETECTTYPE 9


//二次属性分析结果结构体
#ifndef __CLASSIFY_OBJ_RESULT__
#define __CLASSIFY_OBJ_RESULT__
typedef struct classify_obj_res         //分类结果结构体
{
	int res_index;                      //分类结果
	float res_prob;                     //分类结构体
	classify_obj_res() : res_index(0), res_prob(0) {};
} classify_obj_res;
#endif

//行人二次属性分析结构 + 特征结果
#ifndef __HP_OBJ_RESULT__
#define __HP_OBJ_RESULT__
const int HP_FIR_INDEX_SIZE = 16;
const int HF_FEA_SIZE = 128;
typedef struct hp_res
{
	classify_obj_res res_objs[HP_FIR_INDEX_SIZE]{};      //分类结果
} hp_res;

#ifndef __INT8__
#define __INT8__
typedef unsigned char int8;
#endif

typedef struct hp_result
{
	hp_res res_objs{};								  //分类结果
	int8 feature[HF_FEA_SIZE]{};                     //特征
} hp_result;
#endif

//人骑车二次属性分析结构 + 特征结果
#ifndef __HCP_OBJ_RESULT__
#define __HCP_OBJ_RESULT__
const int HCP_FIR_INDEX_SIZE = 14;
const int HCF_FEA_SIZE = 128;
typedef struct hcp_res
{
	classify_obj_res res_objs[HCP_FIR_INDEX_SIZE]{};          //分类结果
} hcp_res;

typedef struct hcp_result                                //人骑车二次属性分析以及特征结果
{
	hcp_res res_objs{};                                  //分类结果
	int8 feature[HCF_FEA_SIZE]{};                    //特征
} hcp_result;

#endif




#define VEHICLE_FEA_SIZE  128
#define PLATENUM 8	                    //车牌号码位数
#define MAX_PALTE_COUNT 10              //每张图片中最多检测出10个车牌

#define SINGLETYPE_BLUE 0		        //单排蓝色
#define SINGLETYPE_YELLOW 1		        //单排黄色
#define SINGLETYPE_WHITE 2		        //单排白色
#define SINGLETYPE_BLACK 3		        //单排黑色
#define DOUBLETYPE_YELLOW 4		        //双排黄色
#define DOUBLETYPE_WHITE 5		        //双排白色
#define NEWENERGYTYPE_YELLOWGREEN 6		//新能源黄绿色
#define NEWENERGYTYPE_WHITEGRA 7		//新能源白绿色

//车牌号码
#ifndef VPLATENUM_RESULT_
#define VPLATENUM_RESULT_
typedef struct vplate_num
{
	char character[4];
	float maxprob;
}vplate_num;
#endif

#ifndef VP_RESULT_
#define VP_RESULT_
typedef struct vplate_result
{
	sy_rect rect;
	float detect_score;
	vplate_num recg[PLATENUM];
	float num_score;
	int type;					         //车牌类型
}vplate_result;
#endif


#ifndef VR_RESULT_
#define VR_RESULT_
typedef struct vr_result                //结果
{
	char vehicle_brand[260];                //车辆品牌
	char vehicle_subbrand[260];             //车辆子品牌
	char vehicle_issue_year[260];           //车辆年款
	char vehicle_type[260];                 //车辆类型
	char freight_ton[260];                  //货车吨级
	float name_score;                   //识别置信度
}vr_result;
#endif

#ifndef VC_RESULT_
#define VC_RESULT_
typedef struct vc_result
{
	int res_index;                              //车颜色结果index
	float res_prob;                             //识别置信度
	vc_result() : res_index(0), res_prob(0) {};
}vc_result;
#endif

//VEHICLE
#ifndef __VEHICLE_OBJ_RESULT__
#define __VEHICLE_OBJ_RESULT__
typedef struct vehicle_result                      //车二次属性分析结果
{
	vr_result vr_res;                           //车型识别结果 
	vc_result vc_res;                           //车颜色识别结果
	vplate_result vp_res;                       //车牌检测结果
	int8 feature[VEHICLE_FEA_SIZE]{};               //车辆特征
} vehicle_result;
#endif


//HUMAN FACE
#ifndef FACIALFEAPOINTSIZE		//关键点检测支持25个点
#define FACIALFEAPOINTSIZE 25		
#endif

#ifndef __FD_INFO__
#define __FD_INFO__
typedef struct fd_info {
	sy_rect face_position;									//人脸位置
	float face_pos_score;									//人脸框置信度
	sy_point facial_fea_point[FACIALFEAPOINTSIZE];			//人脸关键点位置信息
	int occlusion;				                            //人脸遮挡度,范围值为0-100,越大表示人脸遮挡程度越高
	int clarity;											//人脸清晰度,范围值为0-100,越大表示图像越清晰,人脸清晰度判别建议阈值为30
	int brightness;											//人脸亮度,只有3种可能的值:[-1->太暗,0->正常,1->太亮],亮度结果会受亮度阈值参数brightness_min和brightness_max影响
															//int hat;												//带帽子,范围为0-100,越大表示越可能有佩戴帽子,建议判别阈值为50
															//int glass;												//带眼镜,范围为0-100,越大表示越可能有戴眼镜,建议判别阈值为70
	float roll;												//姿态角
	float yaw;												//姿态角
	float pitch;											//姿态角
	float score;											//人脸置信度
} fd_info;
#endif

//返回的检测物体快照结果
#ifndef __VIDEO_OBJECT_SNAPSHOT__
#define __VIDEO_OBJECT_SNAPSHOT__
typedef struct video_object_snapshot
{
	int task_id;                          //该物体属于的任务ID号
	int object_id;                        //该物体的ID号
	char video_image_path[256];           //该物体快照的视频截图保存路径
	char snapshot_image_path[256];        //该物体快照抠图保存路径
	char face_image_path[256];            //该物体人脸抠图保存路径
	int object_type_index;                //该物体所属类别的索引
	char obj_type[64];                    //该物体属于的类别
	double progress;                      //该路视频的检测进度
	int task_frame_count;                 //该物体当前出现的帧号

	int left;                             //该物体位置的左坐标
	int top;                              //该物体位置的上坐标
	int right;                            //该物体位置的右坐标
	int bottom;                           //该物体位置的下坐标
	double confidence;	                  //置信度

	void* analysisRes;                    //二次属性分析结果
	fd_info* face_res;                    //人脸检测结果(若为nullptr则表示非行人或者未检测到人脸,反之返回人脸检测结果)
} video_object_snapshot;
#endif

//返回的检测物体结果信息
#ifndef __VIDEO_OBJECT_INFO__
#define __VIDEO_OBJECT_INFO__
typedef struct video_object_info
{
	int task_id;              //该物体属于的任务ID号
	int task_frame_count;     //该物体当前出现的帧号
	int object_id;            //该物体的ID号
	int left;                 //该物体位置的左坐标
	int top;                  //该物体位置的上坐标
	int right;                //该物体位置的右坐标
	int bottom;               //该物体位置的下坐标
	int index;                //该物体所属类别的编号
	double confidence;        //该物体的置信度
} video_object_info;
#endif

//回调函数,通知处理结束的视频,返回任务ID号
typedef void(*VIDEO_OBJECT_INFO_CALLBACK)(void * handle, video_object_info *obj_info);


//回调函数,返回检测物体的快照信息
typedef void(*VIDEO_OBJECT_SNAPSHOT_CALLBACK)(void * handle, video_object_snapshot *snapshot_info);


//回调函数,返回实时查看时视频的图像
typedef void(*VIDEO_REALTIME_CALLBACK)(void * handle, unsigned char *img_data, int img_height, int img_width);


//回调函数,通知处理结束的视频,返回任务ID号
typedef void(*VIDEO_FINISH_CALLBACK)(void * handle, const int task_id);


//TASK初始化参数
#ifndef __TASK_PARAM__
#define __TASK_PARAM__
typedef struct task_param
{
	char video_filename[256];
	char result_folder_little[256];
	char result_folder[256];
	char result_folder_face[256];
	bool on_image_display;    //是否绘制结果框到保存大图
	int jpeg_quality;         //图片保存质量的参数0-100 --debug by zsh
	int decMode;					// 解码模式: 0 全解码; 1 关键帧解码
	sy_rect minBoxsize[DETECTTYPE];                        //自定义的minBoxsize大小
	VIDEO_OBJECT_SNAPSHOT_CALLBACK obj_snapshot_callback_func;
	VIDEO_REALTIME_CALLBACK rt_view_callback_func;

	//task_param() : video_filename(0), result_folder_little(0), result_folder(0), result_folder_face(0) {}
	task_param() : jpeg_quality(30) {} //debug by zsh
}task_param;
#endif


//VPT初始化参数
#ifndef __MVPT_PARAM__
#define __MVPT_PARAM__
typedef struct mvpt_param
{
	int gpuid;                                                     //指定显卡id
	char* vrdbpath;				                                   //指定车行识别的车型数据库的路径
	char* auth_license;                                            //定制授权;若为通用授权,改参数无效
	int wait_framecount;                                           //针对目标较少的二次属性分析时设置最大等待帧数
	int skip_frame;												   //内部跳帧数

	/********************************日志参数*****************************/
	char path[2048];
	char name[512];
	unsigned int serviceID;
	unsigned char logMask;
	unsigned int limitSize;
	/********************************************************************/
															       //算法配置参数
	sy_command hp_analysis_config;			                       //是否开启行人结构化识别
	sy_command hcp_analysis_config;	                               //是否开启人骑车结构化识别
	sy_command vehicle_analysis_config;			                   //是否开启车型识别
	sy_command hf_recg_config;                                     //是否开启行人特征识别
	sy_command hcf_recg_config;                                    //是否开启人骑车特征识别
	sy_command vcf_recg_config;                                    //是否开启车辆特征识别
	sy_command face_det_config;                                    //是否开启人脸检测

	VIDEO_OBJECT_INFO_CALLBACK task_obj_info_callback_func;        //目标检测结果实时返回回调函数
	VIDEO_FINISH_CALLBACK task_finish_callbackfunc;                //任务分析结束结果回调函数
}mvpt_param;
#endif


#ifndef _MSC_VER
#include <sys/time.h>

#define MACRO_COUNT_TIME_START  struct timeval macro_tv_start;\
	                        struct timeval macro_tv_end;\
                        gettimeofday(&macro_tv_start,NULL);

#define MACRO_COUNT_TIME_END(___total_count___) gettimeofday(&macro_tv_end,NULL);\
	                        if(___total_count___<=0)\
                        printf("time cost: %.2f ms \n", ( (double)(macro_tv_end.tv_sec-macro_tv_start.tv_sec)*1000000+(double)(macro_tv_end.tv_usec-macro_tv_start.tv_usec)  )/1000);\
						                        else\
                        printf("time cost: %.2f ms \n", ( (double)(macro_tv_end.tv_sec-macro_tv_start.tv_sec)*1000000+(double)(macro_tv_end.tv_usec-macro_tv_start.tv_usec)  )/1000/___total_count___);   
#endif