跳到主要内容

应用测试 - 文字检测识别 (PP-OCR)

导航栏

在 RV1126B-p 上跑 Talowe talowe_ppocr_cam:摄像头实时 检测文字区域 + 识别内容(PP-OCRv4 det / rec 两套 RKNN),画四边形框后用 H.264 RTP 推到电脑,VLC 打开 ppocr.sdp 看画面。

源码: https://github.com/hbt021211-coder/talowe-rv1126b-aidemo

推理: RKNN | 采集: V4L2 /dev/video12 NV12 1920x1080 | 编码: MPP | 收流: UDP 5000

信息

Talowe 原工程用 OpenCV + GStreamer。出厂 Buildroot IPC 没有 GStreamer / 系统 OpenCV。
当前 Demo 采集编码已改成 V4L2 + RGA + MPP;检测后处理(轮廓 / 透视裁剪)仍链进工程自带的 OpenCV 3.4 静态库(opencv-linux-aarch64),不必往板子装 OpenCV。
编码走摄像头 NV12 直拷,框画在 NV12 上,避免 RGB→NV12 导致 VLC 全黑。

固件

本页流程按 RV1126B-p Buildroot IPC 来写(rkipc、/dev/video12、S99rkipc)。

  • 刷机见 升级固件 里的 RV1126B-p Buildroot IPC(Rockchip-RV1126B-Buildroot-IPC)
  • 不是必须重刷:板子已经是这套 IPC 固件,直接演示即可
  • 若当前是 Debian / 其它镜像,请先按该页刷成 Buildroot IPC,再按下面步骤操作

IPC 推流、账号密码见 固件使用 - IPC 推流。

警告

本 Demo 和 人体姿态、YOLOv5、YOLO26、YOLO11、人脸五官 共用摄像头 /dev/video12 和 UDP 5000,不能同时跑。
run_ppocr.sh 会先停掉其它 Demo / rkipc。


演示(直接看效果)​

环境按下面三台机器。电脑 IP 不是 10.0.0.49 时,把脚本参数改成你的 IP。

角色地址说明
收流电脑 (Mac)10.0.0.49装 VLC,打开 ppocr.sdp
RV1126B-pssh root@10.0.2.0默认密码见 固件使用
程序目录/root/rknn_ppocr_cam已部署好的安装包

1. 电脑先开 VLC​

把 ppocr.sdp 拷到电脑,例如 ~/ppocr.sdp。内容固定如下(端口 5000,不要改成板子 IP):

v=0
o=- 0 0 IN IP4 0.0.0.0
s=PPOCR
c=IN IP4 0.0.0.0
t=0 0
m=video 5000 RTP/AVP 96
a=rtpmap:96 H264/90000

安装包里还有一份同内容的 play.sdp(s=PPOCR)。演示本页请用 ppocr.sdp,不要和姿态 / YOLO 的 sdp 混用。

open -a VLC ~/ppocr.sdp

或 VLC → 文件 → 打开文件 → 选 ppocr.sdp。
第一次可能会要本机防火墙放行 UDP 5000,点允许。

VLC 会停在黑屏等流,属正常,下一步再起板端。

2. 板子启动推流​

ssh root@10.0.2.0
cd /root/rknn_ppocr_cam
./run_ppocr.sh 10.0.0.49

run_ppocr.sh 会:停掉其它 Demo / rkipc → 打开 /dev/video12 → 检测 + 识别 → 把 H.264 推到 10.0.0.49:5000。

看到类似日志即已出流:

v4l2 opened /dev/video12 1920x1080 stride=1920 nbufs=4
mpp rtp -> 10.0.0.49:5000 1920x1080
Pipeline initialized. Starting inference, RTP 10.0.0.49:5000 ...
[OCR] text: Hello score: 0.97 quad:(412,201)(890,198)(888,260)(410,263)

VLC 里应出现实时画面:文字区域四边形框、左上角 FPS。英文会叠在框旁;中文叠字用的是英文点阵字体,画面上可能只显示分数,完整识别内容看串口 [OCR] 日志。把纸质标签、屏幕文字、铭牌对摄像头即可。

手动等价命令(不用脚本时):

/etc/init.d/S99rkipc stop
cd /root/rknn_ppocr_cam
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
./rknn_ppocr_cam ./model/ppocrv4_det.rknn ./model/ppocrv4_rec.rknn /dev/video12 10.0.0.49

第四个参数必须是 电脑 IP,不是 10.0.2.0。

