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

来源:互联网 发布:php sql 防注入 编辑:程序博客网 时间:2024/05/20 11:49

获得图像前的初始化工作v4l_grab_init();该函数十分简单直接粘上去,其中将。vd->frame_using[0]vd->frame_using[1]都设为FALSE,表示两帧的截取都没有开始。

int v4l_grab_init(v4l_device *vd, int width, int height)  

{  

   vd->mmap.width = width;   

   vd->mmap.height = height;   

   vd->mmap.format = vd->picture.palette;   

   vd->frame_current = 0;  

   vd->frame_using[0] = FALSE;  

   vd->frame_using[1] = FALSE;  

  

   return v4l_grab_frame(vd, 0);  

}

       真正获得图像的函数extern int v4l_grab_frame(v4l_device *, int);

int v4l_grab_frame(v4l_device *vd, int frame)  

{  

   if (vd->frame_using[frame]) {  

      fprintf(stderr, "v4l_grab_frame: frame %d is already used./n", frame);  

      return -1;  

   }  

  

   vd->mmap.frame = frame;  

   if (ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) < 0) {  

      perror("v4l_grab_frame");  

      return -1;  

   }  

   vd->frame_using[frame] = TRUE;  

   vd->frame_current = frame;  

   return 0;  

}  

读到这里,应该觉得这个函数也是相当的简单。最关键的一步即为调用ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)),调用后相应的图像就已经获取完毕。其他的代码是为了完成双缓冲就是截取两帧图像用的,可以自己理解下。

       在截取图像后还要进行同步操作,就是调用extern int v4l_grab_sync(v4l_device *);函数,该函数如下

int v4l_grab_sync(v4l_device *vd)  

{  

   if (ioctl(vd->fd, VIDIOCSYNC, &(vd->frame_current)) < 0) {  

      perror("v4l_grab_sync");  

   }  

   vd->frame_using[vd->frame_current] = FALSE;  

   return 0;  

}  

该函数返回0说明你想要获取的图像帧已经获取完毕。

图像存在了哪里?

       最终我们使用v4l的目的是为了获取设备中的图像,那么图像存在哪里?从上面的文章可以知道,vd.map指针所指就是你要获得的第一帧图像。图像的位置,存在vd.map+vd.mbuf.offsets[vd.frame_current]处。其中vd.frame_current=0,即为第一帧的位置,vd.frame_current=1,为第二帧的位置。

原创粉丝点击