如何在 Linux 上从网络摄像头捕获静态图像

2024-03-08

我正在尝试为 Linux 编写一个 C++/Qt 程序,其中我从网络摄像头拍摄静态图像照片,对照片进行一些转换(裁剪、调整大小等),然后将其保存到 jpeg 文件。

但我遇到了一些问题。主要问题是标准 UVC(USB 视频设备类)Linux 驱动程序当前不支持直接静态图像捕获:http://www.ideasonboard.org/uvc/ http://www.ideasonboard.org/uvc/ .

因此,有两种可能的方法来捕获静态图像。您可以从相机的视频流中拍摄一帧,也可以拍摄一张单独的照片,就像便携式数码相机一样。 linux uvc 驱动不支持第二种方式,所以第一种方式是唯一的方式。但问题是,如果你想从视频流中取出一帧,照片的大小不能大于视频预览窗口中视频的大小。因此,如果我想拍摄 2 兆像素的照片,我必须以 1600x1200 的大小启动视频流,这不太舒服(至少,在 Qt 中,视频流的大小取决于视频预览窗口的大小)。

我知道有 linux 2 API 的视频,这可能对这项任务有帮助,但我不知道如何使用它。我目前正在学习 gstreamer,但我现在不知道如何使用这些工具来做我需要的事情。

所以,我将不胜感激任何帮助。我认为对于了解 Linux、GStreamer、v4l2 API 和其他 Linux 特定事物的人来说这不是一个难题。

顺便说一下,该程序仅适用于 Logitech C270 HD 网络摄像头。

请帮我。我不知道什么 API 或框架可以帮助我做到这一点。也许你知道。


不幸的是,opencv 中的 C4V2 调用无法使用我尝试使用 UVC 驱动程序开箱即用的任何相机捕获静态图像。

为了调试这个问题,我一直在尝试使用直接调用 c4v2 的 C 代码来完成此操作。

我一直在玩找到的示例代码here http://linuxtv.org/downloads/v4l-dvb-apis/v4l2grab-example.html。它使用从视频流中提取帧的方法。

您可以使用以下命令编译它:

gcc -O2 -Wall `pkg-config --cflags --libs libv4l2` filename.c -o filename

我尝试过 3 个罗技相机。其中最好的似乎是 Logitech C910。但即便如此,它也存在重大问题。

以下是我尝试使用此代码完成相同任务时遇到的问题。

当宽度和高度设置为 1920x1080 时,它几乎每次都能工作。

当我直接从命令行查询其他可能性时,例如使用:

v4l2-ctl --list-formats-ext

我尝试了一些其他“可用”的较小尺寸,它挂在选择中等待相机释放缓冲区。

另外,当我尝试直接从命令行设置其他尺寸时,例如:

v4l2-ctl -v height=320 -v width=240 -v pixelformat=YUYV

然后检查

v4l2-ctl -V

我发现它返回正确的像素格式,但通常不是正确的大小。

显然这款相机列在UVC site http://www.ideasonboard.org/uvc/由于是 UVC,因此 v4l2 兼容不符合要求。我怀疑这对于其他相机来说也同样糟糕。我尝试过的另外两个在网站上也被列为兼容,但存在更严重的问题。

发布此内容后,我对 LogitechC910 进行了更多测试。我想我会发布结果,以防它对其他人有所帮助。

我编写了一个脚本来测试上面提到的 v4l2 抓取器代码,以使用 v4l2 查询相机时声称支持的所有格式,结果如下:

640x480 => Hangs on clearing buffer
160x120 => Works
176x144 => Works
320x176 => Works
320x240 => Works
432x240 => Works
352x288 => Works
544x288 => Works
640x360 =>  Works
752x416 => Hangs on clearing buffer
800x448 => Hangs on clearing buffer
864x480 => Works
960x544 => Works
1024x576 => Works
800x600 => Works
1184x656 => Works
960x720 => Works
1280x720 => Works
1392x768 => Works
1504x832 => Works
1600x896 => Works
1280x960 => Works
1712x960 => Works
1792x1008 => Works
1920x1080 => Works
1600x1200 => Works
2048x1536 => Works
2592x1944 => Hangs on clearing buffer.

事实证明,默认设置 640x480 不起作用,这就是我和大多数在留言板上发帖的人陷入困境的原因。

由于它正在抓取视频帧,因此启动时抓取的第一帧可能曝光不正确(通常是黑色或接近黑色)。我相信这是因为它被用作摄像机,它会随着运行而调整曝光并且不关心第一帧。我相信这也让我和其他看到第一帧是黑色或接近黑色并认为这是某种错误的人陷入了困境。后面的帧有正确的曝光

事实证明,如果您避免上面列出的地雷并忽略所有错误消息,则带有 python 包装器的 opencv 可以在该相机上正常工作。错误消息是由于相机接受 v4l2 命令时无法正确响应而导致的。因此,如果您设置宽度,它实际上会被正确设置,但它会以错误的宽度进行响应。

要使用 python 包装器在 opencv 下运行,您可以执行以下操作:

import cv2
import numpy

cap = cv2.VideoCapture(0)  #ignore the errors
cap.set(3, 960)        #Set the width important because the default will timeout
                       #ignore the error or false response
cap.set(4, 544)        #Set the height ignore the errors
r, frame = cap.read()
cv2.imwrite("test.jpg", frame)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Linux 上从网络摄像头捕获静态图像 的相关文章

