使用C语言从Ubuntu中的网络摄像头拍摄图像
我正在尝试使用我的网络摄像头(Creative Live!Cam Chat)在C/C++中拍摄图像并将其保存到某个文件夹(运行Ubuntu)。理想情况下,我期待的东西尽可能简单,尽管它不是最优雅的解决方案 到目前为止,我发现v4l2grab令人难以置信地难以理解,而且似乎与创造性网络摄像头(返回5Kb大小的黑色图片)不兼容,尽管它似乎与作为笔记本电脑一部分安装的网络摄像头兼容使用C语言从Ubuntu中的网络摄像头拍摄图像,c,linux,image,webcam,C,Linux,Image,Webcam,我正在尝试使用我的网络摄像头(Creative Live!Cam Chat)在C/C++中拍摄图像并将其保存到某个文件夹(运行Ubuntu)。理想情况下,我期待的东西尽可能简单,尽管它不是最优雅的解决方案 到目前为止,我发现v4l2grab令人难以置信地难以理解,而且似乎与创造性网络摄像头(返回5Kb大小的黑色图片)不兼容,尽管它似乎与作为笔记本电脑一部分安装的网络摄像头兼容 有没有简单的C库或代码可以用来实现这一点?您看过了吗?它对于各种图像的获取和处理都非常方便。拍照的过程有很好的文档记录,
有没有简单的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))声明它们之后,以及如果重用它们(对某些设置执行“get-modify set”操作时除外,这在V4L2中非常常见)
- 如果可能,请使用两个(或更多)不同的网络摄像头(不同的分辨率、不同的品牌),并使用这两个摄像头(全部)进行测试。这是最简单的,若你们把视频设备作为命令行参数,所以你们可以用不同的参数调用你们的程序
- 小步走。通常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))声明它们之后,以及如果重用它们(对某些设置执行“get-modify set”操作时除外,这在V4L2中非常常见)
- 如果可能,请使用两个(或更多)不同的网络摄像头(不同的分辨率、不同的品牌),并使用这两个摄像头(全部)进行测试。这是最简单的,若你们把视频设备作为命令行参数,所以你们可以用不同的参数调用你们的程序
- 小步走。通常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);
你可以