目录1.本项目的介绍2.本项目程序的大体框图3.本项目程序的思维导图1.本项目的介绍本项目主要呈现的功能是通过采集摄像头的视频数据并通过人脸识别把名称显示到VI数据并推送到流媒体服务器上面。这个项目运用的功能很多包括了rockx人脸检测、识别功能sqlite3数据库存储人脸功能rkmedia的VENC编码功能rkmedia的VI采集功能ffmpeg推流、OPENCV画框描绘文字功能。这个项目大部分功能都和第一阶段的功能点很像包括vi采集数据、VENC编码、 FFMPEG推流等功能。所以我们这个项目的特色是在第一阶段推流的基础上添加了rockx识别VI摄像头的人脸识别、sqlite3存储人脸特征值、对比数据库人脸特征和摄像头的人脸数据特征、OPENCV画框描绘文字等功能。2.本项目程序的大体框图上图是rv1126rockx人脸识别推流的大体框图这个项目首先要初始化模块和队列容器。模块包括两个VI模块第一个VI模块是用于ROCKX的人脸检测、人脸识别的AI推理第二个VI模块用于显示推理结果。除了模块外还需要初始化容器和队列容器包括Map容器(主要是存储人脸数据库的特征值和人脸名称)、视频编码队列。初始化所有东西后则需要使用四个线程去处理分别是rockx_vi_handle_thread线程、show_vi_thread线程、camera_venc_thread线程、video_push_thread线程。rockx_vi_handle_thread线程主要功能是读取第一个模块的VI数据并使用rockx框架对VI数据进行人脸检测和人脸识别当检测到人脸数据后先进行人脸过滤然后再调用人脸识别API对其进行人脸特征值的提取并把摄像头提取的人脸特征和数据库的人脸特征进行对比若相似度1.2则认为是同一个人若识别到同一个人则输出这个人的名字。show_vi_thread线程主要是获取第二个VI模块的摄像头数据然后获取rockx_vi_handle_thread线程的人脸坐标和人脸名称并用opencv显示到第二个VI模块里面然后把处理后的VI数据推送到VENC编码器里面。camera_venc_thread线程主要是获取VENC编码器的数据并把每一帧的VENC码流数据存放到H264的VIDEO_QUEUE的视频队列。video_push_thread线程从VIDEO_QUEUE的视频队列获取每一帧的视频编码数据然后再利用FFMPEG流媒体推流框架把视频编码数据传输到流媒体服务器(主要是RTMP服务器)。3.本项目程序的思维导图上图是rockx1126人脸识别的程序思维导图框图这个项目的main函数是整个项目的入口函数。在这里入口函数里面需要做四个比较重要的步骤分别是init_rkmedia_module_function初始化rkmdia的组件、初始化编码视频队列HIGH_VIDEO_QUEUE、init_face_data初始化数据库的人脸数据、init_rv1126_first_assignment开启RV1126的人脸识别推流任务。2.1. init_rkmedia_module_function初始化组件这个函数主要是做RKMEDIA的组件初始化组件包括AI推理的VI模块的初始化、视频显示的VI模块初始化、VENC模块的初始化2.1.1. AI推理模块的VI模块初始化这个VI模块主要是用于rockx的人脸检测、人脸识别的推理2.1.2.显示的VI模块初始化这个VI模块主要是用于显示rockx处理的结果包括人脸检测的坐标信息和人脸识别后的名称2.1.3.VENC模块的初始化初始化H264的编码模块2.2.初始化HIGH_VIDEO_QUEUE初始化1920 * 1080分辨率编码数据队列这个队列主要是存储1920 * 1080编码的视频数据主要是用于多线程处理2.3. init_face_data初始化数据库的人脸数据查询sqlite3人脸数据库的人脸特征值和姓名并通过map容器进行key-value存储key保存人的名称、value保存的是人脸特征值2.4. init_rv1126_first_assignment开启RV1126的人脸识别推流任务这个函数里面有五个步骤分别是init_rkmedia_ffmpeg_context初始化1920 * 1080分辨率的ffmpeg推流器、创建rockx_vi_handle_thread线程、创建show_vi_handle_thread线程、创建camera_venc_thread线程、创建high_video_push_thread线程。2.4.1. init_rkmedia_ffmpeg_context初始化1920 * 1080的推流器在这个函数里面主要是对FFMPEG推流器参数进行设置它需要对高分辨率(1920 * 1080)的FFMPEG推流器进行初始化。2.4.2.创建rockx_vi_handle_thread线程这个线程的作用是通过rockx框架对VI数据进行人脸检测、人脸识别处理然后把人脸检测的坐标信息和人脸识别的名称保存起来。2.4.3.创建show_vi_handle_thread线程这个线程的作用获取显示VI的摄像头数据然后获取rockx_vi_handle_thread线程处理的坐标信息和人脸名称并用opencv显示上去然后把处理后的VI数据发送到VENC编码器。2.4.4.创建camera_venc_thread线程这个线程主要功能是获取VENC编码器的码流数据并且把VENC的码流数据存放到high_video_queue的视频编码队列里面high_video_queue视频队列主要是为了推流线程用的。2.4.5.创建video_push_thread线程这个线程主要功能是获取high_video_queue队列的视频编码数据并利用FFMPEG流媒体框架把H264码流推送到RTMP流媒体服务器。