如何在 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 上从网络摄像头捕获静态图像 的相关文章

  • Linux命令列出所有可用命令和别名

    是否有一个 Linux 命令可以列出该终端会话的所有可用命令和别名 就好像您输入 a 并按下 Tab 键一样 但针对的是字母表中的每个字母 或者运行 别名 但也返回命令 为什么 我想运行以下命令并查看命令是否可用 ListAllComman
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7

随机推荐

  • 锚元素的 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 驱动程