OrangePi 5 开发板补齐 OV13855 JSON 和 3A 算法全过程笔记
先放上前后对比图片
3A算法启动前

3A算法启动后

之前偏绿是因为缺少 RKAIQ/3A 和正确 IQ 文件,启动 3A 后,颜色、曝光、白平衡明显改善。
相机实现自动白平衡,自动曝光等功能,最重要的是ov13855_CMK-OT2016-FV1_default.json 文件和
rkaiq_3A_server程序.
这两个文件都属于 瑞芯微 (Rockchip) 平台的摄像头处理框架 RKAIQ (Rockchip AIQ)。它们共同负责摄像头的图像信号处理(ISP)和 3A 算法(自动曝光、自动白平衡、自动对焦)的运行。
1. ov13855_CMK-OT2016-FV1_default.json
这是一个 摄像头效果配置文件 (通常被称为 IQ 文件 或 Tuning 文件)。
- 文件名解析 :
ov13855:代表摄像头的传感器型号(OmniVision 13855,一款1300万像素的传感器)。CMK-OT2016-FV1:代表摄像头模组的厂家和型号,以及搭配的镜头信息。.json:文件格式,内部存储了大量的配置参数。
- 主要作用 :
- 参数库:它存储了针对该特定摄像头硬件(感光芯片 + 镜头)调试出的最优参数。
- 3A 初始化:包含 AE(自动曝光)的亮度目标、AWB(自动白平衡)的色温曲线、AF(自动对焦)的搜索步长等。
- 图像增强:包含降噪(NR)、锐化、去畸变(LSC)、色彩校正(CCM)等 ISP 模块的配置参数。
- 适配性:如果没有这个文件或者文件不匹配,摄像头虽然可能出图,但会出现画面偏色、亮度异常、对焦模糊等问题。
2. rkaiq_3A_server
这是一个 用户态服务程序(Daemon/Server),是整个摄像头引擎的核心运行实体。
- 主要作用 :
- 算法引擎:它负责运行 3A 算法逻辑。它从内核(ISP 驱动)获取统计数据(如画面亮度、色彩分布),计算出下一步的曝光时间、增益和白平衡参数。
- 加载配置 :在启动时,它会去扫描系统目录(通常是
/etc/iqfiles/),根据当前接入的摄像头型号加载上述的.json配置文件。 - 硬件通信:它充当了上层应用(如拍照 App)与底层硬件驱动之间的桥梁。它通过 V4L2 接口将计算好的参数下发给 ISP 硬件控制器。
- 实时调试:它通常还支持调试功能,可以配合 PC 端的瑞芯微调试工具(RKISP Tuner)实时修改图像效果。
两者的关系
简单来说:
ov13855...json是"乐谱":记录了声音(图像)应该如何表现。rkaiq_3A_server是"演奏者":他读取乐谱,并根据实际情况(环境光线变化)实时调整演奏方式,最终产生清晰、准确的视频画面。
常见应用场景:
如果你在开发基于 RK3568、RK3588 等芯片的嵌入式设备,当你更换了不同型号的摄像头模组时,就需要将对应的 .json 文件放到指定位置,并确保 rkaiq_3A_server 正常运行,否则摄像头将无法达到最佳显示效果。
0. 问题背景
开发板使用 OV13855 摄像头,设备树中已经有:
dts
ov13855@36 {
compatible = "ovti,ov13855";
status = "okay";
};
但板子中最初只有:
text
/etc/iqfiles/ov13850_CMK-CT0116_default.json

缺少 OV13855 对应 IQ 文件:
text
ov13855_CMK-OT2016-FV1_default.json
同时板子中最初也没有:
text
rkaiq_3A_server
所以问题不是单纯缺 JSON,而是:
text
缺 OV13855 IQ 文件
+
缺 RKAIQ/3A 用户态程序
一、确认运行时设备树中确实有 OV13855
1. 导出运行时设备树
一开始在 /boot/dtb/rockchip/overlay 目录执行:
bash
sudo dtc -I fs -O dts /proc/device-tree > running.dts
报错:
text
bash: running.dts: Permission denied
报错原因
sudo 只作用于 dtc,但 > 重定向是普通用户执行的;并且当前目录 /boot/dtb/rockchip/overlay 普通用户无写权限。
解决方式
切换到用户目录导出:
bash
cd ~
sudo dtc -I fs -O dts /proc/device-tree > running.dts
然后查 OV13855:
bash
grep -n "ov13855" running.dts
查模组名和镜头名:
bash
grep -n "camera-module-name\|camera-module-lens-name" running.dts
确认设备树中有:
dts
compatible = "ovti,ov13855";
rockchip,camera-module-name = "CMK-OT2016-FV1";
rockchip,camera-module-lens-name = "default";

因此 IQ 文件名应为:
text
ov13855_CMK-OT2016-FV1_default.json
二、确认 OV13855 是通过 overlay 启用的
这个部分我单独写了一篇笔记记录:
查看启动配置:
bash
cat /boot/orangepiEnv.txt
orangepiEnv.txt里面的内容是我通过orangepi-config修改的

输出中有:
text
fdtfile=rockchip/rk3588s-orangepi-5.dtb
overlays=i2c3-m0 lcd2 ov13855-c3 pwm15-m2
说明当前系统启动时加载了:
text
rk3588-ov13855-c3.dtbo
所以运行时设备树是:
text
基础 DTB
+ i2c3-m0 overlay
+ lcd2 overlay
+ ov13855-c3 overlay
+ pwm15-m2 overlay
= /proc/device-tree 中的最终运行时设备树
三、从 .img 镜像中查找 OV13855 JSON
原因:我ubuntu里面下载的SDK版本里面没有OV13855 JSON

思路:找一个发布时间比较近的ubuntu镜像,在.img文件中尝试提取OV13855 JSON(不一定有)

1. 绑定镜像
虚拟机中执行:
bash
IMG="Orangepi5_1.2.2_ubuntu_jammy_desktop_gnome_linux5.10.160.img"
sudo losetup -Pf --show "$IMG"
输出:
text
/dev/loop1
查看分区:
bash
lsblk /dev/loop1
你的镜像只有一个分区:
text
/dev/loop1p1
2. 挂载镜像
bash
sudo mkdir -p /mnt/opiroot
sudo mount -o ro /dev/loop1p1 /mnt/opiroot
3. 查找 JSON
精确查找:
bash
sudo find /mnt/opiroot -iname "ov13855_CMK-OT2016-FV1_default.json"
扩大查找:
bash
sudo find /mnt/opiroot -iname "*ov13855*.json"
查所有 IQ 文件:
bash
sudo find /mnt/opiroot -path "*iqfiles*" -type f -iname "*.json"
后来你在 SDK 中找到了:
text
ov13855_CMK-OT2016-FV1_default.json
四、把 OV13855 JSON 拷到开发板
在开发板上确认 /etc/iqfiles 存在:
bash
ls /etc/iqfiles
然后复制 JSON:
bash
sudo mkdir -p /etc/iqfiles
sudo cp ov13855_CMK-OT2016-FV1_default.json /etc/iqfiles/
sudo chmod 644 /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json
sync
验证:
bash
ls -lh /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json
你后来的输出是:
text
-rw-r--r-- 1 root root 346K May 15 09:34 /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json

说明 JSON 已经放好。
五、检查开发板是否有 3A 程序
在开发板上查:
bash
sudo find / -name "rkaiq_3A_server" 2>/dev/null
没有结果。
继续查:
bash
sudo find / -iname "*rkaiq*" 2>/dev/null
sudo find / -iname "*aiq*" 2>/dev/null
sudo find / -iname "*3a*" 2>/dev/null
也没有有效的 RKAIQ/3A 程序。
再查 RKISP:
bash
sudo find / -iname "*rkisp*" 2>/dev/null
结果能看到:
text
/usr/lib/librkisp.so
/sys/devices/platform/fdcc0000.rkisp
/sys/devices/platform/fdcb0000.rkisp
/sys/module/video_rkisp
/dev/v4l/by-path/platform-rkisp1-vir0-video-index*
进程检查:
bash
ps -ef | grep -Ei "rkaiq|aiq|3a|rkisp"
只有 grep 本身。

开发板上没有找到rkaiq_3A_serve
分析
这说明:
text
RKISP 内核驱动存在
但 RKAIQ/3A 用户态程序不存在
所以只放 JSON 不够,必须补上:
text
rkaiq_3A_server
librkaiq.so
你上传的搜索结果也显示,板端未找到 rkaiq_3A_server、rkaiq、aiq,但存在 rkisp 相关内核设备和节点。
六、从 .img 镜像中提取 rkaiq_3A_server
虚拟机中执行:
bash
sudo find /mnt/opiroot -name "rkaiq_3A_server"
找到:
text
/mnt/opiroot/usr/bin/rkaiq_3A_server
确认架构:
bash
file /mnt/opiroot/usr/bin/rkaiq_3A_server
输出:
text
ELF 64-bit LSB pie executable, ARM aarch64
说明它可以在 OrangePi 5 上运行。

查看依赖:
bash
readelf -d /mnt/opiroot/usr/bin/rkaiq_3A_server | grep NEEDED

输出包含:
text
Shared library: [librkaiq.so]
Shared library: [libpthread.so.0]
Shared library: [libdl.so.2]
Shared library: [libstdc++.so.6]
Shared library: [libm.so.6]
Shared library: [libgcc_s.so.1]
Shared library: [libc.so.6]
Shared library: [ld-linux-aarch64.so.1]
在开发板上查找依赖

