历史上的今天
返回首页

历史上的今天

今天是:2024年10月10日(星期四)

正在发生

2020年10月10日 | 怎样在嵌入式Linux系统中使用摄像头

2020-10-10 来源:elecfans

  简介

  本文主要基于ARM嵌入式模块系统展示在嵌入式Linux中使用摄像头示例,所采用的模块为Toradex VF61,是一款性价比极高但不包含硬件视频编解码加速的模块,核心处理器为NXP/Freescale Vybrid,Cortex-A5和M4异构双核架构。


  1)。 目前越来越多的嵌入式系统采用摄像头应用,其中主要有下面几种方式

  远程监控:如闭路电视系统,操作人员通过摄像头远程监控某个特定区域,小到一个小区,达到市政公共场所,都可能有这样的应用。


  监控视频录制:另外一些监控系统不一定有操作人员一直监控,则会通过录制监控视频的方式在需要的时候调出相关视频进行查阅。


  嵌入式视觉系统:嵌入式视觉系统会对视频图片进行处理并提取更多复杂信息,如雷达和城市智能交通应用。


  视频传感器:如临床诊断设备会对采集的视频图像进行分析来诊断,智能购物设备通过采集视频图像分析使用者特征来定向推广销售等等。


  2)。 环境配置

  。/ ARM嵌入式模块系统:Toradex VF61 以及 Colibri Eva board,详细的配置使用手册请见这里

  。/ 摄像头

  Logitech HD 720p USB摄像头

  D-Link DCS-930L IP 摄像头

  。/ 软件:

  Toradex 标准Embedded Linux发布版本V2.4(已预装),详细介绍请见这里

  GStreamer框架,广泛应用于各种多媒体应用开发,可以实现如视频编辑,媒体流以及媒体播放等多媒体应用,同时配合各种插件(包含输入输出单元,过滤器,编解码器等),GStreamer可以支持多种不同媒体库如MP3,FFmpeg等。所需安装包如下:

  $ opkg update

  $ opkg install gst-plugins-base-meta gst-plugins-good-meta gst-ffmpeg

  查看目前已经安装的插件和单元

  $ gst-inspect

  GStreamer元件(element)和管道(Pipeline)简介

  根据《GStreamer ApplicaTIon Development Manual》章节3所述,元件是GStreamer最重要的对象类,它可以被读取,解码以及显示。管道为多个元件互联一起形成的元件链,可以用于一些特定的任务,如视频播放或捕捉。默认情况下GStreamer 包含大量的元件集以便于开发各种各样的多媒体应用。本文中我们会使用一些管道去展示一些元件的使用。


  下图是一个基本的用于Ogg播放的管道示例,使用一个分流器和两个分支,一个处理音频,另一个处理视频。可以看到一些元件只有src 衬垫 (pad),另一些只有sink衬垫或者两者都有。

  

  在连接一个管道前,我们同样需要通过 “gst-inspect” 命令查看所需的插件是否兼容,如下示例查看ffmpegcolorspace 插件。

  $ gst-inspect ffmpegcolorspace

  基本信息描述

  -----------------------------------------------------------

  Factory Details:

  Long name: FFMPEG Colorspace converter

  Class: Filter/Converter/Video

  DescripTIon: Converts video from one colorspace to another

  Author(s): GStreamer maintainers gstreamer-devel@lists.sourceforge.net

  -----------------------------------------------------------

  Src 和 sink 功能描述

  -----------------------------------------------------------

  SRC template: ‘src’

  Availability: Always

  CapabiliTIes:

  video/x-raw-yuv

  video/x-raw-rgb

  video/x-raw-gray

  SINK template: ‘sink’

  Availability: Always

  CapabiliTIes:

  video/x-raw-yuv

  video/x-raw-rgb

  video/x-raw-gray

  -----------------------------------------------------------

  另如v4l2src元件,它只含有src衬垫功能,所以可以source一个视频流到另一个元件;再有ximagesink元件,它含有rgb格式sink衬垫功能。关于这部分更多详细介绍请关注这里。

  显示一个视频测试图案

  使用下面管道来显示一个视频测试图案

  $ gst-launch videotestsrc ! autovideosink

  

  其中autovideosink元件自动检测视频输出,videotestsrc元件可利用“pattern”属性生成多种格式的测试视频,如下面为雪花图案测试视频

  $ gst-launch videotestsrc pattern=snow ! autovideosink

  

  USB 摄像头

  1)。 从USB摄像头显示视频

  摄像头接入系统后,会在/dev目录下面显示对应的设备videox,x可以是0,1,2等等,取决于接入的摄像头数量。

  请使用下面管道来全屏显示对应的摄像头视频

  $ gst-launch v4l2src device=/dev/videox ! ffmpegcolorspace ! ximagesink

  

  // Video4Linux2插件是一个用于捕捉和播放视频的API和驱动框架,它支持多种USB摄像头以及其他设备;元件v4l2src属于 Video4Linux2插件,用于读取Video4Linux2设备的视频帧,这里即为USB摄像头。Ffmpegcolorspace元件是一个用于转换多种颜色格式的过滤器,摄像头设备视频数据通常使用YUV颜色格式,而显示器通常使用RGB颜色格式。Ximagesink元件是一个X桌面标准的 videosink元件。

  在当前情况下,我们可以通过“top”命令看到目前CPU占有率为77.9%

  另外,也可以通过设置一些参数来设定显示效果如尺寸,帧率等,如下面示例限定显示尺寸为320x240,此时CPU占有率下降为28.2%

  $ gst-launch v4l2src device=/dev/videox ! ‘video/x-raw-yuv,width=320,height=240,framerate=30/1’ ! ffmpegcolorspace ! ximagesink

  2)。 同时显示两路USB摄像头

  使用下面通道来同时显示两路摄像头,这里我们使用Logitech HD 720P摄像头和另外一种普通的MJPEG摄像头,在这种情况下CPU占用率为64.8%。

  $ gst-launch v4l2src device=/dev/videox ! ‘video/x-raw-yuv,width=320,height=240,framerate=30/1’ ! ffmpegcolorspace ! ximagesink v4l2src device=/dev/video1 ‘video/x-raw-yuv,width=320,height=240,framerate=30/1’ ! ffmpegcolorspace ! ximagesink

  

  3)。 录制USB摄像头视频

  使用下面管道来录制MP4格式摄像头视频

  $ gst-launch --eos-on-shutdown v4l2src device=/dev/videox ! ffenc_mjpeg ! ffmux_mp4 ! filesink location=video.mp4

  //--eos- on-shutdown参数用于正确关闭文件。ffenc_mjpeg元件是MJPEG格式编码器。ffmux_mp4是MP4格式合成器。 filesink元件声明来自v4l2的源数据会被存储为文件而不是显示于ximagesink元件,另外也可以任意指定文件存储位置。

  在这种情况下录制摄像头视频CPU占有率8%左右。

  4)。 视频播放

  使用下面管道来播放上面录制的视频

  $ gst-launch filesrc location=video.mp4 ! qtdemux name=demux demux.video_00 ! queue ! ffdec_mjpeg ! ffmpegcolorspace ! ximagesink

  //filesrc元件声明视频源数据来自于一个文件而不是视频设备如摄像头。ffdec_mjpeg元件为MJPEG格式解码器。

  在这种情况下,由于所录制视频为摄像头最高分辨率,因此CPU占有率为95%左右。

  5)。 通过HTTP播放视频

  使用下面管道播放特定URL视频

  $ gst-launch souphttpsrc location=http://upload.wikimedia.org/wikipedia/commons/4/4b/MS_Diana_genom_Bergs_slussar_16_maj_2014.webm ! matroskademux name=demux demux.video_00 ! queue ! ffdec_vp8 ! ffmpegcolorspace ! ximagesink

  // souphttpsrc元件用于通过HTTP接收网络数据。和播放本地视频不同,一个存放视频文件的网络地址制定给了location参数。ffdec_vp8元件是webm格式解码器。

  在这种情况下,CPU占用率为40%左右。

  6)。 通过TCP串流摄像头视频

  这里配置串流VF61摄像头视频到另外一台运行Ubuntu Linux主机

  VF61 IP = 192.168.0.8

  Ubuntu IP = 192.168.0.7

  在VF61上面运行下面管道

  $ gst-launch v4l2src device=/dev/video1 ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! ffenc_mjpeg ! tcpserversink host=192.168.0.7 port=5000

  然后在Ubuntu上面运行下面管道来查看视频流

  $ gst-launch tcpclientsrc host=192.168.0.8 port=5000 ! jpegdec ! autovideosink

  这里使用Logitech HD 720P摄像头,CPU占有率为65%左右。

  在VF61上面使用D-Link IP 摄像头

  1)。 显示摄像头视频

  这里使用D-Link DSC-930L 摄像头,并设置视频流为average quality JPEG格式,320x240分辨率,帧率为15/1‘,IP = 192.168.0.200

  使用下面管道来显示摄像头视频

  $ gst-launch -v souphttpsrc location=’http://192.168.0.200/video.cgi‘ is-live=true ! multipartdemux ! decodebin2 ! ffmpegcolorspace ! ximagesink

  

  2)。 视频录制

  使用下面管道来录制视频

  $ gst-launch --eos-on-shutdown –v souphttpsrc location=’http://192.168.0.200/video.cgi‘ is-live=true ! multipartdemux ! decodebin2 ! ffmpegcolorspace ! ffenc_mjpeg ! ffmux_mp4 ! filesink location=stream.mp4

  在这种情况下,CPU占有率为40% 左右。

  3)。 通过TCP串流视频到另一个IP地址

  这里配置串流IP摄像头视频到VF61,然后再到另外一台运行Ubuntu Linux主机

  Ubuntu IP = 192.168.0.12

  在VF61上面运行下面管道

  $ gst-launch --eos-on-shutdown –v souphttpsrc location=’http://192.168.0.200/video.cgi‘ is-live=true ! multipartdemux ! decodebin2 ! ffmpegcolorspace ! ffenc_mjpeg ! Tcpserversink host=192.168.0.12 port 5000

  然后在Ubuntu上面运行下面管道来查看视频流

  $ gst-launch tcpclientsrc host=192.168.0.8 port=5000 ! jpegdec ! autovideosink

  在这种情况下,VF61 CPU占用率为95% 左右。

  总结

  本文着重展示了通过GStreamer 元件,管道在Embedded Linux设备上面应用USB或IP摄像头,相关的更多管理使用示例还可以从网络上面找到很多,可以结合本文一起来充分理解相关应用。

  本文所做示例下VF61 CPU和MEM占用率比较请见下图,可见NXP/Freescale Vybrid VF61 处理器尽管没有独立的硬件视频处理单元也基本上可以胜任基本的摄像头视频应用,结合其非常有竞争力的成本,使其成为性价比非常高的产品。但是如果对视频处理有更高的要求如嵌入式视觉系统,则建议考虑处理能力更强劲并含有独立GPU的基于NXP/Freescale i.MX6处理器的产品,如Toradex Colibri/Apalis i.MX6 模块。

  

