我正在尝试使用我的网络摄像头(Creative Live!Cam Chat)在C / C ++中拍摄图像并将其保存到某个文件夹(运行Ubuntu)。理想情况下,我希望尽可能简单,尽管它不是最优雅的解决方案。
到目前为止,我发现v4l2grab,我觉得难以理解,并且似乎也不适用于Creative网络摄像头(返回大小为5Kb的黑色图片),虽然它似乎与安装的网络摄像头一起使用我的一部分笔记本电脑
我可以使用任何简单的C库或代码来执行此操作吗?
我不知道有一个好的图书馆(请添加评论并告诉我,如果有一个:-))。注意:对于某些用途,例如。 OpenCV很好,和if it is enough for you, definitely do use it。但如果你想要更多,请继续阅读。
所以你应该编写自己的代码来使用它,这并不是特别难。这是一个相关的问题:How to use/learn Video4Linux2 (On Screen Display) Output APIs?
一些使学习更容易的要点:
check_error
函数,并在任何ioctl调用之后立即调用它。void dump_cap(const struct v4l2_capability &cap) {...}
,并为你在代码中使用的每个结构添加一个类似的函数。memset(&ioctl_struct_var, 0, sizeof(ioctl_struct_var));
将结构初始化为0,并且如果重复使用它们(除非在某些设置上执行'get-modify-set'操作,这在V4L2中很常见)。上面提到的check_error
函数:
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);
您可以使用OpenCV。使用cvCreatecameraCapture
(您可以使用参数0调用它来获取故障凸轮)来创建一个对象,然后在该对象上调用cvQueryFrame
。每次调用cvQueryFrame
将返回一个帧。
看看uvccapture
源代码。它非常简单,但标准C只使用V4L2接口。 OpenCV
也可以工作,但设置和编译更复杂。