Blog:
基于 NXP iMX6 多路摄像头连接测试

Saturday, February 16, 2019

简介

随着嵌入式处理器性能的提升,嵌入式设备在安全,机器视觉等方面的应用也越来越广发,本文就基于 NXP iMX6 Arm 处理器演示多种摄像头的连接应用,i.MX6 处理器支持多种摄像头接口连接,比如 Parallel Camera Interface,MIPI/CSI-2 串行摄像头接口,USB接口,网络接口等。

本文所演示的 Arm 平台来自于 Toradex 基于 NXP i.MX6Q Arm 处理器的 Apalis iMX6Q Arm 嵌入式平台。


准备

  1. Apalis iMX6Q Arm 核心版配合 Ixora 载板,连接调试串口 UART1(载板 X22)到开发主机方便调试,连接 HDMI 显示器用于摄像头输出显示。更多关于 Apalis iMX6 配合 Ixora 载板的说明请参考 Datasheet开发上手指南
  2. 本文测试所使用的摄像头如下:
    - Toradex OV5640 MIPI/CSI-2 摄像头模块,连接到载板 X28
    - 海康模拟摄像头,通过 Toradex ACA 模块连接到载板 X14
    - FHD USB 摄像头,连接到载板 X8 USB 接口
    - 海康萤石 CS-C3C-1FR 网络摄像头,通过网线连接到载板 X11 网口

  3. Apalis iMX6Q 安装 Toradex 最新 Linux BSP V2.8b5,系统中已经包含了本文测试所需要的 Gstreamer 相关组件,详细安装方法请参考这里
    - 关于 OV5640 摄像头 Linux下配置使用说明请参考这里,本文不再赘述。
    - 关于通过 ACA 模块连接模拟摄像头的配置使用说明请参考这里,本文不再赘述。


FHD USB 摄像头测试

  1. 先单独进行 FHD USB 摄像头模块测试,所使用的 Camera Sensor 为 Aptina MI5100 (注:已经被OnSemi收购,对应指标产品请到OnSemi网站搜索),连接到 Apalis iMX6 会自动配置UVC驱动,无需另行配置。

  2. 首先使用 V4L2命令查看摄像头支持的格式,如下所示,此摄像头可以支持 MJPG 格式和 RAW 格式输出,不过对于 800x600 以上的高分辨率输出,RAW 模式只能以非常低的帧率输出,因此对于本文测试的 1080P 输出就要使用 MJPG 格式输出了。

    root@apalis-imx6:~# v4l2-ctl --device=/dev/video3 --list-formats-ext
    ioctl: VIDIOC_ENUM_FMT
    Index : 0
    Type : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name : Motion-JPEG
    Size: Discrete 1600x1200
    Interval: Discrete 0.067s (15.000 fps)
    Size: Discrete 2592x1944
    Interval: Discrete 0.067s (15.000 fps)
    Size: Discrete 2048x1536
    Interval: Discrete 0.067s (15.000 fps)
    Size: Discrete 1920x1080
    Interval: Discrete 0.033s (30.000 fps)
    Size: Discrete 1280x1024
    Interval: Discrete 0.067s (15.000 fps)
    Size: Discrete 1280x720
    Interval: Discrete 0.033s (30.000 fps)
    Size: Discrete 1024x768
    Interval: Discrete 0.033s (30.000 fps)
    Size: Discrete 800x600
    Interval: Discrete 0.033s (30.000 fps)
    Size: Discrete 640x480
    Interval: Discrete 0.033s (30.000 fps)
    Size: Discrete 1600x1200
    Interval: Discrete 0.067s (15.000 fps)

    Index : 1
    Type : Video Capture
    Pixel Format: 'YUYV'
    Name : YUYV 4:2:2
    Size: Discrete 1600x1200
    Interval: Discrete 0.200s (5.000 fps)
    Size: Discrete 2592x1944
    Interval: Discrete 0.333s (3.000 fps)
    Size: Discrete 2048x1536
    Interval: Discrete 0.250s (4.000 fps)
    Size: Discrete 1920x1080
    Interval: Discrete 0.200s (5.000 fps)
    Size: Discrete 1280x1024
    Interval: Discrete 0.111s (9.000 fps)
    Size: Discrete 1280x720
    Interval: Discrete 0.200s (5.000 fps)
    Size: Discrete 1024x768
    Interval: Discrete 0.100s (10.000 fps)
    Size: Discrete 800x600
    Interval: Discrete 0.050s (20.000 fps)
    Size: Discrete 640x480
    Interval: Discrete 0.033s (30.000 fps)
    Size: Discrete 1600x1200
    Interval: Discrete 0.200s (5.000 fps)

  3. 测试基本的摄像头capture并全屏显示

    - RAW 格式
    $ gst-launch-1.0 imxv4l2src device=/dev/video3 ! 'video/x-raw, framerate=5/1, width=(int)1920, \
    height=(int)1080, format=(string)YUY2' ! imxv4l2sink


    CPU占用率:~40% x 1core of 4cores

    - MJPG 格式
    $ gst-launch-1.0 v4l2src device=/dev/video3 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! \
    vpudec output-format=4 ! imxipuvideotransform ! imxg2dvideosink sync=false


    CPU占用率:~50% x 1core of 4cores

    为了尽可能降低CPU的占用率,我们尽可能的使用iMX gstreamer专用的元件,可以调用VPU/GPU等硬件资源来加速,查询所有iMX相关原件可以通过下面命令
    $ gst-inspect-1.0 |grep imx

  4. 针对视频监控的场景往往需要在捕获的摄像头视频流上面打上时间戳,在播放的同时也保存成为文件,下面就测试这个应用场景。
    - 这里我们使用基于 imx 硬件加速的 imxg2dclockoverlay 元件来实现打时间戳
    - 打时间戳后单独进行摄像头视频流播放操作
    $ gst-launch-1.0 v4l2src device=/dev/video3 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! \
    vpudec output-format=4 ! imxipuvideotransform ! imxg2dclockoverlay time-format="%Y/%m/%d %H:%M:%S" ! \
    imxg2dvideosink sync=false


    CPU占用率:~49% x 1core of 4cores

    打时间戳后单独进行摄像头视频流保存成文件操作
    $ gst-launch-1.0 -vvv v4l2src device=/dev/video3 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! \
    vpudec output-format=4 ! imxipuvideotransform ! imxg2dclockoverlay time-format="%Y/%m/%d %H:%M:%S" !
    \
    imxipuvideotransform ! 'video/x-raw,width=1920,height=1080,framerate=30/1' ! imxvpuenc_h264 bitrate=8000 ! \
    filesink location=test.mp4


    CPU占用率:~30% x 1core of 4cores

    - 打时间戳后同时进行摄像头视频流保存成文件和播放操作
    $ gst-launch-1.0 -vvv v4l2src device=/dev/video3 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! \
    vpudec output-format=4 ! imxipuvideotransform ! imxg2dclockoverlay time-format="%Y/%m/%d %H:%M:%S" ! \
    tee name=splitter ! queue ! imxipuvideotransform ! 'video/x-raw,width=1920,height=1080,framerate=30/1' ! \
    imxvpuenc_h264 bitrate=8000 ! filesink location=test.mp4 splitter. ! queue ! imxg2dvideosink sync=false


    CPU占用率:~53% x 1core of 4cores

    - 录制下来的 test.mp4文件可以通过下面pipeline进行回放
    gst-launch-1.0 filesrc location=/home/root/test.mp4 typefind=true ! h264parse ! vpudec ! imxv4l2sink