推荐阅读

史海拾趣

Compostar Technology Co Ltd公司的发展小趣事

随着产品线的不断丰富,Compostar Technology Co Ltd开始积极寻求市场拓展。公司通过与国内外知名电子品牌建立战略合作关系,成功将产品打入国际市场。同时,公司还积极参加各类行业展会和技术交流会,与业界同行建立了广泛的联系。这些努力不仅为公司带来了更多的商机,也进一步提升了公司的知名度和影响力。

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

进入1950年代,随着联邦政府对卡车运输的规范,Günter Bals意识到单一的运输业务已无法满足公司长远发展的需要。于是,他与妻子伊丽莎白共同创立了Bals Elektrotechnik GmbH,开始涉足电气连接器的生产。这一转型对Bals来说既是挑战也是机遇,他们凭借对市场的敏锐洞察和不懈的技术研发,成功推出了第一批铝制连接器,并逐步打开了市场。

ELNA(依娜)公司的发展小趣事

ELNA公司的故事始于1940年代,当时该公司推出了其第一台缝纫机。这款缝纫机以其精湛的工艺和卓越的性能迅速在市场上崭露头角。ELNA凭借对品质的坚持和对技术的不断创新,逐渐在缝纫机行业树立了良好的口碑。

随着业务的扩展,ELNA开始涉足电子领域,并逐步将其在机械制造和精密加工方面的技术优势应用到电子产品中。这一转变为公司未来的发展奠定了坚实的基础。

