rv1126利用rkmedia、opencv、rockx……完成人脸识别

一、总体框架

视频采集、处理使用rkmedia:vi模块进行视频输入、rga模块进行视频处理

人脸识别:先获取rga输出码流,再调用rkmedia的模型对人脸进行推理(线程1)

打框框:opencv(线程2),且在打完框后把视频输入至venc(编码)

rtsp推流:获得venc编码数据后进行rtsp推流

根据这些模块、整体码流流向如下图:

二、部分笔记

首先初始化了人脸数据库(init_face_data())其内容如下:

1.连接sql数据库,打开后可以看到其中也是简单的封装函数sqlite3_open

2.初始化了一个特殊类S_THREAD_MAP

3.map<string,rockx_face_feature_t>就是一个姓名与人脸特征的map

4.QueryFaceFeature是获取数据库中所有信息到map中 。涉及到对sql的操作

5.set_thread_map是对获取的所有人脸信息map保存到了一个全局表量数组里,保存在第task_id

复制代码
void init_face_data()
{
  Connection_Sqlite3DataBase();
  int task_id = 0;
  S_THREAD_MAP thread_map;
  map<string, rockx_face_feature_t> maps = QueryFaceFeature();
  thread_map.thread_map = maps;
  set_thread_map(task_id, &thread_map);
}

Connection_Sqlite3DataBase内容如下

复制代码
int Connection_Sqlite3DataBase()
{
    rc = sqlite3_open("/mnt/nfs/face.db", &db);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        exit(1);
    }
    else
    {
        printf("You have opened a sqlite3 database named bind.db successfully!\nCongratulation! Have fun!\n");
    }
    return 0;
}

S_THREAD_MAP内部如下,map_id 以及一个姓名与人脸特征结构体

复制代码
class S_THREAD_MAP{

  public:
     int map_id;
     map<string, rockx_face_feature_t> thread_map;
};

QueryFaceFeature内容如下:

复制代码
map<string, rockx_face_feature_t> QueryFaceFeature()
{
    rockx_face_feature_t rockx_face_feature = {0, 0};
    map<string, rockx_face_feature_t> rockx_face_feature_map;
    sqlite3_stmt *stmt;
    char *sql = "select name, feature_size, face_feature from face_data_table";
    //准备查询语句 准备从db数据库查找sql(name feature_size face_feature)
    int ret = sqlite3_prepare(db, sql, strlen(sql), &stmt, 0);
    int id = 0, len = 0;
    char * name;
    int feature_size;

    if (ret == SQLITE_OK)
    {
        //真正开始查找 当一行查找成功后执行下面代码
        while (sqlite3_step(stmt) == SQLITE_ROW)
        {
            name = (char *)sqlite3_column_text(stmt, 0);
            printf("name = %s\n", name);
            feature_size = sqlite3_column_int(stmt, 1);
            printf("feature_size = %d\n", feature_size);
            //rockx_face_feature.feature = (MByte *)malloc(feature_size);
            const void *feature = sqlite3_column_blob(stmt, 2);   
            memset(rockx_face_feature.feature, 0, feature_size);
            memcpy(rockx_face_feature.feature, feature, feature_size);
            rockx_face_feature.len = feature_size;
            string str(name);
            //插入人脸数据
            rockx_face_feature_map.insert(pair<string, rockx_face_feature_t>(str, rockx_face_feature));
        }
    }
    
    sqlite3_finalize(stmt);
    sqlite3_close(db); 
   //返回所有信息 
    return rockx_face_feature_map;
}

set_thread_map

复制代码
int set_thread_map(unsigned int map_id, S_THREAD_MAP *map)
{
    pthread_mutex_lock(&g_thread_maps_mutex);
    g_thread_maps[map_id] = *map;
    pthread_mutex_unlock(&g_thread_maps_mutex);
    return 0;
}
相关推荐
AIgorithmGEEK1 小时前
Linux 权限管理:从「Permission Denied」到「畅行无阻」
linux·权限·chmod·粘滞位·umask·文件权限的构成
BullSmall1 小时前
scanoss-engine 本地最简部署 & 扫描命令(Linux/Anolis OS)
linux·运维·服务器
bellus-1 小时前
Ubuntu 26.04 Miniforge3 安装与配置完整指南
linux·运维·ubuntu
sali-tec3 小时前
C# 基于OpenCv的视觉工作流-章100-抠图
图像处理·人工智能·opencv·计算机视觉
用什么都重名3 小时前
Ubuntu 24.04 安装 NVIDIA 驱动:解决 “NVIDIA-SMI has failed“ 报错全记录
linux·运维·ubuntu
Industio_触觉智能3 小时前
瑞芯微ISP内核驱动深度解析|RKISP39从架构到Probe初始化全流程(上篇)
linux·嵌入式硬件·硬件架构·摄像头·isp·瑞芯微·rk3576
有续技术3 小时前
三菱 (Mitsubishi) 机床 设置查看 IP 地址
linux·服务器·网络
yagami_gagami3 小时前
第四届黄河流域公安院校电子物证个人赛服务器取证
linux·服务器·网络·mysql·安全·docker·llama
邪修king4 小时前
Re:Linux系统篇(七) 开发工具篇 Chapter3:Makefile 从入门到精通 —— 依赖关系、伪目标、栈式推导与自动化构建全解
linux·运维·服务器·vim
bosins4 小时前
Ubuntu 日常最常用的文件操作场景和对应指令
linux·服务器·ubuntu