【问题标题】:USB webcam image capture in C++ WITHOUT openCV (LINUX) [closed]没有openCV(LINUX)的C ++中的USB网络摄像头图像捕获[关闭]
【发布时间】:2013-02-08 12:45:21
【问题描述】:

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

我听说 V4L 可以做到这一点,但它有任何 C++ 库吗? 谁能给我看一个 C++ 例子来说明如何做到这一点?

【问题讨论】:

  • 欢迎来到 Stack Overflow! StackOverflow 不适合这个问题。我们不会为您编写代码。您需要自己编写代码,如果您不确定为什么某些事情没有按预期工作,请发布代码并说明您期望它做什么,以及它实际上在做什么,包括所有错误消息。见about StackOverflow

标签: c++ webcam


【解决方案1】:

这很简单,您可以在视频设备上执行read,在您激活一些 ioctl 以控制摄像头之后。

您可以使用 v4l2 来完成这项工作。您可以在这些步骤中执行此操作:

  1. 打开摄像头的设备文件(通常是“/dev/video0”)
  2. 告诉 v4l2 您想了解设备的某些功能
  3. 告诉 v4l2 从设备读取数据
  4. 告诉 v4l2 你想使用哪种格式

这是我用于这项工作的一个实现。它将设置相机以捕捉 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;
}

【讨论】:

  • 感谢您的详细回复,我会试试这个。
猜你喜欢
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 2013-06-03
  • 2013-01-18
  • 2014-03-17
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多