Catalyst / ON Semiconductor公司的发展小趣事

随着技术的不断进步,Catalyst / ON Semiconductor公司逐渐在半导体领域取得了重要的技术突破。公司投入大量资源进行研发,成功开发出了一系列高性能、低功耗的半导体产品,这些产品在市场上受到了广泛的欢迎。这些技术突破不仅提升了公司的市场竞争力,也为整个电子行业的发展注入了新的活力。

Belkin公司的发展小趣事

随着电子行业的快速发展,贝尔金也紧跟时代步伐,不断进行技术革新和产品线拓展。2002年,贝尔金为苹果Dock连接器研发了一系列产品,包括汽车套件、电池组、读卡器等,这标志着它与苹果公司的深度合作开始。此后,贝尔金逐渐成为苹果官方合作配件制造商,其产品在苹果用户中享有很高的声誉。

Eastman Kodak Company公司的发展小趣事

2012年1月,伊士曼柯达公司宣布申请破产保护。这一消息震惊了全球,也让人们不禁对这家百年老店的前景感到担忧。然而,在破产保护期间,柯达并没有放弃努力。公司积极寻求重组方案,通过出售非核心资产、削减成本等方式,逐步恢复了盈利能力。最终,在2013年5月,柯达成功退出了破产保护程序,开始了新的发展历程。

