5.1. 参考示例

本章节将介绍基于hobot-sp-cdev多媒体库开发的多种功能示例,包括摄像头图像采集、视频编解码、视频显示、算法推理等功能。

5.1.1. 安装

首次使用功能示例时,需要在系统中安装hobot-sp-cdev多媒体库,命令如下:

sudo apt update
sudo apt install hobot-sp-cdev

头文件、库会安装在/usr/include/usr/lib目录下,示例程序会安装在/app/media_cdev/app/bpu_cdev目录下。文件列表如下:

sunrise@ubuntu:~$ ls /usr/include/sp_*                              
/usr/include/sp_bpu.h  /usr/include/sp_codec.h  /usr/include/sp_display.h  /usr/include/sp_sys.h  /usr/include/sp_vio.h

sunrise@ubuntu:~$ ls -l /usr/lib/libspcdev.so /usr/lib/libhb_dnn.so 
-rw-r--r-- 1 root root  10280 Oct 31  2022 /usr/lib/libhb_dnn.so
-rw-r--r-- 1 root root 212056 Oct 31  2022 /usr/lib/libspcdev.so

sunrise@ubuntu:/app$ tree bpu_cdev/ media_cdev/ -L 1
bpu_cdev/
├── go.sh
├── include
├── README.md
└── src
media_cdev/
├── decode2display
├── rtsp2display
├── vio2display
├── vio2encoder
└── vps

5.1.2. 摄像头图像采集和显示

本示例vio2display示例实现了MIPI摄像头图像采集功能,并通过HDMI接口输出,用户可通过显示器预览画面。示例流程框图如下:
image-vio_to_display

  • 环境准备:

    • 开发板断电状态下,将MIPI摄像头接入开发板,连接方法可参考MIPI摄像头连接教程

    • 通过HDMI线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/media_cdev/vio2display
    sunrise@ubuntu:/app/media_cdev/vio2display$ sudo make
    sunrise@ubuntu:/app/media_cdev/vio2display$ sudo ./vio2display
    
  • 预期效果: 程序正确运行后,开发板会通过显示器输出MIPI摄像头采集的实时画面。运行log如下:

    sunrise@ubuntu:/tmp/nfs/sp_cdev/media_cdev/vio2display$ sudo ./vio2display
    [sudo] password for sunrise: 
    disp_w=800, disp_h=480
    mipi_w:1920,mipi_h:1080;dst_w:800,dst_h:480;
    mipi_w:1920,mipi_h:1080;dst_w:1920,dst_h:1080;
    start linear mode, sensor_name f37, setting_size = 3
    sp_open_camera success!
    libiar: hb_disp_set_timing done![ 6156.771952] iar_output1_reqbufs.
    
    [ 6156.772663] iar_output_stream.
    
    Press 'q' to Exit !
    

5.1.3. 摄像头图像本地保存

本示例vio_capture示例实现了MIPI摄像头图像采集,并将RAWYUV两种格式的图像本地保存的功能。示例流程框图如下:
image-capture

  • 环境准备:

    • 开发板断电状态下,将MIPI摄像头接入开发板,连接方法可参考MIPI摄像头连接教程

    • 通过HDMI线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/media_cdev/vio_capture/
    sunrise@ubuntu:/app/media_cdev/vio_capture$ sudo make
    sunrise@ubuntu:/app/media_cdev/vio_capture$ sudo ./capture -b 12 -c 10 -h 1080 -w 1920
    

    参数说明:

    • -b: RAW图bit数,IMX477:12,others:10

    • -c: 保存图像的数量

    • -w: 保持图像的宽度

    • -h: 保存图像的高度

  • 预期效果: 程序正确运行后,当前目录保存指定数量的图片文件,RAW格式以raw_*.raw方式命名,YUV格式以yuv_*.yuv方式命名。运行log如下:

    sunrise@ubuntu:/app/media_cdev/vio_capture$ sudo ./capture -b 12 -c 10 -h 1080 -w 1920
    Setting VPS channel-2: src_w:1920, src_h:1080; dst_w:1920, dst_h:1080;
    Setting VPS channel-1: src_w:1920, src_h:1080; dst_w:1920, dst_h:1080;
    jiale:start streaming...
    capture time :0
    capture time :1
    capture time :2
    capture time :3
    capture time :4
    capture time :5
    capture time :6
    capture time :7
    capture time :8
    capture time :9
    sensor_name imx477, setting_size = 1
    [  701.213210]hb_isp_algo_stop@main_user.c:389 GENERIC(ERR) :g_mutex destroy.
    

5.1.4. 摄像头图像采集并编码

