热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

移动物体监控系统(2)—摄像头子系统开发

一、摄像头驱动开发1.摄像头驱动架构视频监控本就是嵌入式Linux的重要应用场合,所以如何合理高效的管理摄像系统,便成为嵌入式Linux一大热点&#

一、摄像头驱动开发

1.摄像头驱动架构


  • 视频监控本就是嵌入式Linux的重要应用场合,所以如何合理高效的管理摄像系统,便成为嵌入式Linux一大热点!当前最流行的摄像头软件架构就是V4L2架构,从字面意思知道是专门为Linux设计的一个视频子系统的第二个版本。V4L2有一段历史了。早在1998的时候就出现了,经过长足的发展,它于2002年11 月,发布2.5.46 时,融入了内核主干之中。然而直到今天,仍有一部分内核驱动不支持新的API,这种新旧API 的转换工作仍在进行。它的主要功能是使程序具有发现设备和操作设备的能力.它主要是用一系列的回调函数来实现这些功能。像设置摄像头的频率、帧频、视频压缩格式和图像参数等等。当然也可以用于其他多媒体的开发,如音频等。但是该架构目前只能用于Linux操作系统上。整个V4L2的架构示意图如下:


  • 可以看出,整个架构主要分为四个部分:
    • 用户空间的应用程序:比如后面要用到的Motion以及ffmpeg等开源应用程序
    • V4L2核心组件(驱动核心):这是Linux内核专门用来管理视频子系统的核心组件,也正是由于这个组建的存在,才让我们可以在用户空间使用统一的一套编程接口API去控制底层的不同硬件。
    • 具体的V4L2驱动:这部分主要是针对不同的摄像头有不同的驱动程序,这写驱动程序相互独立,但是共同注册到V4L2子系统下,以便和用户空间应用程序进行通信。
    • 底层硬件:就是实际的摄像头等物理硬件。
  • V4L2核心是Linux系统自带的组件,它可以屏蔽摄像头驱动层的差异,不管底层的摄像头有什么差异,上层应用统一调用V4L2来实现对摄像头的操作,因此驱动程序和应用程序都需要遵循V4L2规范。

2.摄像头驱动使能


  • 由于本项目采用的是基于ZC3XX系列芯片的USB摄像头,所以需要在内核里面添加该USB摄像头驱动。以后如果换成别的摄像头,根据自己摄像头的驱动芯片加载合适的驱动模块到内核即可,毕竟现在Linux支持了市面上大部分的摄像头,一般能购买到的摄像头都有相应的驱动程序,只需要自己在内核使能即可!按照如下步骤可以使能USB摄像头。

2.1 进入配置菜单


  • 在内核源代码顶层目录执行 make menuconfig ARCH=arm命令。进入配置菜单。

2.2 依次选择如下配置选项:


  • Device Drivers  --->(毫无疑问,只要是添加驱动都是要进入这个选项)
  • Multimedia devices  --->(显然视频摄像头属于多媒体范畴)
    • [*]   Video capture adapters  --->(视频捕获也即是摄像头)
      •  [*]   V4L USB devices  --->(我们采用的是USB摄像头)
        •   <*>   GSPCA based webcams  --->&#xff08;万能摄像头驱动&#xff09;
          •  <*>   ZC3XX USB Camera Driver&#xff08;我们采用的具体USB摄像头对应的驱动程序&#xff09;

2.3 保存配置文件&#xff0c;退出配置模式&#xff0c;开始编译新内核


  • #make uImage ARCH&#61;arm CROSS_COMPILE&#61;arm-linux-
  • 拷贝uImage到/tftpboot/目录下

2.4 下载并启动linux内核


  • 往开发板上插入摄像头后&#xff0c;会弹出相应提示&#xff0c;同时使用ls /dev/可以查看是否有vedeo的驱动文件&#xff0c;如果有则说明驱动开发成功。

3. 摄像头驱动测试

3.1 初步测试


  • 插上USB摄像头看开发板串口控制台的提示&#xff0c;有如下信息输出:


  • 由上面的提示信息我们知道&#xff0c;驱动使能成功&#xff0c;再通过ls命令查看dev目录下的设备文件&#xff0c;即ls  /dev有&#xff1a;


  • 表明我们的USB摄像头在开发板的系统里创建的对应设备文件是/dev/video0&#xff0c;当然读者要根据自身实际情况判断对应的设备文件是什么&#xff0c;有可能是video3&#xff0c;video4等。

