当前位置:首页 > 技术 > 正文内容

Linux_58:rockx_vi_handle_thread线程详解

访客 技术 2026年9月12日 11

目录

  1. 本章概述

  2. rockx_vi_handle_thread线程流程图

  3. rockx_vi_handle_thread线程源码分析

3.1. 初始化rockx模块

3.2. 获取VI帧数据并执行人脸检测

3.3. 人脸数据筛选与对齐识别

3.4. 与数据库人脸特征比对

扩展

  1. 迭代器概念

1.1. 迭代器的定义

1.2. 迭代器基本操作

1.3. map容器迭代器的first和second

1.4. iter->first与(*iter).first的区别

  1. rockx_face_filter函数说明

  2. 线程参数传递机制

1. 本章概述

本章重点讲述rockx_vi_handle_thread线程的工作机制。该线程负责从VI模块获取视频流数据,并利用rockx库中的人脸检测、人脸识别及关键点检测功能进行实时人脸识别处理,最终将识别结果(包含人脸框坐标与识别标签)存入共享内存供其他模块使用。

2. rockx_vi_handle_thread线程流程图

如图所示,rockx_vi_handle_thread线程首先初始化三个核心模块:人脸检测、人脸识别以及关键点检测。随后,通过获取VI模块的视频帧数据,调用rockx_face_detect进行人脸定位,并将结果保存至全局变量。当检测到人脸时,进一步调用rockx_face_filter进行过滤处理。

经过过滤后,使用rockx_face_recognize完成人脸识别并提取特征。接着遍历已有的特征库,通过rockx_face_feature_similarity计算相似度,若低于阈值则判定为同一人,并根据特征值查找对应姓名,更新全局状态。

3. rockx_vi_handle_thread线程源码分析

3.1. 初始化rockx模块

此部分代码用于创建三个rockx句柄:

  • face_det_handle(人脸检测)
  • face_recognize_handle(人脸识别)
  • face_5landmarks_handle(关键点检测)

初始化过程包括分配rockx_config_t结构体、添加配置路径(位于/userdata/rockx_data),并通过rockx_create生成各模块句柄。

3.2. 获取VI帧并执行人脸检测

先初始化rockx_image_t结构体,设置宽高及像素格式为NV12。然后通过RK_MPI_SYS_GetMediaBuffer获取VI帧数据,并填充至rockx_image_t结构中。最后调用rockx_face_detect进行人脸检测,返回结果保存到face_array中,并通过set_rockx_face_array将其设为全局变量供其他线程读取。

// 执行人脸检测
rockx_ret = rockx_face_detect(face_det_handle, &input_image, &face_array, NULL);
if (rockx_ret != ROCKX_RET_SUCCESS)
{
    printf("rockx_face_detect ERROR %d\n", rockx_ret);
}

set_rockx_face_array(face_array);

此段代码实现了跨线程数据共享机制,使得show_vi_thread能获取并绘制人脸框。

3.3. 人脸数据筛选与对齐识别

若检测到人脸,则调用rockx_face_filter进行筛选,再使用rockx_face_align进行对齐,最终调用rockx_face_recognize提取特征值。

3.4. 特征比对与身份识别

遍历数据库中的所有特征值,逐一与当前帧的人脸特征比较。若相似度≤1.0,则认为是同一个人,从map中获取其名称并更新全局状态。

扩展

  1. 迭代器

示例代码展示了如何遍历map容器:

map<string, vector<float>> database_face_map;
map<string, vector<float>>::iterator database_iter;

for(database_iter = database_face_map.begin(); 
    database_iter != database_face_map.end(); 
    database_iter++)
{
    // 比较特征值
    float similarity;
    rockx_face_feature_similarity(&(database_iter->second), &rv1126_feature, &similarity);
}

1.1、迭代器的含义

迭代器可视为容器内的"指针",用于遍历元素。

1.2、迭代器基本操作

常用方式如下:

map<string, int>::iterator iter;
for(iter = scores.begin(); iter != scores.end(); iter++)
{
    cout << iter->first << " = " << iter->second << endl;
}
  • begin() 返回指向首元素的迭代器
  • end() 返回指向末尾的迭代器(不指向实际元素)
  • iter++ 移动到下一元素

1.3、map迭代器的first和second

每个map元素由键值对构成,first为key,second为value。

map<string, int> scores;
scores["zhangsan"] = 90;
// iter->first = "zhangsan"
// iter->second = 90

1.4、iter->first与(*iter).first等效

两种写法功能一致,推荐使用iter->first更简洁。

  1. rockx_face_filter函数说明

函数原型:

rockx_ret_t rockx_face_filter(rockx_handle_t handle, rockx_image_t *in_img, rockx_rect_t *in_box, int *is_false_face);

功能:用于过滤图像中非人脸区域,返回是否为真实人脸。

  1. 线程参数传递机制

pthread_t pid;
VI_PROC_PARAM * vi_arg_params = (VI_PROC_PARAM *)malloc(sizeof(VI_PROC_PARAM));
vi_arg_params->viId = 0;  // 设置VI通道编号
pthread_create(&pid, NULL, rockx_vi_handle_thread, (void *)vi_arg_params);

线程内部接收参数:

VI_PROC_PARAM vi_arg = *(VI_PROC_PARAM *)args;
free(args);
src_mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI, vi_arg.viId, -1);

这样可根据不同VI通道采集数据。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。