本示例vio2encoder示例实现了 MIPI 摄像头图像采集功能,并编码后在本地保存,用户可通过显示器预览画面。示例流程框图如下:
image-vio_to_encoder

  • 环境准备:

    • 开发板断电状态下,将MIPI摄像头接入开发板,连接方法可参考MIPI摄像头连接教程

    • 通过HDMI线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

  • 运行方式: 按照以下命令执行程序 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/media_cdev/vio2encoder
    sunrise@ubuntu:/app/media_cdev/vio2encoder$ sudo make
    sunrise@ubuntu:/app/media_cdev/vio2encoder$ sudo ./vio2encoder -w 1920 -h 1080 -o stream.h264
    

    参数说明:

    • -w: 编码视频宽度

    • -h: 编码视频高度

    • -o: 编码输出路径

  • 预期效果: 程序正确运行后,在当前目录下会生成名为stream.h264的视频文件。运行log如下:

    sunrise@ubuntu:/tmp/nfs/sp_cdev/media_cdev/vio2encoder$ sudo ./vio2encoder -w 1920 -h 1080 -o stream.h264
    Setting VPS channel-2: src_w:1920, src_h:1080; dst_w:1920, dst_h:1080;
    Setting VPS channel-1: src_w:1920, src_h:1080; dst_w:1920, dst_h:1080;
    start linear mode, sensor_name f37, setting_size = 3
    sp_open_camera success!
    sp_start_encode success!
    sp_module_bind(vio -> encoder) success!
    

5.1.5. 视频文件解码并显示

本示例decoder2display实现了视频文件解码,并通过HDMI接口输出的工,用户可通过显示器预览画面。示例流程框图如下:
image-decoder_to_display

  • 环境准备:

    • 通过HDMI线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

    • 准备视频编码文件stream.h264 作为输入。

  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/media_cdev/decode2display
    sunrise@ubuntu:/app/media_cdev/decode2display$ sudo make
    sunrise@ubuntu:/app/media_cdev/decode2display$ sudo ./decoder2display -w 1920 -h 1080 -i stream.h264
    

    参数说明:

    • -h: 视频文件的高度

    • -w: 视频文件的宽度

    • -i: 视频文件的路径

  • 预期效果: 程序正确运行后,视频画面会通过开发板的HDMI接口输出,用户可以通过显示器预览视频画面。运行log如下:

    sunrise@ubuntu:/app/media_cdev/decode2display$ sudo./decoder2display -w 1920 -h 1080 -i stream.h264
    disp_w=1024, disp_h=600
    [x3_av_open_stream]:[380]:probesize: 5000000
    sp_start_decode success!
    libiar: hb_disp_set_timing done!
    sp_start_display success!
    sp_open_vps success!
    

5.1.6. RTSP拉流解码

本示例rtsp2display实现了拉取rtsp码流、解码,并通过HDMI输出视频图像的功能,用户可通过显示器预览画面。示例流程框图如下:
rtsp2display

  • 环境准备:

    • 通过HDMI线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

    • 准备rtsp码流作为输入源

  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/media_cdev/rtsp2display
    sunrise@ubuntu:/app/media_cdev/rtsp2display$ sudo make #可能会打印一些警告信息,无需理会
    sunrise@ubuntu:/app/media_cdev/decode2display$ sudo ./rtsp2display -i rtsp://admin:admin123@10.96.32.170:554/0 -t tcp
    

    参数配置:

    • -i: 码流url地址

    • -t: 传输类型,可选tcp/udp

  • 预期效果: 程序正确运行后,视频画面会通过开发板的HDMI接口输出,用户可以通过显示器预览视频画面。运行log如下:

    sunrise@ubuntu:/app/media_cdev/rtsp2display$ sudo ./rtsp2display -i rtsp://admin:admin123@10.96.32.170:554/0 -t tcp
    avformat_open_input ok!
    avformat_find_stream_info ok!
    Input #0, rtsp, from 'rtsp://admin:admin123@10.96.32.170:554/0':
      Metadata:
        title           : h264.mp4
      Duration: N/A, start: 0.040000, bitrate: N/A
        Stream #0:0: Video: h264 (Main), yuvj420p(pc, bt709, progressive), 1920x1080, 25 tbr, 90k tbn, 180k tbc
        Stream #0:1: Audio: pcm_mulaw, 8000 Hz, 1 channels, s16, 64 kb/s
    Input #1, rtsp, from 'rtsp://admin:admin123@10.96.32.170:554/0':
      Metadata:
        title           : h264.mp4
      Duration: N/A, start: 0.040000, bitrate: N/A
        Stream #1:0: Video: h264 (Main), yuvj420p(pc, bt709, progressive), 1920x1080, 25 tbr, 90k tbn, 180k tbc
        Stream #1:1: Audio: pcm_mulaw, 8000 Hz, 1 channels, s16, 64 kb/s
    av_dump_format ok!
    rtsp_w:1920,rtsp_h:1080
    display_w:1024,dispaly_h:600
    libiar: hb_disp_set_timing done!
    sp_open_vps success!
    
  • 注意事项:

    • 使用UDP协议传输码流时,可能出现因网络丢包导致的花屏现象,此时可切换成TCP协议传输解决。