3.2 编写应用程序进行测试


  • 使用camera.c&#xff08;下接会讲如何编写&#xff09;文件交叉编译出在开发板运行的测试应用程序。在编译之前要记得修改文件里打开的设备文件&#xff0c;也就是前面说的/dev/video0&#xff0c;根据再记得设备文件修改open函数&#xff0c;如果传递给你open函数的参数不是你摄像头对应的实际设备文件&#xff0c;那么打开会有无法预知的结果&#xff0c;有可能失败&#xff0c;也可能打开某个文件导致抓取的图片是空的等情况。修改完毕以后使用如下命令进行编译&#xff1a;arm-linux-gcc -g camera.c -o  camera
  • 得到的camera就是可执行文件&#xff0c;将他复制到开发板的文件系统的根目录&#xff0c;并在开发板的串口控制台执行./camera命令&#xff0c;Mini2440有如下提示&#xff1a;


  • 同时在根目录生成test.jpg文件&#xff0c;通过windows的samba可以查看 其效果如下所示&#xff1a;

二、V4L2图像编程接口深度学习

1.相关介绍


  • Video for Linuxtwo(Video4Linux2)简称V4L2&#xff0c;是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口&#xff0c;配合适当的视频采集设备和相应的驱动程序&#xff0c;可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。
  • 在Linux下&#xff0c;所有外设都被看成一种特殊的文件&#xff0c;称为设备文件&#xff0c;可以象访问普通文件一样对其进行读写。一般来说&#xff0c;采用V4L2驱动的摄像头设备文件是/dev/video0。V4L2支持两种方式来采集图像&#xff1a;内存映射方式(mmap)和直接读取方式(read)。V4L2在include/ linux/videodev.h文件中定义了一些重要的数据结构&#xff0c;在采集图像的过程中&#xff0c;就是通过对这些数据的操作来获得最终的图像数据。Linux系统V4L2的能力可在Linux内核编译阶段配置&#xff0c;默认情况下都有此开发接口。
  • 摄像头所用的主要是capature了&#xff0c;视频的捕捉&#xff0c;具体linux的调用可以参考下图

}

我们可以得出如下的操作流程&#xff1a;


  • 1. 打开摄像头设备文件。
  • 2. 获取驱动信息-VIDIOC_QUERYCAP&#xff1b;在此之后可以获取更多的信息&#xff0c;不仅仅是本程序中后面的获取设置图像格式&#xff0c;我们还可以获取摄像头所支持的图像格式等信息。
  • 3. 设置图像格式-VIDIOC_S_FMT&#xff1b;
  • 4. 申请帧缓冲区-VIDIOC_REQBUFS&#xff1b;在Linux里面&#xff0c;必须要有帧缓冲区才可以进行图像的捕获&#xff0c;有了帧缓冲区以后&#xff0c;可以将帧缓冲区设置为输入队列&#xff0c;经过驱动程序以后&#xff0c;就将图像信息写到帧缓冲区&#xff0c;写入图像数据以后的帧缓冲区会加入输出队列&#xff0c;用户空间的应用程序最重要取出输出队列的帧缓冲区&#xff0c;然后读里面的内容&#xff0c;最后将被读取数据以后的帧缓冲区再次放回到输入队列&#xff0c;如此循环完成视频监控功能。但是要注意的是&#xff0c;这里申请的帧缓冲区是内核空间的&#xff0c;所以应用程序不能直接访问&#xff0c;需要通过映射等操作。而且输入队列和输出队列都是帧缓冲构成的。
  • 5. 获取帧缓冲的地址以及长度信息-VIDIOC_QUERYBUF&#xff1b;
  • 6. 使用mmap将内核空间的帧缓冲映射到用户空间&#xff1b;
  • 7. 帧缓冲入队列-VIDIOC_QBUF&#xff1b;
  • 8. 开始采集图像-VIDIOC_STREAMON&#xff1b;在此之后需要使用select函数等待输出缓冲有数据可读再进行下一步操作。
  • 9. 取出帧缓冲&#xff08;出队&#xff09;-VIDIOC_DQBUF&#xff1b;
  • 10. 访问帧缓冲读取数据-使用write等函数将数据写入到目标文件。
  • 11. 帧缓冲重新入队列-VIDIOC_QBUF&#xff1b;已经读取过数据的帧缓冲要放入输入队列。
  • 12. 关闭相关设备和文件进行以及解除映射等扫尾工作。

推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • WebDAV之葫芦儿·派盘+天悦日记
    天悦日记支持webdav方式连接葫芦儿派盘。是一款清爽简约的日记记录工具,通过天悦日记app随时随地快速写日记,更有智能数据统计分析报表,多端同步多种备份,本地备份和基于Web ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • 干货 | 携程AI推理性能的自动化优化实践
    作者简介携程度假AI研发团队致力于为携程旅游事业部提供丰富的AI技术产品,其中性能优化组为AI模型提供全方位的优化方案,提升推理性能降低成本࿰ ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • Kali Linux 简介
    KaliLinux是世界渗透测试行业公认的优秀的网络安全审计工具集合,它可以通过对设备的探测来审计其安全性,而且功能完备,几乎包含了目前所 ... [详细]
  • 网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linu ... [详细]
author-avatar
陨落星辰W_955
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有