海康网络摄像头测试

  1. 首先通过海康萤石管理软件配置摄像头网络配置为固定 IP - 10.20.1.99/255.255.255.0

  2. 然后将 Apalis iMX6 eth0 网络配置为固定 IP - 10.20.1.98/255.255.255.0,然后和摄像头确保能够ping通。

  3. 通过下面pipeline通过rtsp捕获摄像头适配流并播放,admin对应的password在每个摄像头标签上面有提供。
    $ gst-launch-1.0 rtspsrc location=rtsp://admin:password@10.20.1.99:554/h264/ch1/main/av_stream latency=10 ! \
    queue ! rtph264depay ! vpudec ! imxg2dvideosink


    CPU占用率:~18% x 1core of 4cores

    当然,也同样可以将捕获的视频流保存成本地文件,这里就不赘述了。


四路摄像头同时播放示例

  1. 基于上面两个章节的测试后,我们现在来进行四路摄像头同时播放显示测试,当然此时显示窗口就不能全屏了,而是要对应调整大小和位置。

  2. 首先测试在屏幕左上角显示Full HD USB摄像头输出
    $ gst-launch-1.0 v4l2src device=/dev/video3 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! \
    vpudec output-format=4 ! imxipuvideotransform ! imxg2dclockoverlay time-format="%Y-%m-%d %H:%M:%S" \
    halignment=2 valignment=1 ! imxg2dvideosink sync=false window-width=960 window-height=480


  3. 然后测试在屏幕左下角显示网络摄像头输出
    $ gst-launch-1.0 rtspsrc location=rtsp://admin:XIYFYO@10.20.1.99:554/h264/ch1/main/av_stream latency=10 ! \
    queue ! rtph264depay ! vpudec ! imxg2dvideosink window-width=960 window-height=480 window-y-coord=480


  4. 然后测试在屏幕右上角显示OV5640 MIPI/CSI-2摄像头输出
    $ gst-launch-1.0 imxv4l2src device=/dev/video2 ! capsfilter caps="video/x-raw, width=1920, height=1080, framerate=30/1" ! \
    imxipuvideotransform ! imxg2dclockoverlay time-format="%Y-%m-%d %H:%M:%S" halignment=2 valignment=1 ! \
    imxg2dvideosink sync=false window-width=960 window-height=480 window-x-coord=960


  5. 然后测试在屏幕右下角显示模拟摄像头输出
    $ gst-launch-1.0 -v imxv4l2videosrc ! imxipuvideotransform ! imxg2dclockoverlay time-format="%Y-%m-%d %H:%M:%S" \
    halignment=2 valignment=1 ! imxg2dvideosink window-width=960 window-height=480 window-x-coord=960 \
    window-y-coord=480
  6. 最后测试上面四路摄像头同时输出
    本文用如下测试脚本进行测试,当然也可以将上面 pipeline 都在一个 gst-launch 里面运行,不过可能需要适当增加 queue。
    https://github.com/simonqin09/Apalis_iMX6Q_Camera_Demo/blob/master/camera.sh

    CPU占用率:~50% x 3core of 4cores

    显示效果如下图,另外需要注意由于这个测试除了占用比较大的 CPU 资源,也大量使用了 VPU,GPU 等硬件资源,因此需要考虑对 Apalis iMX6 进行良好散热才能保证运行稳定。

总结

如上述示例,iMX6 处理器已经可以支持丰富的摄像头资源,为了保证工作高效和稳定,在可能的情况下,尽量采用 IMX 专用的 gstreamer 元件。

Author: 秦海,技术销售工程师,韬睿(上海)
Share this on:

Leave a comment

Please login to leave a comment!
Have a Question?