video4linux(v4l)使用摄像头的实例基础教程与体会(二)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

前面已经说过使用v4l视频编程的流程和对文件操作并没有什么本质的不同,大概的流程如下:

       1.打开视频设备(通常是/dev/video0)

       2.获得设备信息。

       3.根据需要更改设备的相关设置。

       4.获得采集到的图像数据(在这里v4l提供了两种方式,直接通过打开的设备读取数据,使用mmap内存映射的方式获取数据)。

       5.对采集到的数据进行操作(如显示到屏幕,图像处理,存储成图片文件)。

       6.关闭视频设备。

知道了流程之后,我们就需要根据流程完成相应的函数。

 

那么我们首先完成第1步打开视频设备,需要完成int v4l_open(char *, v4l_device *);

具体的函数如下

#define DEFAULT_DEVICE “/dev/video0”

int v4l_open(char *dev , v4l_device *vd)

{

       if(!dev)dev= DEFAULT_DEVICE;

       if((vd-fd=open(dev,O_RDWR))<0){perror(“v4l_open:”);return -1;}

       if(v4l_get_capability(vd))return -1;

       if(v4l_get_picture(vd))return -1;//这两个函数就是即将要完成的获取设备信息的函数

       return 0

}

同样对于第6步也十分简单,就是int v4l_close(v4l_device *);的作用。

函数如下:

int v4l_close(v4l_device *vd)

{close(vd->fd);return 0;}

现在我们完成第2步中获得设备信息的任务,下面先给出函数在对函数作出相应的说明。

int v4l_get_capability(v4l_device *vd)

{  

   if (ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) < 0) {  

      perror("v4l_get_capability:");  

      return -1;  

   }  

   return 0;  

}

int v4l_get_picture(v4l_device *vd)  

{  

   if (ioctl(vd->fd, VIDIOCGPICT, &(vd->picture)) < 0) {  

      perror("v4l_get_picture:");  

      return -1;  

   }  

   return 0;  

}

对于以上两个函数我们不熟悉的地方可有vd->capabilityvd->picture两个结构体,和这两个函数中最主要的语句ioctl。对于ioctl的行为它是由驱动程序提供和定义的,在这里当然是由v4l所定义的,其中宏VIDIOCGCAPVIDIOCGPICT的分别表示获得视频设备的capabilitypicture。对于其他的宏功能定义可以在你的Linux系统中的/usr/include/linux/videodev.h中找到,这个头文件也包含了capabilitypicture的定义。例如:

struct video_capability

{

       char name[32];

       int type;

       int channels;   /* Num channels */

       int audios;      /* Num audio devices */

       int maxwidth; /* Supported width */

       int maxheight; /* And height */

       int minwidth; /* Supported width */

       int minheight; /* And height */

};capability结构它包括了视频设备的名称,频道数,音频设备数,支持的最大最小宽度和高度等信息。

struct video_picture

{

       __u16     brightness;

       __u16     hue;

       __u16     colour;

       __u16     contrast;

       __u16     whiteness;       /* Black and white only */

       __u16     depth;            /* Capture depth */

       __u16   palette;    /* Palette in use */

}picture结构包括了亮度,对比度,色深,调色板等等信息。头文件里还列出了palette相关的值,这里并没有给出。

       了解了以上也就了解了这两个简单函数的作用,现在我们已经获取到了相关视频设备的capabiltypicture属性。

这里直接给出另外一个函数

int v4l_get_mbuf(v4l_device *vd)  

{  

if (ioctl(vd->fd, VIDIOCGMBUG ,&(vd->mbuf)) < 0) {  

      perror("v4l_get_mbuf:");  

      return -1;  

   }  

   return 0;  

}

对于结构体video_mbufv4l中的定义如下,video_mbuf结构体是为了服务使用mmap内存映射来获取图像的方法而设置的结构体,通过这个结构体可以获得摄像头设备存储图像的内存大小。具体的定义如下,各变量的使用也会在下文详细说明。

struct video_mbuf

{

       int   size;        可映射的摄像头内存大小

       int   frames;    摄像头可同时存储的帧数

       int   offsets[VIDEO_MAX_FRAME];每一帧图像的偏移量

};

Linux下opencv通过V4L获取摄像头图像的底层源码icvRetrieveFrameCAM_V4L 以下是icvRetrieveFrameCAM_V4L(CvCaptureCAM_V4L* capture,int)的源码,在Opencv3.1.0源码中cap_v4l.cpp中第1438行,被cap_v4l.cpp中第1794行retrieveFrame(int)调用,retrieveFrame(int)被cap.cpp第100行cvRetrieveFrame( CvCapture* captur 阅读详情

相关推荐

v4l(video for Linux)使用摄像头实验的一点小感慨

v4l(video for Linux)使用摄像头实验的一点小感慨 前言     学习Linux快1个月了,Linux教学视频看完了,然后在虚拟机上装了个CentOS6.3把该做的实验大多也做了。突然就想玩玩刚买来的蓝魔USB摄像头(型号M2200),我给自己定了个计划,先写个摄像头驱动再写个应用层上面图像有关的随便什么程序。   正文     1,先是驱动,我在想USB摄像头的话US

8688

使用Linux的V4L2读取摄像头数据+Opencv图像处理

使用原始的RGB数据构造Opencv中的Mat对象。该资源使用Linux系统中的V4L2接口读取摄像头MJPEG图像数据,解码成RGB数据,再转换为Opencv中的Mat对象所使用的BGR格式

深入学习Linux摄像头)v4l2驱动框架