5.1.7. VPS缩放示例

本示例实现了基于视频处理模块VPS的视频缩放功能,用户可通过显示器预览画面。

  • 环境准备:

    • 通过HDMI线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

    • 准备图像(NV12)、视频文件(H264)作为输入

  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/media_cdev/vps
    sunrise@ubuntu:/app/media_cdev/vps$ sudo make
    sunrise@ubuntu:/app/media_cdev/decode2display$ sudo ./vps -m 1 -i stream.h264 -o output.yuv --iheight 1080 --iwidth 1920 --oheight 720 --owidth 1280
    

    参数配置:

    • -i: 待操作的文件路径

    • -iheight: 输入高度

    • -iwidth: 输入宽度

    • -m: 输入模式,1:视频流;2:NV12图片

    • -o: 输出路径

    • -oheight: 输出高度

    • -width: 输出宽度

    • -skip:(可选)对于视频流输入,调过开头的帧数

  • 预期效果: 程序正确运行后,当前目录会保存处理后的图像文件outpu.yuv。运行log如下:

    sunrise@ubuntu:/app/media_cdev/vps$ sudo ./vps -m 1 -i stream.h264 -o output.yuv --iheight 1080 --iwidth 1920 --oheight 720 --ow
    idth 1280
    [x3_av_open_stream]:[380]:probesize: 5000000
    hb_vp_deinit success
    

5.1.8. 目标检测算法—fcos

本示例基于fcos模型,实现了本地视频流的目标检测算法功能,用户可通过显示器预览检测结果。

  • 环境准备:

    • 通过HDMI线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

    • 准备视频文件(H264)作为输入

  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/bpu_cdev/src
    sunrise@ubuntu:/app/bpu_cdev/src$ sudo make
    sunrise@ubuntu:/app/bpu_cdev/src$ cd bin 
    sunrise@ubuntu:/app/bpu_cdev/src/bin$ sudo ./sample -f /app/model/basic/fcos_512x512_nv12.bin -m 1 -i 1080p_.h264 -w 1920 -h 1080
    

    参数配置:

    • -f: 模型文件路径

    • -h: 输入视频的高度

    • -w: 输入视频的宽度

    • -i: 输入视频的路径

    • -m: 模型类型,默认为1

  • 预期效果: 程序正确运行后,会通过HDMI接口输出视频和算法检测渲染后的画面,用户可通过显示器预览。运行log如下:

    sunrise@ubuntu:/app/bpu_cdev/src/bin$ sudo ./sample -f /app/model/basic/fcos_512x512_nv12.bin -m 1 -i 1080p_.h264 -w 1920 -h 1080
    [BPU_PLAT]BPU Platform Version(1.3.1)!
    [HBRT] set log level as 0. version = 3.14.5
    [DNN] Runtime version = 1.9.7_(3.14.5 HBRT)
    Model info:
    model_name: fcos_512x512_nv12Input count: 1input[0]: tensorLayout: 2 tensorType: 1 validShape:(1, 3, 512, 512, ), alignedShape:(1, 3, 512, 512, )
    Output count: 15Output[0]: tensorLayout: 0 tensorType: 13 validShape:(1, 64, 64, 80, ), alignedShape:(1, 64, 64, 80, )
    Output[1]: tensorLayout: 0 tensorType: 13 validShape:(1, 32, 32, 80, ), alignedShape:(1, 32, 32, 80, )
    Output[2]: tensorLayout: 0 tensorType: 13 validShape:(1, 16, 16, 80, ), alignedShape:(1, 16, 16, 80, )
    Output[3]: tensorLayout: 0 tensorType: 13 validShape:(1, 8, 8, 80, ), alignedShape:(1, 8, 8, 80, )
    Output[4]: tensorLayout: 0 tensorType: 13 validShape:(1, 4, 4, 80, ), alignedShape:(1, 4, 4, 80, )
    Output[5]: tensorLayout: 0 tensorType: 13 validShape:(1, 64, 64, 4, ), alignedShape:(1, 64, 64, 4, )
    Output[6]: tensorLayout: 0 tensorType: 13 validShape:(1, 32, 32, 4, ), alignedShape:(1, 32, 32, 4, )
    Output[7]: tensorLayout: 0 tensorType: 13 validShape:(1, 16, 16, 4, ), alignedShape:(1, 16, 16, 4, )
    Output[8]: tensorLayout: 0 tensorType: 13 validShape:(1, 8, 8, 4, ), alignedShape:(1, 8, 8, 4, )
    Output[9]: tensorLayout: 0 tensorType: 13 validShape:(1, 4, 4, 4, ), alignedShape:(1, 4, 4, 4, )
    Output[10]: tensorLayout: 0 tensorType: 13 validShape:(1, 64, 64, 1, ), alignedShape:(1, 64, 64, 1, )
    Output[11]: tensorLayout: 0 tensorType: 13 validShape:(1, 32, 32, 1, ), alignedShape:(1, 32, 32, 1, )
    Output[12]: tensorLayout: 0 tensorType: 13 validShape:(1, 16, 16, 1, ), alignedShape:(1, 16, 16, 1, )
    Output[13]: tensorLayout: 0 tensorType: 13 validShape:(1, 8, 8, 1, ), alignedShape:(1, 8, 8, 1, )
    Output[14]: tensorLayout: 0 tensorType: 13 validShape:(1, 4, 4, 1, ), alignedShape:(1, 4, 4, 1, )
    libiar: hb_disp_set_timing done!
    dispaly init ret = 0
    vps open ret = 0
    module bind vps & display ret = 0
    display start ret = 0
    [x3_av_open_stream]:[380]:probesize: 5000000
    decode start ret = 0
    module bind decoder & vps ret = 0
    [ERROR]["vdec"][video/src/vdec_group.c:348] [8870.450264]vdec_channel_bump_thread[348]: VDEC_MODULE module try again
    
    [draw_rect]:[137]:========point is 0,return========
    fps:55.555556,processing time:18
    