3. 演示结束,恢复 IPC​

Ctrl + C 停掉 Demo 后:

killall rknn_ppocr_cam rkaiq_3A_server 2>/dev/null
/etc/init.d/S99rkipc start

网页 / RTSP(rtsp://10.0.2.0:554/live/0)会恢复。
Demo 和 rkipc 不能同时占摄像头。


板端安装包内容​

root@rv1126bp-buildroot:~/rknn_ppocr_cam# ls
lib model play.sdp ppocr.sdp rknn_ppocr_cam run_ppocr.sh
文件作用
rknn_ppocr_cam主程序(检测 + 识别)
run_ppocr.sh停 rkipc 并启动,参数为电脑 IP
ppocr.sdp拷到电脑给 VLC 用(推荐)
play.sdp与 ppocr.sdp 内容相同,s=PPOCR
model/ppocrv4_det.rknn文字检测模型(约 2.5 MB)
model/ppocrv4_rec.rknn文字识别模型(约 6.9 MB)
model/ppocr_keys_v1.txt字表备份(识别字典已编译进 dict.h)
lib/librknnrt.so librga.so librockchip_mpp.soNPU / RGA / 编码

启动参数:

./rknn_ppocr_cam <det_model> <rec_model> <camera_index> <target_ipv4>
  • <camera_index>: ISP 主路,本板是 /dev/video12(v4l2-ctl --list-devices 里 rkisp_mainpath)
  • <target_ipv4>: 收流电脑局域网 IP,端口写死 5000

检测阈值在 main.cc:threshold 0.3,box_threshold 0.6,db_unclip_ratio 1.5。识别结果低于 TEXT_SCORE(ppocr_system.h,默认 0.5)会丢掉。


从源码编译再部署​

只演示可以跳过这一节。改代码或换板子时按下面做。

机器​

角色示例
本机~/SDK/talowe-rv1126b-aidemo(Mac 只改代码、rsync)
编译服务器ssh roy@10.0.0.18(x86_64 Ubuntu,交叉编译 aarch64)
板子ssh root@10.0.2.0

编译器用发行版交叉编译器即可,不必编完整 SDK host:

# 编译服务器(root)
apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu cmake

同步源码​

3rdparty/opencv 里 Android / armhf 包很大,本 Demo 只要 opencv-linux-aarch64(后处理静态链接)。

ssh roy@10.0.0.18 'mkdir -p ~/talowe-rv1126b-aidemo/talowe_ppocr_cam'

rsync -av --progress \
--exclude '.git' \
--exclude 'cpp/3rdparty/opencv/opencv-linux-armhf' \
--exclude 'cpp/3rdparty/opencv/opencv-android-sdk-build' \
--exclude 'cpp/build' \
--exclude 'cpp/install' \
~/SDK/talowe-rv1126b-aidemo/talowe_ppocr_cam/ \
roy@10.0.0.18:~/talowe-rv1126b-aidemo/talowe_ppocr_cam/

确认 model/ppocrv4_det.rknn(约 2.5 MB)和 model/ppocrv4_rec.rknn(约 6.9 MB)已在工程 model/ 里。

交叉编译​

ssh roy@10.0.0.18
cd ~/talowe-rv1126b-aidemo/talowe_ppocr_cam/cpp
chmod +x build-linux.sh
./build-linux.sh

产物:

~/talowe-rv1126b-aidemo/talowe_ppocr_cam/cpp/install/rv1126b_linux_aarch64/rknn_ppocr_cam/
# lib model play.sdp ppocr.sdp rknn_ppocr_cam run_ppocr.sh

CMakeLists.txt / build-linux.sh 使用 aarch64-linux-gnu-gcc,链板端已有的 librockchip_mpp(安装包里会带一份 so),以及自带 OpenCV 静态库。

推到板子​

板子 Buildroot 一般没有 rsync,从编译机打 tar 再解:

ssh roy@10.0.0.18 \
'tar czf - -C ~/talowe-rv1126b-aidemo/talowe_ppocr_cam/cpp/install/rv1126b_linux_aarch64 rknn_ppocr_cam' \
| ssh root@10.0.2.0 'tar xzf - -C /root'

USB 已连 adb 时也可以:

adb push rknn_ppocr_cam /root/

然后回到上文 演示 第 1、2 步。


数据通路​

IMX / Sensor
→ rkisp_mainpath /dev/video12 (NV12 1920x1080)
→ 拷一份 NV12 给编码(画框 / 字)
→ RGA 转 RGB888
→ RKNN PP-OCRv4 det(文字框)
→ 透视裁剪 + RKNN PP-OCRv4 rec(字符)
→ 在 NV12 上画四边形 / 分数 / FPS
→ MPP H.264(每个 IDR 带 SPS/PPS)
→ RTP PT=96 UDP → 电脑:5000
→ VLC 打开 ppocr.sdp

分辨率和端口写在 cpp/main.cc、cpp/run_ppocr.sh、ppocr.sdp / play.sdp,改 1080p / 5000 时三处一起改。


常见问题​

现象处理
VLC 一直黑屏先关 VLC 再开 ppocr.sdp,然后起板端;第四个参数必须是 电脑 IP;本机放行 UDP 5000
Camera open failed / VIDIOC_S_FMT failed其它 Demo / rkipc 还在跑。./run_ppocr.sh 会停它们
打开摄像头后画面全黑ISP 3A 没起来。脚本会起 rkaiq_3A_server /etc/iqfiles;确认模组已插好
有画面但没有框文字要完整、清晰入画;可把 threshold / box_threshold 略调低
串口有中文、画面上没有字点阵字体不支持中文,属正常;看 [OCR] 日志
演示完网页/RTSP 没了没恢复 rkipc:killall rknn_ppocr_cam 后 /etc/init.d/S99rkipc start
编译缺 aarch64-linux-gnu-gcc编译服务器 apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
The RKNN model can not be foundppocrv4_det.rknn / ppocrv4_rec.rknn 没放到工程 model/ 就编译了
链接 OpenCV 失败确认已同步 cpp/3rdparty/opencv/opencv-linux-aarch64(不要整目录排除 opencv)

摄像头节点确认:

v4l2-ctl --list-devices
rkisp_mainpath (platform:rkisp-vir0):
/dev/video12

和姿态 / YOLO 的差别​

人体姿态YOLOv5YOLO11本页 PP-OCR
工程talowe_yolov8_pose_camtalowe_yolov5_detection_camtalowe_yolo11_detection_camtalowe_ppocr_cam
模型yolov8_pose.rknnyolov5.rknn ~7.4 MByolo11.rknn ~4.2 MBppocrv4_det.rknn + ppocrv4_rec.rknn
输出框 + 17 点骨架框 + COCO 80 类名框 + COCO 80 类名四边形文字框 + 识别字符串
收流VLC play.sdpVLC yolov5.sdpVLC yolo11.sdpVLC ppocr.sdp
和 rkipc必须停必须停必须停必须停

本 Demo 启动参数是 4 个(det、rec、摄像头、电脑 IP),比 YOLO 多一个识别模型。


源代码和编译好的包下载​

链接: https://pan.baidu.com/s/15rNLzfb12Af8Sh_DX-KVBw?pwd=fanc
提取码: fanc

网盘里是两份压缩包:

包用途
talowe-rv1126b-aidemo源码,自己交叉编译
talowe-rv1126b-aidemo-app已经编好的板端程序(aarch64),拷到板子 /root/ 就能跑

发给客户 / 自己用时注意:

  1. run_*.sh 默认把 H.264 推到 10.0.0.49:5000。这是示例电脑 IP,必须改成收流电脑自己的局域网 IP:./run_xxx.sh <电脑IP>。
  2. 固件须为 RV1126B-p Buildroot IPC。Demo 和 rkipc 共用 /dev/video12,不能同时跑;脚本会先停 rkipc。
  3. 电脑用 本页对应的 sdp 开 VLC(本页是 ppocr.sdp,端口 5000),不要和其它 Demo 的 sdp 混用。
  4. talowe-rv1126b-aidemo-app 里请忽略 rknn_yolov5_demo(旧的图片推理残留)。摄像头实时检测用 rknn_yolov5_detection_cam。
  5. 源码里多数 Demo 已改为 V4L2 + RGA + MPP,不必带上全部 3rdparty/opencv(约 11 × 525 MB)。只有本页 PP-OCR 交叉编译还需要工程内的 OpenCV 静态库。

总结​

  1. 电脑 VLC 打开 ppocr.sdp(等 UDP 5000)
  2. 板子 cd /root/rknn_ppocr_cam && ./run_ppocr.sh 10.0.0.49
  3. 截图 / 演示后 killall rknn_ppocr_cam,/etc/init.d/S99rkipc start