深入学习Linux摄像头系列 深入学习Linux摄像头(一)v4l2应用编程 深入学习Linux摄像头)v4l2驱动框架 深入学习Linux摄像头(三)虚拟摄像头驱动分析 深入学习Linux摄像头(五)三星平台fimc驱动详解一 深入学习Linux摄像头(六)三星平台fimc驱动详解 深入学习Linux摄像头)v4l2驱动框架 文章目录深入学习Linux摄像头)v4l2驱动框架一、V...

JT同学的博客 2万+

ROS中使用摄像头的问题

一、前言 在ROS下常用的主要有两种驱动包:usb_cam和uvc_cam 我这里用的是usb_cam包 第一次使用首先要安装这个包,安装完了之后就可以很方便的运行摄像头节点了 、安装usb_cam包 首次使用需要下载安装usb_cam包 这里参考博客:How to Use a Webcam in ROS with the usb_cam Package 两种方式安装: 1、可以

张京林要加油的技术专栏 1万+

Manual USB camera settings in Linux

Manual USB camera settings in Linux … How To on 2016-01-16 35 Comments There are many UVC compatible webcams most of them support full auto mode but only a few of these cameras provide extended manu...

newbeixue的博客 590

ROS下USB摄像头驱动包遇到的问题,求大神解答

@[T[ WARN] [1565837398.314950736]: Camera calibration file /home/liaopeichong/.ros/camera_info/head_camera.yaml not found. [ INFO] [1565837398.314976187]: Starting ‘head_camera’ (/dev/video1) at 640x4...

weixin_45133301的博客 5543

video4linux(v4l)使用摄像头实例基础教程体会

1. video4linux基础相关   1.1  v4l的介绍一些基础知识的介绍   I.首先说明一下video4linux(v4l)。         它是一些视频系统、视频软件、音频软件的基础,经常使用在需要采集图像的场合,如视频监控、webcam、可视电话,经常应用在embedded linux中,是linux嵌入式开发中经常使用的系统接口。

zhaohc_nj的专栏 2236

嵌入式linux摄像头使用,video4linux(v4l)使用摄像头实例基础教程体会()

1.video4linux基础相关1.1v4l的介绍一些基础知识的介绍I.首先说明一下video4linux(v4l)。它是一些视频系统,视频软件,音频软件的基础,经常使用在需要采集图像的场合,如视频监控,webcam,可视电话,经常应用在embeddedlinux中是linux嵌入式开发中经常使用的系统接口。它是linux内核提供给用户空间的编程接口,各种的视频和音频设备开发相应的驱动程序...

weixin_32252271的博客 811

Linux之多媒体应用接口v4l-utils及摄像头简单使用

链接: https://notes.z-dd.online/2024/06/06/Linux%E4%B9%8B%E5%A4%9A%E5%AA%92%E4%BD%93%E5%BA%94%E7%94%A8%E6%8E%A5%E5%8F%A3v4l-utils%E5%8F%8A%E6%91%84%E5%83%8F%E5%A4%B4%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8/v4l-utils 提供了一系列库和实用工具,用于控制各种多媒体设备。v4l-utils 组成。

DD'Notes 955

V4L的使用

Video4LinuxLinux下用于获取视频和音频数据的API接口,在这篇文章中,着重阐述如何利用Video4Linux获取摄像头数据,以实现连续影像的播放。  1. 摄像头的安装  在Linux下常用的摄像头驱动是spca5xx, 这是一个通用驱动,读者可以在以下网站下到这个驱动 http://mxhaard.free.fr/download.html。这个网站还给出了这款驱动支持的

嵌入精灵 1212

Linux L4V2框架学习

这是一篇偏小白的学习向的文章,不涉及太多程序细节的解释(主要是笔者也是在学习阶段,理解还没有这么深入)。主要目的是梳理大概的应用框架,实现摄像头采集出图像的功能。简单来说就是,驱动程序从摄像头采数据,并填充缓冲区,之后缓冲区就被应用程序读取和处理。这个过程不断循环往复。

weixin_52755312的博客 1310

如何利用Video4Linux获取摄像头数据

Video4LinuxLinux下用于获取视频和音频数据的API接口,在这篇文章中,着重阐述如何利用Video4Linux获取摄像头数据,以实现连续影像的播放。 1. 摄像头的安装 在Linux下常用的摄像头驱动是spca5xx, 这是一个通用驱动,读者可以在以下网站下到这个驱动 http://mxhaard.free.fr/download.html。 这个网站还给出了这款驱动支持的摄

SEU_EXtreme! 2056

V4L接口

v4l(VideoforLinux标准)v4l是linux中提供的一个音视频接口规范,所有的音视频设备的驱动编写要用的这些接口Video4Linux其中用到的数据结构有: 2 -28,I was sitting just by them.nothing romantic.what on hell happened? ◆ video_capability 包含摄像

bloghome的专栏 1796

video4linux

利用Video4Linux获取摄像头数据 Video4LinuxLinux下用于获取视频和音频数据的API接口,在这篇文章中,我着重阐述如何利用Video4Linux获取摄像头数据,以实现连续影像的播放。 1. 摄像头的安装在Linux下常用的摄像头驱动是spca5xx, 这是一个通用驱动,读者可以在以下网站下到这个驱动 http://mxhaard.free.fr/download.html。

小三的学习园地 1565
上一篇: video4linux(v4l)使用摄像头的实例基础教程与体会
下一篇: video4linux(v4l)使用摄像头的实例基础教程与体会(三)
shang_125
博客等级 码龄20年 4粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值