问答坊 | AI 解惑

DSP和FPGA在汽车电子中的广泛应用

1 引言   20世纪末,全球范围内兴起的信息革命浪潮,为汽车工业的突破性发展提供了千载难逢的机遇,信息技术的广泛应用是解决汽车带来的诸如交通拥挤、交通安全、环境污染、能源枯竭等问题的最佳途径。同时,随着汽车电子技术的发展,电子组件 ...…

查看全部问答>

12864液晶屏(急需)

我现在特别需要“12864液晶屏”的详细资料的,知道的发给我增长一些与其相关的知识,谢谢。…

查看全部问答>

有人选C题吗,来点靠谱的方案吧

本帖最后由 paulhyde 于 2014-9-15 08:59 编辑 RT 说说也行  …

查看全部问答>

44B0和UDA1341

小弟是初学44B0想学学44B0和UDA1341,那位大哥有他们的原理图和代码,发我一份好吗??谢谢了!!邮箱624195206@qq.com   谢谢!!!…

查看全部问答>

非常奇怪的WINCE启动后现象

终于系统和BIOS都跑起来了!其他都正常,但是WINCE启动后,桌面右键点击后或出现右键的弹出菜单“刷新、新建等”,当出现这个菜单后不对系统做任何动作,大约30S后,发现菜单的焦点会不断从上滚动到下,速度很快,感觉好像使用了键盘下键,几秒钟 ...…

查看全部问答>

锂电池充电的问题 ADC_DATA

各位大侠,帮忙看一下,为什么我的ADC_DATA里面没有数据啊?而且有的时候串口都不发送数据了啊 #include void main() {     //单片机系统初始化     C_F=0;//放电控制     ON=0;//充电电流控制 Iset ...…

查看全部问答>

sim300联网问题

我做了块SIM300的GPRS的模块,遇到下述问题:     连接UDP可以正常连接,而且也能正确收发数据。但是TCP链接不上,用PC机的串口操作如下所示:     UDP操作       1. AT       2. ...…

查看全部问答>

关于IIC通信的问题,大牛来指点一下!

目前我用430的硬件IIC通信,采用主发送、从接收方式,就是一个单片机先采用主机方式发送数据,完后处于从接收模式;另一个单片机也如此,不知道这个方法有没有什么问题? 目前遇到的问题是:主发送一次后变为从方式,从接收后变为主方式返回数据, ...…

查看全部问答>

关于宏定义的问题。

实例代码如下: #define TestDefine  Test1 #ifdef TestDefine == Test2    for(i = 0; i < 10; i++)   {     ...   } #else   for(i = 0; i < 10; i++)  &nb ...…

查看全部问答>