Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C语言从Ubuntu中的网络摄像头拍摄图像_C_Linux_Image_Webcam - Fatal编程技术网

使用C语言从Ubuntu中的网络摄像头拍摄图像

使用C语言从Ubuntu中的网络摄像头拍摄图像,c,linux,image,webcam,C,Linux,Image,Webcam,我正在尝试使用我的网络摄像头(Creative Live!Cam Chat)在C/C++中拍摄图像并将其保存到某个文件夹(运行Ubuntu)。理想情况下,我期待的东西尽可能简单,尽管它不是最优雅的解决方案 到目前为止,我发现v4l2grab令人难以置信地难以理解,而且似乎与创造性网络摄像头(返回5Kb大小的黑色图片)不兼容,尽管它似乎与作为笔记本电脑一部分安装的网络摄像头兼容 有没有简单的C库或代码可以用来实现这一点?您看过了吗?它对于各种图像的获取和处理都非常方便。拍照的过程有很好的文档记录,

我正在尝试使用我的网络摄像头(Creative Live!Cam Chat)在C/C++中拍摄图像并将其保存到某个文件夹(运行Ubuntu)。理想情况下,我期待的东西尽可能简单,尽管它不是最优雅的解决方案

到目前为止,我发现v4l2grab令人难以置信地难以理解,而且似乎与创造性网络摄像头(返回5Kb大小的黑色图片)不兼容,尽管它似乎与作为笔记本电脑一部分安装的网络摄像头兼容


有没有简单的C库或代码可以用来实现这一点?

您看过了吗?它对于各种图像的获取和处理都非常方便。拍照的过程有很好的文档记录,但我建议你看看这样的东西,如果你真的决定使用它。

你看过吗?它对于各种图像的获取和处理都非常方便。拍照的过程有很好的文档记录,但我建议您看看类似的东西,如果您确实决定使用它。

看看源代码。这是一个非常简单的标准C语言,它只使用V4L2接口<代码>OpenCV也可以工作,但它的设置和编译更加复杂。

看看源代码。这是一个非常简单的标准C语言,它只使用V4L2接口
OpenCV也可以,但是它的设置和编译更复杂。

我不知道有什么好的库可以使用(请添加注释并告诉我是否有:-))。注:对于某些用途,例如:刚刚好,和。但如果你想要更多,请继续阅读

因此,您应该编写自己的代码来使用它,这并不特别困难。这里有一个相关的问题:

让学习更容易的几点:

  • 调用IOCTL后,始终检查返回状态并打印可能的错误消息。当你工作的时候,你会得到很多这样的信息,所以要有系统。我建议使用如下所示的函数
    check\u error
    ,并在任何ioctl调用后立即调用它

  • IMO必须:使用IDE/editor,它可以跟随符号到实际的头文件(例如在Qt Creator中,这是一个很好的纯C应用程序IDE,尽管名称不同,但在符号上点击F2,它甚至会转到系统头以显示它的定义位置)。在与V4L2相关的符号和定义上充分地使用它,并读取头文件中的注释,这通常是最好的文档

  • 使用查询ioctls和write函数转储它们以良好格式返回的值。例如,让函数
    void dump\u cap(const struct v4l2\u capability&cap){…}
    ,并为代码中使用的每个结构添加一个类似的函数

  • 在传递给IOCTL的结构内部设置值时不要偷懒。始终使用
    memset将结构初始化为0(&ioctl_struct_var,0,sizeof(ioctl_struct_var))
  • 如果可能,请使用两个(或更多)不同的网络摄像头(不同的分辨率、不同的品牌),并使用这两个摄像头(全部)进行测试。这是最简单的,若你们把视频设备作为命令行参数,所以你们可以用不同的参数调用你们的程序

  • 小步走。通常IOCTL可能不会返回您期望的结果,因此在您实际看到查询为您的相机返回的结果之前,编写使用返回数据的代码是没有意义的

上述
检查错误
功能:

void check_error(int return_value_of_ioctl, const char *msg) {
    if (return_value_of_ioctl != -1) return; /* all ok */
    int eno = errno; /* just to avoid accidental clobbering of errno */
    fprintf(stderr, "error (%d) with %s: %s\n", eno, msg, strerror(eno));
    exit(1); /* optional, depending on how you want to work with your code */
}
在每次ioctl后立即调用,例如:

struct v4l2_capability cap;
setmem(&cap, 0, sizeof(cap));
int r=ioctl(fd, VIDIOC_QUERYCAP, &cap); 
check_error(r, "VIDIOC_QUERYCAP");
dump_querycap(&cap);

我不知道有哪一个好的库可以用于此目的(请添加评论并告诉我是否有:-)。注:对于某些用途,例如:刚刚好,和。但如果你想要更多,请继续阅读

因此,您应该编写自己的代码来使用它,这并不特别困难。这里有一个相关的问题:

让学习更容易的几点:

  • 调用IOCTL后,始终检查返回状态并打印可能的错误消息。当你工作的时候,你会得到很多这样的信息,所以要有系统。我建议使用如下所示的函数
    check\u error
    ,并在任何ioctl调用后立即调用它

  • IMO必须:使用IDE/editor,它可以跟随符号到实际的头文件(例如在Qt Creator中,这是一个很好的纯C应用程序IDE,尽管名称不同,但在符号上点击F2,它甚至会转到系统头以显示它的定义位置)。在与V4L2相关的符号和定义上充分地使用它,并读取头文件中的注释,这通常是最好的文档

  • 使用查询ioctls和write函数转储它们以良好格式返回的值。例如,让函数
    void dump\u cap(const struct v4l2\u capability&cap){…}
    ,并为代码中使用的每个结构添加一个类似的函数

  • 在传递给IOCTL的结构内部设置值时不要偷懒。始终使用
    memset将结构初始化为0(&ioctl_struct_var,0,sizeof(ioctl_struct_var))
  • 如果可能,请使用两个(或更多)不同的网络摄像头(不同的分辨率、不同的品牌),并使用这两个摄像头(全部)进行测试。这是最简单的,若你们把视频设备作为命令行参数,所以你们可以用不同的参数调用你们的程序

  • 小步走。通常IOCTL可能不会返回您期望的结果,因此在您实际看到查询为您的相机返回的结果之前,编写使用返回数据的代码是没有意义的

上述
检查错误
功能:

void check_error(int return_value_of_ioctl, const char *msg) {
    if (return_value_of_ioctl != -1) return; /* all ok */
    int eno = errno; /* just to avoid accidental clobbering of errno */
    fprintf(stderr, "error (%d) with %s: %s\n", eno, msg, strerror(eno));
    exit(1); /* optional, depending on how you want to work with your code */
}
在每次ioctl后立即调用,例如:

struct v4l2_capability cap;
setmem(&cap, 0, sizeof(cap));
int r=ioctl(fd, VIDIOC_QUERYCAP, &cap); 
check_error(r, "VIDIOC_QUERYCAP");
dump_querycap(&cap);
你可以