使用C++进行USB网络摄像头图像捕获,无需openCV(LINUX)

Pre*_*rem 11 c++ webcam

如何使用C++使用我的网络摄像头捕获图像并将其保存到磁盘?由于硬件问题我无法使用OPENCV.usb网络摄像头可与其他程序一起使用,如mplayer,cheese,gpicview,ffmpeg等.

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

EGO*_*rds 24

这很容易,你可以在视频设备read上做,在你激活了一些ioctls以使你的控制下的凸轮.

您可以将v4l2用于此作业.您可以在以下步骤中执行此操作

  1. 打开摄像机的设备文件(通常是"/ dev/video0")
  2. 告诉v4l2你想知道设备的某些功能
  3. 告诉v4l2从设备读取
  4. 告诉您要使用的v4l2格式

这是我用于此工作的实现.它会将相机设置为捕获320x240像素的视频,但您可以读取分辨率,相机能够从v4l2_capability结构中获取.

另外,我没有在我的PS2 EyeToy上测试不同相机上的代码,但它主要来自一个名为qv4l2的示例程序(你可以从这里得到它).该程序应解决您通常在那里看到的所有其他问题.

#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;
}
Run Code Online (Sandbox Code Playgroud)