【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了:
Camera相机人脸识别系列专题分析之十一:人脸特征检测FFD算法之低功耗libvega_face.so人脸属性(年龄,性别,肤色,微笑,种族等)检测流程详解
这一篇我们开始讲: Camera相机人脸识别系列专题分析之十二:人脸特征检测FFD算法之libvega_face.so数据结构详解
目录
一、背景
我们知道:软件 = 算法 + 数据结构,之前我们讲了FFD算法之libvega_face.so的流程,如果没有理解数据结构,也很难理解,这里汇总相关的数据结构,便于理解。
二、:FFD算法之libvega_face.so数据结构
2.1:vega_face常规数据结构
主要涉及:
- vega_face_model_type_t
- vega_face_model_buffer_t
- vega_face_init_param_t
- vega_face_timestamp_t
- vega_face_pixel_format_t
- vega_face_orientation_t 人脸方向
- vega_face_frame_t 人脸帧数据
- vega_face_rect_t 人脸矩形
- vega_face_points_layout_t
- vega_face_points_t 人脸点位
- vega_face_euler_angle_t 性别结构体
- vega_face_classify_label_t
- vega_face_attribute_t 人脸属性结构体
- vega_face_track_mainface_config_t
#define VEGA_FACE_OK 0
#define VEGA_FACE_E_UNSUPPORTED -10000
#define VEGA_FACE_E_FAIL -10001
#define VEGA_FACE_E_PARAM -10002
#define VEGA_FACE_E_LICENSE -10003
#define VEGA_FACE_E_HANDLE -10004
#define VEGA_FACE_E_PARAM_INCAMPAT -10005
#define VEGA_FACE_E_NOT_FOUND -10006
typedef int vega_face_errcode_t;
typedef uint64_t vega_face_handle_t;
#define VEGA_FACE_CONFIG_DEFAULT 0x00000000
#define VEGA_FACE_CONFIG_RESIZE_IMG_320W 0x00000001
#define VEGA_FACE_CONFIG_RESIZE_IMG_480W 0x00000002
#define VEGA_FACE_CONFIG_RESIZE_IMG_640W 0x00000003
#define VEGA_FACE_CONFIG_RESIZE_IMG_720W 0x00000004
#define VEGA_FACE_CONFIG_RESIZE_IMG_960W 0x00000005
#define VEGA_FACE_CONFIG_RESIZE_IMG_1080W 0x00000006
#define VEGA_FACE_CONFIG_RESIZE_IMG_1280W 0x00000007
#define VEGA_FACE_CONFIG_TRACK_TWO_THREAD 0x00000100
#define VEGA_FACE_CONFIG_BYPASS 0x00000200
#define VEGA_FACE_CONFIG_ALIGN_2D_137 0x00010000
#define VEGA_FACE_CONFIG_ALIGN_2D_285 0x00020000
typedef uint64_t vega_face_config_t;
typedef enum {
VEGA_FACE_DETECT_MODEL = 0,
VEGA_FACE_TRACK_MODEL = 1,
VEGA_FACE_ALIGN_MODEL = 2,
VEGA_FACE_ATTRIBUTE_MODEL = 3,
VEGA_FACE_MODEL_COUNT = 8
} vega_face_model_type_t;
typedef struct {
const void *buffer;
unsigned int buffer_size;
} vega_face_model_buffer_t;
typedef struct {
unsigned int struct_size;
const char *model_path[VEGA_FACE_MODEL_COUNT];
vega_face_model_buffer_t model_buffer[VEGA_FACE_MODEL_COUNT];
vega_face_config_t config;
} vega_face_init_param_t;
typedef struct {
long int tv_sec;
long int tv_usec;
} vega_face_timestamp_t;
typedef enum {
VEGA_FACE_PIX_FMT_GRAY8 = 0,
VEGA_FACE_PIX_FMT_YUV420P = 1,
VEGA_FACE_PIX_FMT_NV12 = 2,
VEGA_FACE_PIX_FMT_NV21 = 3,
VEGA_FACE_PIX_FMT_BGRA8888 = 4,
VEGA_FACE_PIX_FMT_BGR888 = 5,
VEGA_FACE_PIX_FMT_RGBA8888 = 6,
VEGA_FACE_PIX_FMT_RGB888 = 7
} vega_face_pixel_format_t;
typedef enum {
VEGA_FACE_UP = 0,
VEGA_FACE_LEFT = 1,
VEGA_FACE_DOWN = 2,
VEGA_FACE_RIGHT = 3,
VEGA_FACE_UNKNOWN = 4
} vega_face_orientation_t;
typedef struct {
unsigned int struct_size;
unsigned int ID;
vega_face_pixel_format_t pixel_format;
const unsigned char *data;
int width;
int height;
int stride;
vega_face_orientation_t orientation;
vega_face_timestamp_t time_stamp;
} vega_face_frame_t;
typedef uint64_t vega_face_result_t;
typedef uint64_t vega_face_faceinfo_t;
typedef struct {
float left;
float top;
float right;
float bottom;
} vega_face_rect_t;
typedef enum {
VEGA_FACE_POINTS_LAYOUT_2D_XYXY = 0,
VEGA_FACE_POINTS_LAYOUT_2D_XXYY = 1
} vega_face_points_layout_t;
typedef struct {
vega_face_points_layout_t layout;
float *buf;
unsigned int buf_size;
} vega_face_points_t;
typedef struct {
float yaw;
float pitch;
float roll;
} vega_face_euler_angle_t;
typedef struct {
int label;
float score;
} vega_face_classify_label_t;
typedef struct {
float age;
vega_face_classify_label_t gender;
vega_face_classify_label_t race_yellow;
vega_face_classify_label_t race_black;
vega_face_classify_label_t race_white;
vega_face_classify_label_t race_brown;
} vega_face_attribute_t;
typedef struct {
bool enable_main_face_mode;
float mainface_track_target_replace_thresh;
float mainface_detect_score_weight;
float mainface_rect_area_weight;
float mainface_center_distance_weight;
} vega_face_track_mainface_config_t;
2.2 :MTK平台FD数据结构
主要涉及写入meta,并传递给APP的参数结构:
- FD_Frame_Parameters
- oplusFaceDataAppJoint
- thirdFfdPreviewAppData
- thirdProcessData
- thirdFfd_data_t
- thirdFaceROIData
- thirdRectangleCoordinate
enum HalFDMode_e {
HAL_FD_MODE_FD = 0,
HAL_FD_MODE_SD,
HAL_FD_MODE_VFB,
HAL_FD_MODE_CFB,
HAL_FD_MODE_VSDOF,
HAL_FD_MODE_MANUAL
} ;
enum HalFDObject_e {
HAL_FD_OBJ_NONE = 0,
HAL_FD_OBJ_SW,
HAL_FD_OBJ_HW,
HAL_FD_OBJ_FDFT_SW,
#ifdef third_FEATURE_CAMERA_COMMON
HAL_FD_OBJ_CUSFD_SW,
#endif
HAL_FD_OBJ_UNKNOWN = 0xFF
} ;
enum HalFDVersion_e {
HAL_FD_VER_NONE = 0,
HAL_FD_VER_HW36,
HAL_FD_VER_HW37,
HAL_FD_VER_SW36,
HAL_FD_VER_HW40,
HAL_FD_VER_HW41,
HAL_FD_VER_HW42,
HAL_FD_VER_HW43,
HAL_FD_VER_HW50,
HAL_FD_VER_HW51,
HAL_FD_VER_HW52,
};
struct FD_RESULT {
MINT32 rect[4];
MINT32 score = -1;
MINT32 rop_dir = -1;
MINT32 rip_dir = -1;
};
struct FD_Frame_Parameters {
MUINT8 *pScaleImages;
MUINT8 *pRGB565Image;
MUINT8 *pPureYImage;
MUINT8 *pImageBufferPhyP0; // Plane 0 of preview image physical address
MUINT8 *pImageBufferPhyP1; // Plane 1 of preview image physical address
MUINT8 *pImageBufferPhyP2; // Plane 2 of preview image physical address
MUINT8 *pImageBufferVirtual;
MINT32 Rotation_Info;
MUINT8 SDEnable;
MUINT8 AEStable;
MUINT32 padding_w;
MUINT32 padding_h;
MINT32 gammaType;
MINT32 LvValue;
MINT32 MagicNum = 0;
MUINT32 FD_Y;
MUINT8 *pImageBufferY;
NSCam::MSize sensorSize;
void* imgBuffer;
MINT32 frameNo;
thirdSize thirdCusSensorSize;
thirdFaceDataAppJoint faceData;
};
#define thirdFD_MAX_FFD_NUM 137
#define thirdFD_MAX_FFD_NUM_296 296
#define thirdFD_MAX_FFD_NUM_512 512
#define thirdFD_MAX_ATTRI_FACE_NUM 4
#define thirdFD_RESERVE_ITEM 40
#define thirdFD_HSV_CHANNEL_NUM 3
#define thirdFD_MAX_FACE_ROIS 5
#define thirdFD_MAX_FD_NUM 15
typedef struct {
int32_t age[thirdFD_MAX_ATTRI_FACE_NUM];
int32_t gender[thirdFD_MAX_ATTRI_FACE_NUM];
int32_t feature[thirdFD_MAX_ATTRI_FACE_NUM];
int32_t race[thirdFD_MAX_ATTRI_FACE_NUM];
} thirdAttributeResult;
typedef struct {
uint32_t left; ///< x coordinate of the ROI
uint32_t top; ///< y coordinate of the ROI
uint32_t width; ///< Width of the ROI
uint32_t height; ///< Height of the ROI
} thirdRectangleCoordinate;
/// @brief Describes Face ROI
typedef struct {
uint32_t id; ///< Id used to track a face in the scene
uint32_t confidence; ///< Confidence of this face
thirdRectangleCoordinate faceRect; ///< Detected Face rectangle
} thirdFaceROIData;
typedef struct {
int32_t x[thirdFD_MAX_FFD_NUM];
int32_t y[thirdFD_MAX_FFD_NUM];
int32_t occlusion[thirdFD_MAX_FFD_NUM];
} thirdFfd_data_t;
typedef struct {
int32_t versionId;
int32_t face_num;
int32_t master_index;
int32_t points_count;
int32_t age[thirdFD_MAX_FD_NUM];
int32_t gender[thirdFD_MAX_FD_NUM];
thirdFfd_data_t ffd_data[thirdFD_MAX_FD_NUM];
thirdFfd_data_t ori_ffd_data[thirdFD_MAX_FD_NUM];
thirdFaceROIData face_roi[thirdFD_MAX_FD_NUM];
uint32_t fdDimensionW; ///< Face detection width
uint32_t fdDimensionH; ///< Face detection height
int32_t yaw[thirdFD_MAX_FD_NUM];
int32_t pitch[thirdFD_MAX_FD_NUM];
int32_t roll[thirdFD_MAX_FD_NUM];
int32_t faceLuma[thirdFD_MAX_FD_NUM];
int32_t faceLumaRatio;
int32_t colorTemperature;
int32_t lip_HSV[thirdFD_MAX_FD_NUM * thirdFD_HSV_CHANNEL_NUM];
int32_t iso;
int32_t feature[thirdFD_MAX_FD_NUM];
int32_t faceid[thirdFD_MAX_FD_NUM];
int32_t reserve[thirdFD_RESERVE_ITEM];
int32_t race[thirdFD_MAX_FD_NUM];
} thirdFace_data_app_t;
typedef struct {
int32_t x[thirdFD_MAX_FFD_NUM_512];
int32_t y[thirdFD_MAX_FFD_NUM_512];
int32_t occlusion[thirdFD_MAX_FFD_NUM_512];
} thirdFfdPreviewData;
typedef struct {
thirdFfdPreviewData ffdData[thirdFD_MAX_FD_NUM];
thirdFfdPreviewData oriFfdData[thirdFD_MAX_FD_NUM];
int pointsCount;
} thirdFfdPreviewAppData;
typedef struct {
int w;
int h;
} thirdSize;
typedef struct {
int makeupState;
bool isEISOn;
thirdSize previewImgSize;
} thirdFaceInitData;
typedef struct {
thirdSize sensorSize;
thirdSize previewSize;
thirdSize ImgSize;
bool isEisOn;
} thirdProcessData;
typedef struct {
thirdFace_data_app_t faceInfoOri;
thirdFfdPreviewAppData ffd296Data;
thirdProcessData fdProcessInfo;
} thirdFaceDataAppJoint;
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: