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 摄像头,设备树中已经有:
ov13855@36 { compatible = "ovti,ov13855"; status = "okay"; };但板子中最初只有:
/etc/iqfiles/ov13850_CMK-CT0116_default.json缺少 OV13855 对应 IQ 文件:
ov13855_CMK-OT2016-FV1_default.json同时板子中最初也没有:
rkaiq_3A_server所以问题不是单纯缺 JSON,而是:
缺 OV13855 IQ 文件 + 缺 RKAIQ/3A 用户态程序一、确认运行时设备树中确实有 OV13855
1. 导出运行时设备树
一开始在/boot/dtb/rockchip/overlay目录执行:
sudodtc-Ifs-Odts /proc/device-tree>running.dts报错:
bash: running.dts: Permission denied报错原因
sudo只作用于dtc,但>重定向是普通用户执行的;并且当前目录/boot/dtb/rockchip/overlay普通用户无写权限。
解决方式
切换到用户目录导出:
cd~sudodtc-Ifs-Odts /proc/device-tree>running.dts然后查 OV13855:
grep-n"ov13855"running.dts查模组名和镜头名:
grep-n"camera-module-name\|camera-module-lens-name"running.dts确认设备树中有:
compatible = "ovti,ov13855"; rockchip,camera-module-name = "CMK-OT2016-FV1"; rockchip,camera-module-lens-name = "default";因此 IQ 文件名应为:
ov13855_CMK-OT2016-FV1_default.json二、确认 OV13855 是通过 overlay 启用的
这个部分我单独写了一篇笔记记录:
查看启动配置:
cat/boot/orangepiEnv.txtorangepiEnv.txt里面的内容是我通过orangepi-config修改的
输出中有:
fdtfile=rockchip/rk3588s-orangepi-5.dtb overlays=i2c3-m0 lcd2 ov13855-c3 pwm15-m2说明当前系统启动时加载了:
rk3588-ov13855-c3.dtbo所以运行时设备树是:
基础 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. 绑定镜像
虚拟机中执行:
IMG="Orangepi5_1.2.2_ubuntu_jammy_desktop_gnome_linux5.10.160.img"sudolosetup-Pf--show"$IMG"输出:
/dev/loop1查看分区:
lsblk /dev/loop1你的镜像只有一个分区:
/dev/loop1p12. 挂载镜像
sudomkdir-p/mnt/opirootsudomount-oro /dev/loop1p1 /mnt/opiroot3. 查找 JSON
精确查找:
sudofind/mnt/opiroot-iname"ov13855_CMK-OT2016-FV1_default.json"扩大查找:
sudofind/mnt/opiroot-iname"*ov13855*.json"查所有 IQ 文件:
sudofind/mnt/opiroot-path"*iqfiles*"-typef-iname"*.json"后来你在 SDK 中找到了:
ov13855_CMK-OT2016-FV1_default.json四、把 OV13855 JSON 拷到开发板
在开发板上确认/etc/iqfiles存在:
ls/etc/iqfiles然后复制 JSON:
sudomkdir-p/etc/iqfilessudocpov13855_CMK-OT2016-FV1_default.json /etc/iqfiles/sudochmod644/etc/iqfiles/ov13855_CMK-OT2016-FV1_default.jsonsync验证:
ls-lh/etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json你后来的输出是:
-rw-r--r-- 1 root root 346K May 15 09:34 /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json说明 JSON 已经放好。
五、检查开发板是否有 3A 程序
在开发板上查:
sudofind/-name"rkaiq_3A_server"2>/dev/null没有结果。
继续查:
sudofind/-iname"*rkaiq*"2>/dev/nullsudofind/-iname"*aiq*"2>/dev/nullsudofind/-iname"*3a*"2>/dev/null也没有有效的 RKAIQ/3A 程序。
再查 RKISP:
sudofind/-iname"*rkisp*"2>/dev/null结果能看到:
/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*进程检查:
ps-ef|grep-Ei"rkaiq|aiq|3a|rkisp"只有grep本身。
开发板上没有找到rkaiq_3A_serve
分析
这说明:
RKISP 内核驱动存在 但 RKAIQ/3A 用户态程序不存在所以只放 JSON 不够,必须补上:
rkaiq_3A_server librkaiq.so你上传的搜索结果也显示,板端未找到rkaiq_3A_server、rkaiq、aiq,但存在 rkisp 相关内核设备和节点。
六、从.img镜像中提取 rkaiq_3A_server
虚拟机中执行:
sudofind/mnt/opiroot-name"rkaiq_3A_server"找到:
/mnt/opiroot/usr/bin/rkaiq_3A_server确认架构:
file/mnt/opiroot/usr/bin/rkaiq_3A_server输出:
ELF 64-bit LSB pie executable, ARM aarch64说明它可以在 OrangePi 5 上运行。
查看依赖:
readelf-d/mnt/opiroot/usr/bin/rkaiq_3A_server|grepNEEDED输出包含:
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]在开发板上查找依赖
重点缺的是:
librkaiq.so七、复制 3A 程序到开发板
虚拟机执行:
scp/mnt/opiroot/usr/bin/rkaiq_3A_server orangepi@开发板IP:/home/orangepi/
开发板执行:
sudocp~/rkaiq_3A_server /usr/bin/sudochmod+x /usr/bin/rkaiq_3A_server八、解决 librkaiq.so 缺失问题
1. 开发板检查依赖
ldd /usr/bin/rkaiq_3A_server最初报错:
librkaiq.so => not found报错原因
rkaiq_3A_server是动态链接程序,运行时需要librkaiq.so,但开发板系统中没有这个库。
2. 在镜像中查找库
虚拟机执行:
sudofind/mnt/opiroot-name"librkaiq.so*"找到后复制到开发板:
scp/mnt/opiroot/实际路径/librkaiq.so* orangepi@开发板IP:/home/orangepi/3. 开发板安装库
sudocp~/librkaiq.so* /lib/aarch64-linux-gnu/sudochmod644/lib/aarch64-linux-gnu/librkaiq.so*sudoldconfig再次检查:
ldd /usr/bin/rkaiq_3A_server后来的输出变为:
librkaiq.so => /lib/aarch64-linux-gnu/librkaiq.so说明依赖已经解决。
九、启动 rkaiq_3A_server 时遇到参数错误
你执行:
sudo/usr/bin/rkaiq_3A_server-a/etc/iqfiles报错:
/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不支持:
-a/etc/iqfiles它只支持直接启动,或者加:
--silent它大概率默认从固定路径读取 IQ 文件,例如:
/etc/iqfiles/十、正确启动 3A 程序
前台启动
sudo/usr/bin/rkaiq_3A_server如果程序不退出,说明正在运行。
后台启动
sudo/usr/bin/rkaiq_3A_server&静默后台启动
sudo/usr/bin/rkaiq_3A_server--silent&带日志启动,推荐排错用
sudosh-c'/usr/bin/rkaiq_3A_server > /tmp/rkaiq.log 2>&1 &'查看日志:
cat/tmp/rkaiq.log检查进程:
ps-ef|grep-irkaiq如果看到:
/usr/bin/rkaiq_3A_server
说明 3A 服务已经运行。
十一、最终验证 ISP / 3A 是否生效
1. 检查 OV13855 IQ 文件
ls-lh/etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json2. 检查 3A 进程
ps-ef|grep-irkaiq3. 检查 media 链路
media-ctl-p|grep-iE"ov13855|rkisp|rkcif|mipi|csi"4. 检查日志
dmesg|grep-Ei"ov13855|rkisp|rkcif|mipi|csi|rkaiq|iq"5. 测试采集画面
gst-launch-1.0 v4l2srcdevice=/dev/video11!video/x-raw,format=NV12,width=1280,height=720!videoconvert!autovideosink使用3A算法后
使用3A算法前
之前偏绿是因为缺少 RKAIQ/3A 和正确 IQ 文件,启动 3A 后,颜色、曝光、白平衡明显改善。
十二、当前最终状态总结
已经完成:
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 参数现在正确启动命令是:
sudo/usr/bin/rkaiq_3A_server--silent&然后验证:
ps-ef|grep-irkaiq gst-launch-1.0 v4l2srcdevice=/dev/video11!video/x-raw,format=NV12,width=1280,height=720!videoconvert!autovideosink核心结论:
OV13855 设备树有了,IQ JSON 有了,3A 程序和依赖库也补齐了。 接下来只需要用正确方式启动 rkaiq_3A_server,并验证画面效果。