总结一下rk3588平台,所有抓图方法。
1.V4L2抓图video节点的选择确认
①raw 摄像头
raw摄像头正常有配置两条pipeline:
sensor -> csi2_dphy -> mipi_csi -> rkcif_mipi_lvds
rkcif_mipi_lvds_stdif -> rkisp_vir
因此有两个地方可以保存图像,rkcif和rkisp都可以保存图像,rkcif可以保存sensor的原始raw图像,也就是没有经过ISP调试3A的图像,rkisp可以保存经过ISP处理的YUV图像。
RKCIF的抓图的节点,一般是stream_cif_mipi_id0,id123....分别指的是MIPI的虚拟通道,在HDR模式下,id1是输出短帧,在PDAF的下,id1是一般输出PD图像。
RKISP的抓图节点,一般是rkisp_mainpath和rkisp_selfpath,mp可以输出全分辨率,sp只能输出最大1080P的分辨率。
console:/ # grep -H '' /sys/class/video4linux/video*/name
/sys/class/video4linux/video0/name:stream_cif_mipi_id0
/sys/class/video4linux/video1/name:stream_cif_mipi_id1
/sys/class/video4linux/video10/name:rkcif_tools_id2
/sys/class/video4linux/video11/name:rkisp_mainpath
/sys/class/video4linux/video12/name:rkisp_selfpath
/sys/class/video4linux/video13/name:rkisp_fbcpath
/sys/class/video4linux/video14/name:rkisp_iqtool
/sys/class/video4linux/video15/name:rkisp_rawrd0_m
/sys/class/video4linux/video16/name:rkisp_rawrd2_s
/sys/class/video4linux/video17/name:rkisp_rawrd1_l
/sys/class/video4linux/video18/name:rkisp-statistics
/sys/class/video4linux/video19/name:rkisp-input-params
/sys/class/video4linux/video2/name:stream_cif_mipi_id2
/sys/class/video4linux/video20/name:stream_hdmirx
/sys/class/video4linux/video3/name:stream_cif_mipi_id3
/sys/class/video4linux/video4/name:rkcif_scale_ch0
/sys/class/video4linux/video5/name:rkcif_scale_ch1
/sys/class/video4linux/video6/name:rkcif_scale_ch2
/sys/class/video4linux/video7/name:rkcif_scale_ch3
/sys/class/video4linux/video8/name:rkcif_tools_id0
/sys/class/video4linux/video9/name:rkcif_tools_id1
②YUV的sensor或者转接芯片
一些摄像头模组自带ISP,直接输出YUV的图像给主控,不需要主控的ISP进行处理,还有一些HDMI转MIPI-CSI的转接芯片以及AHD的转接芯片,直接输出YUV的数据给主控,这种配置一般只有一个pipeline:
sensor -> csi2_dphy -> mipi_csi -> rkcif_mipi_lvds
因此直接从对应的stream_cif_mipi_id0抓数据流即可。
2.V4L2开关数据流。
抓数据流可以参考如下命令,命令执行之后会输出帧率信息,说明数据流正常,主控的控制器有收到sensor给的帧信息,该指令没有保存图像,常用于调试,确认是否有MIPI输出数据等等。
v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4
3.抓RAW图
仅针对RAW sensor,抓raw图常用的方法有两种:
①V4l2抓raw图
因为是RKCIF输出RAW数据,因此也是针对stream_cif_mipi_id0节点抓即可。需要注意的是,直接抓的raw数据是紧凑型的,256字节对齐的数据。
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='BG10' --stream-mmap=3 --stream-skip=20 --stream-to=/data/1080p60.raw --stream-count=5 --stream-poll
抓非紧凑型的,需要在抓图之前设置,其中rkcif-mipi-lvds需要根据实际接口进行设置,如果是MIPI1则是rkcif-mipi-lvds1,以此类推。
echo 0 > /sys/devices/platform/rkcif-mipi-lvds/compact_test
②回读模式,预览场景下抓raw
如果使用的是回读模式的话,在app预览的情况下,可以通过aiq抓取raw数据,使用方法如下:
setprop persist.vendor.rkisp_no_read_back 0 //设置回读模式
mkdir /data/capture_image
chmod 777 /data/capture_image
echo 3 > /data/.capture_cnt
4.抓YUV图像
抓取ISP输出的YUV图像的几种方式总结。如果是raw sensor,则是抓取ISP输出的图像,如果是YUV的sensor,则是抓取RKCIF输出的。
①V4l2直接抓YUV图像,对mp或者sp
直接抓取的话,如果是raw sensor,是没有经过3A算法,抓到的图像正常会偏绿。
v4l2-ctl -d /dev/video11 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=3 --stream-skip=4 --stream-to=/data/1920x1080p60_nv12.yuv --stream-count=5 --stream-poll
②在3A server场景先,抓取图像
先执行3A server,跑3A算法
rkaiq_3A_server
然后再执行上述的命令抓取YUV图像,可以抓取经过isp 3A处理后的正常图像。
③使用rkaiq demo抓取
参考命令如下,不需要载跑3A server。这个demo会直接调用aiq的接口,抓到的图像也是ISP处理后的图像,需要指定iq文件的路径。
rkaiq_demo --device /dev/video11 --width 1920 --height 1080 --iqpath /vendor/etc/camera/rkisp2/ --rkaiq --stream-skip=10 --stream-count=50 --stream-to=/data/gc8034.yuv
④camera HAL 抓图
还可以在使用app预览的场下,通过设置,HAL来保存图像,使用如下,设置属性139,可以抓取video输出的原始YUV,经过RGA处理的预览图像,以及拍照时候的jpeg图像。图像保存在/data/dump目录下。
adb root
adb remount
adb shell setprop persist.vendor.camera.dump 139
adb shell setprop persist.vendor.camera.dump.cnt 20 设置dump20帧
adb shell setenforce 0
adb shell mkdir /data/dump
adb shell chmod 777 /data/dump/
adb shell setprop persist.vendor.camera.dump.path /data/dump/