当前位置:   article > 正文

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

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

前面已经说过使用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];每一帧图像的偏移量

};

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/263098
推荐阅读
相关标签
  

闽ICP备14008679号