2013-02-22 97 views
6

如何使用C++,并将其保存到磁盘捕获与我的摄像头的图像?由于硬件问题,我无法使用OPENCV。 该USB摄像头确实与其他程序,如mplayer,奶酪,gpicview,ffmpeg等工作的USB摄像头图像采集,恕不的OpenCV(LINUX)

我听说V4L能够做到这一点,但它有任何C++库吗? 任何人都可以告诉我一个关于如何做到这一点的C++示例?

+0

欢迎堆栈溢出! StackOverflow不是这个问题的适当位置。我们不会为您编写代码。你需要做自己的编码,如果你不确定为什么某些东西不能按预期工作,请在代码中加上一个解释你期望它做什么,以及它实际上在做什么,包括所有的错误信息。参见[关于StackOverflow](http://stackoverflow.com/about)。 – 2013-02-22 20:19:54

回答

18

这是很容易的,你可以在videodevice做read,您已经激活了一些读写控制后,让你的控制之下的凸轮。

你可以用用v412这项工作。您在这些步骤做:

  1. 打开相机的设备文件(通常“的/ dev/video0的”)
  2. 告诉用v412要知道设备的一些功能
  3. 告诉V4L2阅读从设备
  4. 告诉用v412至极格式要使用

下面是我用这个作业的执行情况。它会将相机设置为以320x240像素捕捉视频,但您可以读取分辨率,相机可以从v4l2_capability结构中获得。

而且我没有测试过不同的相机比我的PS2 EyeToy的代码,但它主要是从名为qv4l2(你可以从here得到它)的一个样本程序作出。该计划应解决您通常在那里看到的所有其他问题。

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h>    /* low-level i/o */ 
#include <errno.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <sys/time.h> 
#include <sys/ioctl.h> 

#include <linux/videodev2.h> 

static int xioctl(int fh, int request, void *arg) 
{ 
    int r; 
    do { 
     r = ioctl(fh, request, arg); 
    } while (-1 == r && EINTR == errno); 
    return r; 
} 

int allocCamera(const char* file) 
{ 
    struct v4l2_capability cap; 
    struct v4l2_crop crop; 
    struct v4l2_format fmt; 

    int camera_fd = open(file, O_RDONLY); 

    if (-1 == xioctl (camera_fd, VIDIOC_QUERYCAP, &cap)) { 
     if (EINVAL == errno) { 
      fprintf (stderr, "%s is no V4L2 device\n", file); 
      exit (EXIT_FAILURE); 
     } else { 
      printf("\nError in ioctl VIDIOC_QUERYCAP\n\n"); 
      exit(0); 
     } 
    } 

    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { 
     fprintf (stderr, "%s is no video capture device\n", file); 
     exit (EXIT_FAILURE); 
    } 

    if (!(cap.capabilities & V4L2_CAP_READWRITE)) { 
     fprintf (stderr, "%s does not support read i/o\n", file); 
     exit (EXIT_FAILURE); 
    } 

    memset(&fmt, 0, sizeof(fmt)); 
    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
    fmt.fmt.pix.width  = 320; 
    fmt.fmt.pix.height  = 240; 
    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; 
    fmt.fmt.pix.field  = V4L2_FIELD_INTERLACED; 
    if (-1 == xioctl(camera_fd, VIDIOC_S_FMT, &fmt)) { 
     printf("VIDIOC_S_FMT"); 
    } 
    return camera_fd; 
} 
+0

谢谢你的详细回复,我会试试这个。 – Prem 2013-02-22 20:15:23