重点缺的是:
text
librkaiq.so
七、复制 3A 程序到开发板
虚拟机执行:
bash
scp /mnt/opiroot/usr/bin/rkaiq_3A_server orangepi@开发板IP:/home/orangepi/

开发板执行:
bash
sudo cp ~/rkaiq_3A_server /usr/bin/
sudo chmod +x /usr/bin/rkaiq_3A_server
八、解决 librkaiq.so 缺失问题
1. 开发板检查依赖
bash
ldd /usr/bin/rkaiq_3A_server
最初报错:
text
librkaiq.so => not found

报错原因
rkaiq_3A_server 是动态链接程序,运行时需要 librkaiq.so,但开发板系统中没有这个库。
2. 在镜像中查找库
虚拟机执行:
bash
sudo find /mnt/opiroot -name "librkaiq.so*"
找到后复制到开发板:
bash
scp /mnt/opiroot/实际路径/librkaiq.so* orangepi@开发板IP:/home/orangepi/
3. 开发板安装库
bash
sudo cp ~/librkaiq.so* /lib/aarch64-linux-gnu/
sudo chmod 644 /lib/aarch64-linux-gnu/librkaiq.so*
sudo ldconfig

再次检查:
bash
ldd /usr/bin/rkaiq_3A_server
后来的输出变为:
text
librkaiq.so => /lib/aarch64-linux-gnu/librkaiq.so

说明依赖已经解决。
九、启动 rkaiq_3A_server 时遇到参数错误
你执行:
bash
sudo /usr/bin/rkaiq_3A_server -a /etc/iqfiles
报错:
text
/usr/bin/rkaiq_3A_server: invalid option -- 'a'
ERR: Usage: /usr/bin/rkaiq_3A_server to start 3A engine
--silent, optional, subpress debug log

命令行前面是一个蓝色实心的圆说明指令执行成功;如果是一个红色空心圆,里面是红×说明执行失败.
报错原因
这个版本的 rkaiq_3A_server 不支持:
bash
-a /etc/iqfiles
它只支持直接启动,或者加:
bash
--silent
它大概率默认从固定路径读取 IQ 文件,例如:
text
/etc/iqfiles/
十、正确启动 3A 程序
前台启动
bash
sudo /usr/bin/rkaiq_3A_server
如果程序不退出,说明正在运行。
后台启动
bash
sudo /usr/bin/rkaiq_3A_server &
静默后台启动
bash
sudo /usr/bin/rkaiq_3A_server --silent &
带日志启动,推荐排错用
bash
sudo sh -c '/usr/bin/rkaiq_3A_server > /tmp/rkaiq.log 2>&1 &'
查看日志:
bash
cat /tmp/rkaiq.log
检查进程:
bash
ps -ef | grep -i rkaiq
如果看到:
text
/usr/bin/rkaiq_3A_server

说明 3A 服务已经运行。
十一、最终验证 ISP / 3A 是否生效
1. 检查 OV13855 IQ 文件
bash
ls -lh /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json
2. 检查 3A 进程
bash
ps -ef | grep -i rkaiq
3. 检查 media 链路
bash
media-ctl -p | grep -iE "ov13855|rkisp|rkcif|mipi|csi"
4. 检查日志
bash
dmesg | grep -Ei "ov13855|rkisp|rkcif|mipi|csi|rkaiq|iq"
5. 测试采集画面
bash
gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=1280,height=720 ! videoconvert ! autovideosink
使用3A算法后

使用3A算法前

之前偏绿是因为缺少 RKAIQ/3A 和正确 IQ 文件,启动 3A 后,颜色、曝光、白平衡明显改善。
十二、当前最终状态总结
已经完成:
text
1. 确认运行时设备树中有 OV13855
2. 确认模组名是 CMK-OT2016-FV1
3. 找到对应 IQ 文件 ov13855_CMK-OT2016-FV1_default.json
4. 拷贝 IQ 文件到 /etc/iqfiles/
5. 从 .img 中提取 rkaiq_3A_server
6. 从 .img 中提取并安装 librkaiq.so
7. 解决 ldd 中 librkaiq.so not found 问题
8. 明确当前 rkaiq_3A_server 不支持 -a 参数
现在正确启动命令是:
bash
sudo /usr/bin/rkaiq_3A_server --silent &
然后验证:
bash
ps -ef | grep -i rkaiq
gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=1280,height=720 ! videoconvert ! autovideosink
核心结论:
text
OV13855 设备树有了,IQ JSON 有了,3A 程序和依赖库也补齐了。
接下来只需要用正确方式启动 rkaiq_3A_server,并验证画面效果。
