Camera相机人脸识别系列专题分析之十二:人脸特征检测FFD算法之libvega_face.so数据结构详解

【关注我,后续持续新增专题博文,谢谢!!!】

上一篇我们讲了

Camera相机人脸识别系列专题分析之十一:人脸特征检测FFD算法之低功耗libvega_face.so人脸属性(年龄,性别,肤色,微笑,种族等)检测流程详解

        这一篇我们开始讲 Camera相机人脸识别系列专题分析之十二:人脸特征检测FFD算法之libvega_face.so数据结构详解

目录

一、背景

二、:FFD算法之libvega_face.so数据结构

    2.1:vega_face常规数据结构

    2.2 :MTK平台FD数据结构


一、背景

我们知道:软件 = 算法 + 数据结构,之前我们讲了FFD算法之libvega_face.so的流程,如果没有理解数据结构,也很难理解,这里汇总相关的数据结构,便于理解。

二、:FFD算法之libvega_face.so数据结构

    2.1:vega_face常规数据结构

主要涉及:

  1. vega_face_model_type_t
  2. vega_face_model_buffer_t
  3. vega_face_init_param_t
  4. vega_face_timestamp_t
  5. vega_face_pixel_format_t
  6. vega_face_orientation_t 人脸方向
  7. vega_face_frame_t 人脸帧数据
  8. vega_face_rect_t 人脸矩形
  9. vega_face_points_layout_t
  10. vega_face_points_t 人脸点位
  11. vega_face_euler_angle_t 性别结构体
  12. vega_face_classify_label_t
  13. vega_face_attribute_t 人脸属性结构体
  14. 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           -10006typedef 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       0x00020000typedef 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的参数结构:

  1. FD_Frame_Parameters
  2. oplusFaceDataAppJoint
  3. thirdFfdPreviewAppData
  4. thirdProcessData
  5. thirdFfd_data_t
  6. thirdFaceROIData
  7. 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_COMMONHAL_FD_OBJ_CUSFD_SW,#endifHAL_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 addressMUINT8 *pImageBufferPhyP1; // Plane 1 of preview image physical addressMUINT8 *pImageBufferPhyP2; // Plane 2 of preview image physical addressMUINT8 *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 15typedef 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 ROIuint32_t   top;       ///< y coordinate of the ROIuint32_t   width;     ///< Width of the ROIuint32_t   height;    ///< Height of the ROI
} thirdRectangleCoordinate;/// @brief Describes Face ROI
typedef struct {uint32_t   id;           ///< Id used to track a face in the sceneuint32_t   confidence;   ///< Confidence of this facethirdRectangleCoordinate    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 widthuint32_t fdDimensionH;                        ///< Face detection heightint32_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;

【关注我,后续持续新增专题博文,谢谢!!!】

下一篇讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何配置HarmonyOS 5与React Native的开发环境?

配置 HarmonyOS 5 与 React Native 的开发环境需遵循以下步骤 一、基础工具安装 ‌DevEco Studio 5.0‌ 从 HarmonyOS 开发者官网 下载安装勾选组件&#xff1a; HarmonyOS SDK (API 12)ArkTS 编译器JS/ArkTS 调试工具HarmonyOS 本地模拟器 ‌Node.js 18.17 # 安装后验证版…

kotlin kmp 副作用函数 effect

在 Kotlin Multiplatform (KMP) Compose 中&#xff0c;“effect functions”&#xff08;或“effect handlers”&#xff09;是专门的可组合函数&#xff0c;用于在 UI 中管理副作用。 在 Compose 中&#xff0c;可组合函数应该是“纯”的和声明式的。这意味着它们应该理想地…

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…

【Pandas】pandas DataFrame isna

Pandas2.2 DataFrame Missing data handling 方法描述DataFrame.fillna([value, method, axis, …])用于填充 DataFrame 中的缺失值&#xff08;NaN&#xff09;DataFrame.backfill(*[, axis, inplace, …])用于**使用后向填充&#xff08;即“下一个有效观测值”&#xff09…

MQTT协议:物联网时代的通信基石

MQTT协议&#xff1a;物联网时代的通信基石 在当今快速发展的物联网&#xff08;IoT&#xff09;时代&#xff0c;设备之间的通信变得尤为重要。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议作为一种轻量级的消息传输协议&#xff0c;正逐渐成为物联…

Excel 表格内批量添加前缀与后缀的实用方法

我们经常需要为 Excel 表格中的内容统一添加前缀或后缀&#xff0c;例如给编号加“NO.”、给姓名加“会员_”等。手动操作效率低&#xff0c;本文将介绍几种实用的方法&#xff0c;帮助你快速完成批量添加前缀和后缀的操作。 使用“&”运算符添加前缀或后缀&#xff08;推…

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…

分布式锁实战:Redisson vs. Redis 原生指令的性能对比

分布式锁实战&#xff1a;Redisson vs. Redis 原生指令的性能对比 引言 在DIY主题模板系统中&#xff0c;用户可自定义聊天室的背景、图标、动画等元素。当多个运营人员或用户同时修改同一模板时&#xff0c;若没有锁机制&#xff0c;可能出现“甲修改了背景色&#xff0c;乙…

C++ 设计模式《复制粘贴的奇迹:小明的原型工厂》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;原型模式&#xff08;Prototype Pattern&#xff09; &#x1f4d6; 背景故事 创业初期&#xff0c;小明每天加班写配送路线、配送策略、营销套餐。可当业务做大后&#xff0c;他发现大家常常下单“上次那个套餐”—— “老…

【Elasticsearch】映射:fielddata 详解

映射&#xff1a;fielddata 详解 1.fielddata 是什么2.fielddata 的工作原理3.主要用法3.1 启用 fielddata&#xff08;通常在 text 字段上&#xff09;3.2 监控 fielddata 使用情况3.3 清除 fielddata 缓存 4.使用场景示例示例 1&#xff1a;对 text 字段进行聚合示例 2&#…

开源 vGPU 方案:HAMi,实现细粒度 GPU 切分

本文主要分享一个开源的 GPU 虚拟化方案&#xff1a;HAMi&#xff0c;包括如何安装、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案&#xff0c;HAMi 除了 GPU 共享之外还可以实现 GPU core、memory 得限制&#xff0c;保证共享同一 GPU 的各个 Pod 都能拿到足够的资源。…

PlayDiffusion上线:AI语音编辑进入“无痕时代”

在语音合成与语音编辑领域&#xff0c;一个长期存在的挑战是如何在修改语音内容的同时&#xff0c;保持原始语音的自然性、连贯性和说话人特征。近日&#xff0c;一款名为 PlayDiffusion 的新型 AI 语音修复模型应运而生&#xff0c;成功实现了这一目标。 PlayDiffusion 是一个…

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…

微信小程序前端面经

一、技术栈与编码能力&#xff08;10min&#xff09; 1. Vue 3 & Composition API Q1&#xff1a;请解释一下 ref 和 reactive 的区别&#xff1f;你在项目中是如何使用的&#xff1f; 答&#xff1a;ref是包装一个原始值或对象&#xff0c;通过.value访问&#xff0c;r…

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…

Houdini POP入门学习07 - 分组

使用PopGroup可对粒子进行分组操作&#xff0c;并通过表达式从而更灵活的处理粒子行为。 1.创建box作为发射器&#xff0c;连接popnet节点。 2.双击进入popnet&#xff0c;添加popwind添加向上风力。现在播放粒子可见粒子向上方移动。 3.添加popgroup进行分组&#xff0c;开启…

机器学习复习3--模型评估

误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为&#xff1a;误差&#xff08;error&#xff09;。 误差定义&#xff1a; ①在训练集上的误差称为训练误差&#xff08;training error&#xff09;或经验误差&#xff08;empirical error&#x…