视频处理是人工智能应用中的一个重要方向,对于一款端上部署的AI加速产品,其视频接入能力是产品技术实力的重要体现,同时也直接影响用户的产品体验。端上的嵌入式设备,受制于自己的CPU等硬件资源,同时支持多种视频设备及多种视频格式是极大的挑战。web
EdgeBoard是百度基于FPGA打造的嵌入式AI解决方案,可以提供强大的算力,并支持定制化模型,适配各类不一样的场景,并大幅提升设备的AI推理能力,具备高性能、高通用、易集成等特色。EdgeBoard做为一款面向各个层次的AI开发者的硬件平台,兼顾了多种视频输入,包括MIPI、BT1120、USB摄像头、IPC(IP Camera,网络摄像头)、GigE工业摄像头,这极大地体现出EdgeBoard在视频处理上出色的技术实力,而同时支持如此多的视频接入设备在通常的AI端产品上也是不常见的。网络
本文将详细介绍EdgeBoard上的视频处理方案,如何兼顾效率和通用性,在两者之间取得平衡,最大程度上知足用户的需求。架构
Linux V4L2结构框架
内核V4L2模块ide
Linux系统发展至今,以其优越的跨平台特性和扩展移植性在嵌入式操做系统领域占据很大的份额,EdgeBoard采用的是Xilinx PetaLinux工具打造的Linux内核,操做系统采用的是RootFS,若是用户须要Ubuntu操做系统,能够直接在Xilinx论坛上得到arm64 Ubuntu操做系统。svg
Video4Linux2(简称V4L2)是Linux下关于视频采集相关设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。支持三类设备,分别会在/dev目录下产生不一样的设备节点:模块化
V4L2在Linux系统中的结构图以下:工具
从图中能够看出,驱动的框架井井有条,最上层经过字符设备提供video和media两种控制接口,分别从视频流控制(video)和媒体子设备控制(media)两种不一样的角度抽象出操做接口。中间内核驱动层经过三层设备驱动分别从视频抽象,V4L2设备功能定义,子设备功能定义三个层面展开,模块化的设计提供了很是完善的扩展性。最下方是硬件层,除了提供经常使用摄像头传感器的功能外,对于经常使用的视频转换也有很好的支持。性能
在应用层的软件支持也很是丰富,好比普遍使用的FFmpeg、Gstreamer、LiVes、MPlayer等对本地视频设备的支持也都是经过V4L2提供的接口实现的。测试
Xilinx V4L2驱动结构
深刻理解V4L2框架对于FPGA视频方案的灵活配置有很大的帮助做用,也方便FPGA开发人员快速验证视频功能。本节以Xilinx视频处理子系统为例,介绍一套完整的V4L2内核功能的实现,以下图。
结合上一节提到的V4L2结构图能够看出V4 L2内核对应了所有视频框架的内容。中间部分,xilinx经过xvip_dma结构实现了总体的video_device功能,给用户层提供必要的控制设备接口(右侧用户层接口);左侧部分,是内核将全部的xilinx视频相关设备组合成xvip_composite_device,即v4l2_device,经过该模块能够扩展具体的子设备功能,即v4l2_subdev,包括TPG、VTC、RGB2YUV、scaler等等;右侧部分,是用户层的接口,用户层调用接口实现对视频设备的操做;顶层部分,为了提升数据搬运的效率使用了DMA设备功能,即xilinx_dma_device。下层部分,对于内部数据的管理,使用了v4l2统一抽象提供的vb2_queue、vb2_buffer等模块实现。
V4L2结构应用实例解析
这里以在EdgeBoard上使用的MIPI摄像头(MIPI开发介绍见https://www.csdn.net/article/a/2019-08-21/15979781)为例介绍V4L2的具体应用。
MIPI摄像头视频通路
对MIPI摄像头的支持采用了xilinx video框架,符合标准的驱动以及和硬件结合的流程。具体的实现为:硬件上采用FPGA的IP实现视频通路上的各类视频预处理,内核驱动模块使用vipp对应的功能,应用层经过/dev/media节点将这些子设备之间的链接关系进行关联,经过/dev/video控制视频的传输及视频抓取。
V4L2子设备驱动(摄像头驱动)的编写方法
从上文能够看出,虽然利用已有的IP和驱动资源,能够快速搭建MIPI摄像头的数据接入功能,但还缺乏对于摄像头自己的参数控制功能等,这部分功能的实现是在驱动模块完成。本节将介绍一下此类驱动的结构和开发流程。
相对于实现一个完整的V4L2驱动功能比较庞大,针对摄像头驱动的实现相对简单了许多,只须要实现V4L2的子设备驱动便可,由于大部分功能已经在video_device里实现了。详细的子设备驱动结构图以下
结合前文的总体结构图,这里的核心是实现一个v4l2_subdev结构,即填充其内部各操做接口结构体,其中核心是v4l2_subdev_ops,经过该接口实现从用户层对其配置各类参数,以对视频流的控制。media_entity目地是实现各个v4l2_subdev之间的链接通路。用户层对mediaX设备的操做都须要这个结构的支持。
基于V4L2的软件开发
应用层的软件开发,推荐使用gstreamer或者opencv videocapture,opencv的底层实现可能依赖gstreamer,若是这些不能知足读者的要求,须要更详细的参数控制,或者软件环境不具有这两种支持,能够考虑直接操做v4l2设备。以下将介绍V4L2 软件层面的具体方法。
V4L2一般支持三种不一样IO访问方式(其余内核里支持的方式暂不讨论),包括
用户层工具介绍(技术小福利)
上文介绍完EdgeBoard中视频处理的完整方案,现介绍V4L2开发中经常使用的调试工具,有助于提高开发效率。
得益于Linux丰富的开源资源,操做v4l2设备的应用层工具也很是多。默认的EdgeBoard PetaLinux系统已经配置好经常使用的几个工具,特此介绍给你们。v4l-utils是专门控制v4l设备的一系列命令工具集,包含如下实用程序:
gstreamer是Linux平台普遍应用的视频流工具,特别是嵌入式平台,良好的软件架构及衍生出其丰富的扩展插件对不一样硬件平台都具备良好的支持。
这里给出一个命令行示例,就能够了解它的独特之处了,以下:
gst-launch-1.0 v4l2src device=/dev/video4 ! video/x-raw,width=1280,height=720 ! videorate ! image/jpeg,framerate=1/4 ! multifilesink location="frame%d.jpg" index=100
这条命令的意思是打开v4l2视频源即/dev/video4这个USB视频设备,抓取其1280x720宽度的原始jpeg图片流按照4秒1帧的速度保存到本地文件,命名格式为frame100.jpg开始
总结
本文以MIPI摄像头为例介绍了在EdgeBoard中采用V4L2结构的视频处理方案,得益于V4L2结构的灵活性和可扩展性,像BT1120、USB摄像头等也采用相似的方案,实现了对多视频接入方案的支持。对于须要视频接入方案的用户,直接点击购买EgdeBoard产品 ,实现视频接入的即插即用。据小编观察,此款正在打折中,历史最低价,降价1000元,有须要的抓紧购买哦!