1. RKmedia与RV1109/RV1126平台概述RV1109和RV1126是瑞芯微推出的两款高性能AI视觉处理芯片专为边缘计算场景设计。这两款芯片都搭载了独立的NPU神经网络处理单元RV1109提供1.2TOPS算力而RV1126则达到2.0TOPS能够高效运行各类计算机视觉算法。在实际项目中我经常用它们来做智能门禁、交通监控这类需要实时分析的场景实测下来推理速度比普通ARM芯片快3-5倍。RKmedia是瑞芯微官方提供的多媒体处理框架它封装了硬件加速接口让开发者可以更方便地调用芯片的编解码、ISP和AI加速能力。这个框架最实用的地方在于它把复杂的硬件操作简化成了几个API调用。比如你想用NPU跑一个人脸检测模型不用自己写DRV驱动直接调用RKmedia的RK_MPI_SYS_Bind和RK_MPI_AI_SendFrame就行。说到人脸和车牌识别SDK它其实是基于RKmedia的二次开发包。我去年在做一个智慧社区项目时就用的这个方案最大的感受是部署特别简单——不需要自己训练模型SDK里已经内置了优化好的CNN网络直接加载就能用。下面这张表对比了原生RKmedia和这个SDK的主要区别功能项原生RKmedia人脸车牌识别SDK模型支持需要自行转换和部署预置优化模型开箱即用接口复杂度需要处理硬件绑定等底层操作封装成高级API如FaceSDK类典型延迟50-100ms30-60ms实测值适用场景通用多媒体处理专注人脸/车牌识别2. SDK部署与快速验证拿到SDK包后首先要注意目录结构。以face_recog_lib_rk为例里面有几个关键文件face_sdk.cpp/h人脸识别的核心封装类plate_sdk.cpp/h车牌识别的核心封装类face_demo.cpp人脸检测的示例代码plate_demo.cpp车牌识别的示例代码部署到设备上有几个坑要特别注意动态库依赖RV1126的Buildroot系统可能会缺某些库记得把3rdparty/lib64下的so文件放到LD_LIBRARY_PATH包含的路径里。我有次部署时忘了这个结果demo跑起来直接段错误排查了半天才发现是libopencv_core.so.4.5找不到。License绑定每个设备需要独立的license.key文件。这个文件必须放在/userdata/face_app/bin/目录下否则初始化时会报License invalid错误。曾经有个客户把文件放错了位置结果人脸检测永远返回空结果。快速验证的实操步骤# 解压SDK包 tar -xvf face_demo_20230815.tar -C /userdata/ cd /userdata/face_app/bin/ # 运行人脸检测demo ./run_face_demo.sh # 运行车牌识别demo ./run_plate_demo.sh跑通demo后你会在/userdata/face_app/data/下看到带标注的结果图片。如果想调整检测参数可以修改face_demo.cpp里的这些关键变量FACE_QUALITY_THRESHOLD过滤低质量人脸建议80-85FACE_RECOG_SCORE_THRESHOLD识别相似度阈值建议87-90BIGGER_FACE_MODE是否只检测最大人脸门禁场景建议true3. 核心API解析与使用技巧FaceSDK类的设计非常实用我结合项目经验说几个重点API的用法初始化阶段// 必须传入正确的license路径 FaceSDK recognizer(/userdata/face_app/bin/face_demo_license.key);图片加载// 方式1直接加载BGR格式的内存数据OpenCV默认格式 cv::Mat image cv::imread(test.jpg); int face_count 0; recognizer.loadRawImage(image.data, image.cols, image.rows, false, face_count); // 方式2加载JPEG/PNG压缩数据适合网络传输场景 std::ifstream file(test.jpg, std::ios::binary); std::vectorunsigned char buffer((std::istreambuf_iteratorchar(file)), std::istreambuf_iteratorchar()); recognizer.loadEncodedImage(buffer.data(), buffer.size(), false, face_count);获取检测结果std::vectorFaceDetectResult results(face_count); recognizer.getAllFaces(results.data()); for(int i0; iface_count; i){ if(results[i].quality 80) continue; // 质量过滤 // 提取人脸特征 float feature[512]; recognizer.getFaceFeature(i, feature); // 获取对齐后的人脸区域 cv::Mat aligned_face; recognizer.getFaceImage(i, aligned_face); }在实际项目中我总结出几个优化点内存复用频繁创建vector会引发内存碎片建议预分配足够大的buffer异步处理对于高帧率场景可以用双缓冲生产者消费者模式参数调优夜间场景建议降低quality_threshold到75同时开启histogram equalization4. 二次开发实战指南要把SDK集成到自己的项目里Makefile的编写很关键。这是我常用的编译配置CXX aarch64-linux-gnu-g CFLAGS -O2 -Wall -stdc11 INCLUDES -I./include -I./3rdparty/include LIBS -L./lib64 -L./3rdparty/lib64 -lface_recog -lopencv_core -lopencv_imgproc face_demo: face_demo.cpp $(CXX) $(CFLAGS) $(INCLUDES) $^ -o $ $(LIBS)门禁系统集成示例class FaceAccessControl { public: void onFrameReceived(cv::Mat frame) { // 步骤1人脸检测 int face_count 0; face_sdk_.loadRawImage(frame.data, frame.cols, frame.rows, true, face_count); if(face_count 0) { // 步骤2质量过滤与特征提取 std::vectorFaceDetectResult results(face_count); face_sdk_.getAllFaces(results.data()); float feature[512]; face_sdk_.getFaceFeature(0, feature); // 步骤3与底库比对 for(auto db_feature : database_) { int score face_sdk_.faceSimilarity(feature, db_feature.data()); if(score 89) { // 匹配成功 triggerDoorOpen(); break; } } } } private: FaceSDK face_sdk_; std::vectorstd::arrayfloat,512 database_; };交通监控场景的特殊处理车牌识别需要设置ROI区域减少误检PlateDetectParam params; params.roi_left 100; // 只检测画面中央区域 params.roi_top 300; params.roi_right 1820; params.roi_bottom 800; plate_sdk_.setDetectParams(params);对于运动模糊的车牌建议先做deblur处理cv::Mat deblur(const cv::Mat plate_img) { cv::Mat gray, deblurred; cv::cvtColor(plate_img, gray, cv::COLOR_BGR2GRAY); cv::GaussianBlur(gray, gray, cv::Size(0,0), 3); cv::addWeighted(gray, 1.5, gray, -0.5, 0, deblurred); return deblurred; }在真实项目中踩过的坑RV1126的RGA有对齐要求图片宽高必须是4的倍数。有次处理1921x1081的视频流直接crash后来加了个对齐函数才解决多线程调用时记得给FaceSDK实例加锁RKmedia的硬件加速器不是线程安全的温度过高会导致NPU降频长时间运行的设备建议加散热片
基于RKmedia的RV1109/RV1126人脸与车牌识别SDK实战:从部署到二次开发全解析
发布时间:2026/6/29 14:08:57
1. RKmedia与RV1109/RV1126平台概述RV1109和RV1126是瑞芯微推出的两款高性能AI视觉处理芯片专为边缘计算场景设计。这两款芯片都搭载了独立的NPU神经网络处理单元RV1109提供1.2TOPS算力而RV1126则达到2.0TOPS能够高效运行各类计算机视觉算法。在实际项目中我经常用它们来做智能门禁、交通监控这类需要实时分析的场景实测下来推理速度比普通ARM芯片快3-5倍。RKmedia是瑞芯微官方提供的多媒体处理框架它封装了硬件加速接口让开发者可以更方便地调用芯片的编解码、ISP和AI加速能力。这个框架最实用的地方在于它把复杂的硬件操作简化成了几个API调用。比如你想用NPU跑一个人脸检测模型不用自己写DRV驱动直接调用RKmedia的RK_MPI_SYS_Bind和RK_MPI_AI_SendFrame就行。说到人脸和车牌识别SDK它其实是基于RKmedia的二次开发包。我去年在做一个智慧社区项目时就用的这个方案最大的感受是部署特别简单——不需要自己训练模型SDK里已经内置了优化好的CNN网络直接加载就能用。下面这张表对比了原生RKmedia和这个SDK的主要区别功能项原生RKmedia人脸车牌识别SDK模型支持需要自行转换和部署预置优化模型开箱即用接口复杂度需要处理硬件绑定等底层操作封装成高级API如FaceSDK类典型延迟50-100ms30-60ms实测值适用场景通用多媒体处理专注人脸/车牌识别2. SDK部署与快速验证拿到SDK包后首先要注意目录结构。以face_recog_lib_rk为例里面有几个关键文件face_sdk.cpp/h人脸识别的核心封装类plate_sdk.cpp/h车牌识别的核心封装类face_demo.cpp人脸检测的示例代码plate_demo.cpp车牌识别的示例代码部署到设备上有几个坑要特别注意动态库依赖RV1126的Buildroot系统可能会缺某些库记得把3rdparty/lib64下的so文件放到LD_LIBRARY_PATH包含的路径里。我有次部署时忘了这个结果demo跑起来直接段错误排查了半天才发现是libopencv_core.so.4.5找不到。License绑定每个设备需要独立的license.key文件。这个文件必须放在/userdata/face_app/bin/目录下否则初始化时会报License invalid错误。曾经有个客户把文件放错了位置结果人脸检测永远返回空结果。快速验证的实操步骤# 解压SDK包 tar -xvf face_demo_20230815.tar -C /userdata/ cd /userdata/face_app/bin/ # 运行人脸检测demo ./run_face_demo.sh # 运行车牌识别demo ./run_plate_demo.sh跑通demo后你会在/userdata/face_app/data/下看到带标注的结果图片。如果想调整检测参数可以修改face_demo.cpp里的这些关键变量FACE_QUALITY_THRESHOLD过滤低质量人脸建议80-85FACE_RECOG_SCORE_THRESHOLD识别相似度阈值建议87-90BIGGER_FACE_MODE是否只检测最大人脸门禁场景建议true3. 核心API解析与使用技巧FaceSDK类的设计非常实用我结合项目经验说几个重点API的用法初始化阶段// 必须传入正确的license路径 FaceSDK recognizer(/userdata/face_app/bin/face_demo_license.key);图片加载// 方式1直接加载BGR格式的内存数据OpenCV默认格式 cv::Mat image cv::imread(test.jpg); int face_count 0; recognizer.loadRawImage(image.data, image.cols, image.rows, false, face_count); // 方式2加载JPEG/PNG压缩数据适合网络传输场景 std::ifstream file(test.jpg, std::ios::binary); std::vectorunsigned char buffer((std::istreambuf_iteratorchar(file)), std::istreambuf_iteratorchar()); recognizer.loadEncodedImage(buffer.data(), buffer.size(), false, face_count);获取检测结果std::vectorFaceDetectResult results(face_count); recognizer.getAllFaces(results.data()); for(int i0; iface_count; i){ if(results[i].quality 80) continue; // 质量过滤 // 提取人脸特征 float feature[512]; recognizer.getFaceFeature(i, feature); // 获取对齐后的人脸区域 cv::Mat aligned_face; recognizer.getFaceImage(i, aligned_face); }在实际项目中我总结出几个优化点内存复用频繁创建vector会引发内存碎片建议预分配足够大的buffer异步处理对于高帧率场景可以用双缓冲生产者消费者模式参数调优夜间场景建议降低quality_threshold到75同时开启histogram equalization4. 二次开发实战指南要把SDK集成到自己的项目里Makefile的编写很关键。这是我常用的编译配置CXX aarch64-linux-gnu-g CFLAGS -O2 -Wall -stdc11 INCLUDES -I./include -I./3rdparty/include LIBS -L./lib64 -L./3rdparty/lib64 -lface_recog -lopencv_core -lopencv_imgproc face_demo: face_demo.cpp $(CXX) $(CFLAGS) $(INCLUDES) $^ -o $ $(LIBS)门禁系统集成示例class FaceAccessControl { public: void onFrameReceived(cv::Mat frame) { // 步骤1人脸检测 int face_count 0; face_sdk_.loadRawImage(frame.data, frame.cols, frame.rows, true, face_count); if(face_count 0) { // 步骤2质量过滤与特征提取 std::vectorFaceDetectResult results(face_count); face_sdk_.getAllFaces(results.data()); float feature[512]; face_sdk_.getFaceFeature(0, feature); // 步骤3与底库比对 for(auto db_feature : database_) { int score face_sdk_.faceSimilarity(feature, db_feature.data()); if(score 89) { // 匹配成功 triggerDoorOpen(); break; } } } } private: FaceSDK face_sdk_; std::vectorstd::arrayfloat,512 database_; };交通监控场景的特殊处理车牌识别需要设置ROI区域减少误检PlateDetectParam params; params.roi_left 100; // 只检测画面中央区域 params.roi_top 300; params.roi_right 1820; params.roi_bottom 800; plate_sdk_.setDetectParams(params);对于运动模糊的车牌建议先做deblur处理cv::Mat deblur(const cv::Mat plate_img) { cv::Mat gray, deblurred; cv::cvtColor(plate_img, gray, cv::COLOR_BGR2GRAY); cv::GaussianBlur(gray, gray, cv::Size(0,0), 3); cv::addWeighted(gray, 1.5, gray, -0.5, 0, deblurred); return deblurred; }在真实项目中踩过的坑RV1126的RGA有对齐要求图片宽高必须是4的倍数。有次处理1921x1081的视频流直接crash后来加了个对齐函数才解决多线程调用时记得给FaceSDK实例加锁RKmedia的硬件加速器不是线程安全的温度过高会导致NPU降频长时间运行的设备建议加散热片