【问题标题】:Unable to access camera in Docker container of Ubuntu无法访问 Ubuntu Docker 容器中的摄像头
【发布时间】:2021-07-14 09:22:34
【问题描述】:

我正在编写一个简单的 Opencv 代码,它可以捕获图像并向我们展示。但是每当我运行它时,它都会告诉无法使用此索引访问相机。

我尝试使用此命令运行我的 docker 文件 docker run -ti --device /dev/video0:/dev/video0 pradyumn10/ubuntu-python3 /bin/bash 这会打开相机一秒钟,然后将其关闭并给出错误“无法显示”

【问题讨论】:

  • 请分享您是如何启动此容器(哪些参数)以及可能是 Dockerfile 本身。
  • @Yaron 我没有制作 docker 文件,我只是提取了一个 ubuntu 的图像并运行它,然后我使用“apt install python3-opencv”在其中安装了 opencv 我的代码:import cv2 cam=cv2。 VideoCapture(0) while True: _, frame= cam.read() if frame is not None: cv2.imshow("frame",frame) cam.release()

标签: docker opencv


【解决方案1】:

您的摄像头很可能是网络摄像头,并且很可能安装在 /dev/video0/dev/video{N} 上 - 您必须首先在主机上找到 {N}。

一旦你得到它,你可以尝试像这样将它安装到你的 docker 容器中:

mount /dev/video0 /testvideo
docker run -it --rm --read-only -v "/testvideo:/testvideo" bash

之后,您在 docker 中的应用应尝试连接到 /testvideo 而不是 /dev/video0

附:我自己没有尝试过,但感觉 linux 像安装任何其他设备一样安装网络摄像头应该没有任何问题。我会试一试,但不能保证:)

【讨论】:

  • 当我运行第二个命令“docker:来自守护进程的错误响应:创建挂载源路径'/testvideo'时出错:mkdir /testvideo:只读文件系统。” /跨度>
  • 是的,它应该是只读的,因为你不能写入网络摄像头,所以它应该是这样的:``` docker run -it --rm --read-only -v " /testvideo:/testvideo" bash ```
  • 这个答案对我不起作用。 mount 命令给了我错误/dev/video0 is not a block device 查看我的答案。
【解决方案2】:

我的问题是我在特权模式下使用非 root 用户运行容器,即使用选项 -u vscode --privileged --device /dev/video0:/dev/video0(等等)。 privileged 选项导致网络摄像头所有者和组为 root,但是由于我以 vscode 运行容器,因此访问 /dev/video0 的权限被拒绝。

解决方案是不在priviledged 模式下运行容器(即省略--privileged 标志--导致网络摄像头所有者为root,但组video)并将vscode 用户添加到video 组。通过将此行添加到我的Dockerfile,这很容易完成:

RUN usermod -aG vscode video

并重建容器。如果您必须在privileged 模式下运行容器,您可以在容器运行后改为sudo chown root:video /dev/video0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多