5.1.9. 目标检测算法—YOLOv5

本示例基于YOLOv5模型,实现了摄像头目标检测算法功能,用户可通过显示器预览检测结果。

  • 环境准备:

    • 开发板断电状态下,将MIPI摄像头接入开发板,连接方法可参考MIPI摄像头连接教程

    • 通过HDMI线缆连接开发板和显示器

    • 开发板上电,并通过命令行登录

  • 运行方式: 示例代码以源码形式提供,需要使用make命令进行编译后运行,步骤如下:

    sunrise@ubuntu:~$ cd /app/bpu_cdev/src
    sunrise@ubuntu:/app/bpu_cdev/src$ sudo make
    sunrise@ubuntu:/app/bpu_cdev/src$ cd bin 
    sunrise@ubuntu:/app/bpu_cdev/src/bin$ sudo ./sample -f /app/model/basic/yolov5_672x672_nv12.bin -m 0
    

    参数配置:

    • -f: 模型的路径

    • -m: 模型类型,默认为0

  • 预期效果: 程序正确运行后,会通过HDMI接口输出视频和算法检测渲染后的画面,用户可通过显示器预览。运行log如下:

    sunrise@ubuntu:/app/bpu_cdev/src/bin$ sudo ./sample -f /app/model/basic/yolov5_672x672_nv12.bin -m 0
    [BPU_PLAT]BPU Platform Version(1.3.1)!
    [HBRT] set log level as 0. version = 3.14.5
    [DNN] Runtime version = 1.9.7_(3.14.5 HBRT)
    Model info:
    model_name: yolov5_672x672_nv12Input count: 1input[0]: tensorLayout: 2 tensorType: 1 validShape:(1, 3, 672, 672, ), alignedShape:(1, 3, 672, 672, )
    Output count: 3Output[0]: tensorLayout: 0 tensorType: 13 validShape:(1, 84, 84, 255, ), alignedShape:(1, 84, 84, 255, )
    Output[1]: tensorLayout: 0 tensorType: 13 validShape:(1, 42, 42, 255, ), alignedShape:(1, 42, 42, 255, )
    Output[2]: tensorLayout: 0 tensorType: 13 validShape:(1, 21, 21, 255, ), alignedShape:(1, 21, 21, 255, )
    Setting VPS channel-1: src_w:1920, src_h:1080; dst_w:672, dst_h:672;
    Setting VPS channel-3: src_w:1920, src_h:1080; dst_w:1024, dst_h:600;
    Setting VPS channel-2: src_w:1920, src_h:1080; dst_w:1920, dst_h:1080;
    start linear mode, sensor_name f37, setting_size = 3
    libiar: hb_disp_set_timing done!
    yolov5_do_post fps:11.627907,processing time :86