随机推荐

  • 锚元素的 ping 属性跨浏览器如何?

    a 是 HTML5 锚元素中一个相对较新 相对未知的属性 它的跨浏览器兼容性如何 我查看了 MDN 等在线资源http caniuse com http caniuse com 但没有发现任何表明浏览器支持的信息 我想知道这是否是 2014
  • 在docker中安装.net框架4.7.2

    我是 Net 环境的新手 我正在尝试为我的公司实施 docker 他们之前使用的是 4 5 所以我在 dockerfile 中使用了以下语句 RUN Install WindowsFeature NET Framework 45 ASPNE
  • 如何设置Spark执行器内存?

    我已经设定Spark executor 内存 to 2048m 并且在 UI 环境 页面中 我可以看到该值已正确设置 但是在 Executors 页面中 我看到只有1个执行器 它的内存是265 4MB 非常奇怪的价值 为什么不是256MB
  • const char* 连接

    我需要连接两个 const 字符 如下所示 const char one Hello const char two World 我该怎么做呢 我通过了这些char 来自具有 C 接口的第三方库 所以我不能简单地使用std string反而
  • 显示所有 messageHeader 的值

    我想知道显示所有 MessageHeaders 服务器端的最佳方式是什么 实际上我知道的唯一方法如下 OperationContext Current IncomingMessageHeaders GetHeader
  • 将 Powershell 核心设置为 Windows/Linux 上的默认 GNU Make shell

    在 Windows 上的 makefile 中 使用以下 make 版本 PS C projects gt make version GNU Make 4 1 Built for i686 w64 mingw32 Copyright C 1
  • 一般:Angular2 中的异步验证

    从几个晚上开始 我就开始在 augular2 中进行表单验证 所有基本案例都很容易实现并且工作正常 但我坚持使用异步验证 我创建了一个非常小的例子http plnkr co edit Xo8xwJjhlHkXrunzS8ZE http pl
  • Z3 将数组的默认值设置为零

    我正在尝试求解数组表达式的模型 其中数组的默认值等于 0 例如 我正在尝试解决这个例子 但我总是得到未知的结果 declare const arr Array Int Int declare const arr2 Array Int Int
  • 如何获取函数签名对应的TypedDict?

    假设我有一个像这样的函数签名 def any foo bar Bar with baz Optional Baz None with datetime Optional datetime None effective Optional bo
  • 如何在asp.net中发送邮件

    你好 我编写了在asp net中发送邮件的代码 如下所示 MailMessage mailMessage new MailMessage mailMessage From email protected cdn cgi l email pr
  • Java PDFBox - 读取和修改带有特殊字符(变音符号)的 pdf

    我正在尝试使用此方法修改 pdf 第一个代码块 使用 PDFStreamParser 并迭代 PDFOperator 然后在需要时更新 COSString http www coderanch com t 556009 open sourc
  • 将表情符号/表情符号添加到 SQL Server 表

    我正在尝试将表情符号 表情符号插入 SQL Server 数据库 但它只存储 而不是表情符号 表情符号 我只找到 SQL Server 的帮助 而不是 MySQL 的帮助 我试过 link https stackoverflow com q
  • Python ElementTree XML IOError:[Errno 22]无效模式('rb')或文件名

    使用以下代码 import xml etree cElementTree as ET tree ET parse r https apitest batchbook com api v1 people xml auth token GR5d
  • SQL 查询中的 MS Access VBA 数据类型不匹配错误

    我目前有以下 MS Access SQL 查询 它是 Access VBA 函数的一部分 它是在以下人士的帮助下建造的上一个问题 https stackoverflow com questions 38903010 how to sql j
  • org.apache.commons.exec.ExecuteException:进程因 ChromeDriver Chrome Selenium 和 TestNG Suite 错误而退出

    当我通过 TestNG XML 执行 TestNG 套件时 我观察到以下错误 严重 org apache commons exec ExecuteException 进程退出 一个 错误 1073741502 退出值 1073741502
  • 如何过滤elasticsearch全局聚合?

    我想要实现的目标 我希望我的 年龄 聚合不被查询过滤器过滤 并且我希望能够对其应用过滤器 因此 如果我从这个查询开始 query filtered filter terms family name Brown filter 1 aggs y
  • 如何使用 msiexec 将 MSI 安装到特定目录中?

    我想使用 msiexec 将 MSI 文件安装到特定目录中 我在用 msiexec i msi path INSTALLDIR C myfolder qb 使用 INSTALLDIR 无法正常工作 因为 MSI 安装到默认路径而不是指定路径
  • 使用 Map 实现 Trie

    我今天正在解决一个问题 但我被困住了 我知道特里树是如何工作的 但问题是我知道如何用静态数组和类来实现它 今天在网上冲浪时我读到有一种方法可以使用 stl map 来实现 attempts 我今天尝试了 但我仍然不知道如何在 int 上插入
  • 抽象和封装之间的区别?

    封装和抽象之间的确切区别是什么 这里的大多数答案都集中在 OOP 上 但封装开始得更早 每个函数都是一个封装 https en wikipedia org wiki Encapsulation 28computer programming
  • 如何在 Linux 上从网络摄像头捕获静态图像

    我正在尝试为 Linux 编写一个 C Qt 程序 其中我从网络摄像头拍摄静态图像照片 对照片进行一些转换 裁剪 调整大小等 然后将其保存到 jpeg 文件 但我遇到了一些问题 主要问题是标准 UVC USB 视频设备类 Linux 驱动程