本文档主要介绍了在基于RV1109/RV1126 SOC芯上的人脸识别开发实现的架构设计,开发实现过程,主要用的方式方法!这里主要介绍RV1109上使用SDK里的RKMEDIA里的接口应用加以说明!
介绍如何使用RKMEDIA中的VI,RGA,如何通过DRM来显示视频内容!
RV1109有支持4 LINE的MIPI CSI输入能力,所以开发一般都是使用MIPI的双摄像头方案,摄像头最大1920X1080的输入.具体的MIPI的摄像头接入配置,可以SDK中的DTS等配置,ISP的调试不在本文介绍,自己也不熟悉,针对一般的人脸识别应用RGB+IR的方案,比较低成本的国内的CMOS芯片都表现很不错。
在人脸识别应用中,图像Sensor一般会把16:9的画面,在物理上转个90度,贴成9:16的图像,以最大的获取到人身体的抓拍,一般的人脸识别的屏也是竖屏居多!
在rkmedia这套接口这里主要应用他的VI与RGA模块来实现人脸识别产品开发过程中的业务处理!
接口比较简单,这里主要说明主要的流程,处理逻辑, 视频数据流,具体的操作,SDK里有比较详细的DEMO说明!
这里的视频流主要如下:
CMOS Sensor 视频 -> Linux V4L2 Video设备- > ISP - > VI -> RGA
开发上ISP前端的数据处理,基本不需要开发上去处理,不过在调试ISP图像时,一般会使用V4L2的工具抓图!这部分SDK中在ISP调试部分有比较多的说明!
在调试ISP时,如果遇到视频图像问题,V4L2的工具就会起到很大的作用,可以方便用来排除,图像异是CMOS端引用的,还是ISP处理方面异常导致的!
视频到RGA这里后,会做比较多的处理:如视频图像的旋转,分辨率的改变!以不同的通道送给不同的业务,这里主要是算法、VO显示、VENC编码!
所以同一个VI通道在这里会分别绑定到不同的RGA通道上!
以RGB视频为例,算法需要处理一路,所以创建一路用于算法
VI(RGB) ->RGA->ALG(算法处理)
VI(RGB)->RGA->显示处理
VI(RGB)->RGA->VENC(编码处理)
上面使用的VI(RGB)都是使用的同一个VI通道! IR的处理也基本是一致!
在处理视频显示时并没有使用rkmedia的VO模块,这里使调用DRM的直接口直接显示的!这里的处理方式是使用 RK_MPI_SYS_RegisterOutCb 这个API对对应的RGA通道绑定一个回调处理函数!在回调处理函数中,把每一帧MEDIA_BUFFER图像通过 display_commit_ex 这个接口与UI叠加显示出来!
在算法检测上,同样也是使用API接口RK_MPI_SYS_RegisterOutCb绑定一个回调,把每一帧送去算法处理,只是在这里算法上一般是处理不到每一帧的,所以这里会做一些丢帧处理!这里的处理方式是用一个信号量检测一个绑在帧是否处理完,处理完后把一个新的帧送过去,没有时就丢帧处理!
视频编码方面,参考DEMO写的就好了!
大部分的算法使用IMAGE_TYPE_NV12来接收视频图像!分别有两个视频一路RGB,一路IR! 在RGA我把算法的与显示处理的图像大小设为一致了,这样比较方便绘制人脸识别框!因为这样等到的人脸坐标大小与显示的图像的坐标大小是一致的,不需要转换!
在RV1109这个芯片上,如果1W的人脸库,从人脸的检测,追踪,再到完成比对一般的算法在150ms左右!所以一秒识别处理上大概处理6,7帧的识别比对!
UI的显示处理上是基于DRM的方式实现的!SDK里已经实现了QT的集成,后续移值了LVGL显示,基本也是一致的操作!UI层放在最上层的,视频放在低层!
一般在业务处理方面,主要注意一个业务处理线程与视频识别线程的分开处理!不然很容易识别线程阻塞掉了!所以在整个产品业处中主要有三大线程处理
一个是UI主线程; 一个是人脸识别线程; 一个是业务处理线程
基本控制好这几个线程的交互、控制,即稳定可靠了!