在RV1126装debian/ubuntu之后,读取imx415数据

有需求要在1126用python, 并且当然, 要读摄像头, 折腾了半天.

首先, 从哪里拿数据?
1126上面, 拿数据的设备节点有好个,

  1. raw数据读取的点, 就是VICAP设备节点,
  2. isp的尾端, 就是媒体节点为mainpath.
  3. ispp的尾端, 就是媒体节点为rk_ispp_scale0/rk_m_by_pass等

区别是, VICAP是从摄像头直接取数据, 拿到的是raw数据, 张这样:
在RV1126装debian/ubuntu之后,读取imx415数据_第1张图片
怎么看怎么别扭是吧, 但是这样是对的, 因为是GB10格式.

mainpath的节点可以从isp后面拿, 但是只支持从当IMX415接在CSI 1的时候, 而易百纳的板子如果要把IMX415接到CSI1, 需要改设备树, 我先想想更简单的办法.

最后就是在ispp的后端, 就是平时rkmedia接数据的地方, 获取数据, 但是需要ispserver, 就是ispp服务, ispp本身在firefly的镜像里面是没有的, 哐哐一通移植, 现在我移植已经有了点心得了, 简单来说, 你看, 在buildroot的镜像中, 其实是有ispserver这个东西的, 包括依赖的库之类, 那么思路就简单了, 直接复制到板子上, 再用ldd ispserver, 看看都依赖啥:

root@firefly:/app# ldd ispserver
        linux-vdso.so.1 (0xaefa2000)
        libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xa6f6b000)
        librkaiq.so => /usr/lib/librkaiq.so (0xa6d6e000)
        libgdbus.so => /usr/lib/libgdbus.so (0xa6d53000)
        libIPCProtocol.so => /usr/lib/libIPCProtocol.so (0xa6d27000)
        libglib-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libglib-2.0.so.0 (0xa6c46000)
        libdbus-1.so.3 => /lib/arm-linux-gnueabihf/libdbus-1.so.3 (0xa6c05000)
        libjson-c.so.3 => /usr/lib/arm-linux-gnueabihf/libjson-c.so.3 (0xa6bed000)
        libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xa6ae2000)
        libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xa6a67000)
        libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xa6a3e000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xa6942000)
        /lib/ld-linux-armhf.so.3 (0xa6f90000)
        libdbus-c++-1.so.0 => /usr/lib/libdbus-c++-1.so.0 (0xa6914000)
        librkdb.so => /usr/lib/librkdb.so (0xa6902000)
        libsqlite3.so.0 => /usr/lib/arm-linux-gnueabihf/libsqlite3.so.0 (0xa6845000)
        libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0xa67e8000)
        libsystemd.so.0 => /lib/arm-linux-gnueabihf/libsystemd.so.0 (0xa6771000)
        libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xa675e000)
        librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0xa6748000)
        liblzma.so.5 => /lib/arm-linux-gnueabihf/liblzma.so.5 (0xa671e000)
        liblz4.so.1 => /usr/lib/arm-linux-gnueabihf/liblz4.so.1 (0xa66f9000)
        libgcrypt.so.20 => /lib/arm-linux-gnueabihf/libgcrypt.so.20 (0xa6645000)
        libgpg-error.so.0 => /lib/arm-linux-gnueabihf/libgpg-error.so.0 (0xa6621000)

上面是我已经修复了依赖的情况, 如果发现有not found, 直接从buildroot镜像中复制过去就行了. 复制到/usr/lib下面即可.

接下来直接跑起来, 报了个空指针的错误, 一看, 哦, 所得寺内, 原来是找不到xml文件, 这个isp比如配合ispp调制后的xml一起食用才行, 那还不简单, 直接继续从buildroot镜像中, 把这个xml复制到板子的/etc/iqfiles目录, 这个目录默认也是没有的, 直接mkdir创建一个.

然后就简单了, 先用ispserver &命令, 让ispserver在后台跑起来, 然后直接用v4l2-ctl截图即可:

v4l2-ctl -d /dev/video31 --set-fmt-video=width=1920,height=1080,pixelformat=NV12 --stream-mmap=3 --stream-skip=10 --stream-to=test.yuv --stream-count=1 --stream-poll 

因为这个video31是scale0, 是可以缩放的, 所以你想要啥大小都行, 格式我这里就用nv12, 但是支持的格式有:

 v4l2-ctl --list-formats-ext -d /dev/video31
 ...
        [0]: 'NV16' (Y/CbCr 4:2:2)
        [1]: 'NV12' (Y/CbCr 4:2:0)
        [2]: 'GREY' (8-bit Greyscale)
        [3]: 'YUYV' (YUYV 4:2:2)
        [4]: 'UYVY' (UYVY 4:2:2)

就它了, 因为到时候解码会容易点, 太偏僻的编码方式, 看不到图.

一切顺利, 就会看到产生一个test.yuv文件, 大小为192010803/2 = 3110400字节, 然后用yuvviewer打开即可:


拉流的话, 只需要把rkmedia的那套拉到板子上相信也不难了.

最后再说一下, 如果板子装了ubuntu/debian没法直接用adb, 就先装nfs-common, 然后mount 开发pc的nfs盘, 才方便传文件.
另外, 需要参考我之前的文章, 把ubuntu换成firefly的debian, 因为我发现ubuntu用着十分不得劲…

你可能感兴趣的:(debian,ubuntu,ai,人工智能)