如何在 LXC 容器中使用 OpenCV (Python) 访问网络摄像头

如何解决如何在 LXC 容器中使用 OpenCV (Python) 访问网络摄像头

我在主机上运行 Ubuntu 18.04,在 LXC 容器内运行 Ubuntu 20.04。我的目标是在 LXC 容器中运行 ROS2(需要 Ubuntu 20.04),然后使用它连接到两个 dynamixel 伺服电机和一个 USB Logitech 网络摄像头。我还在容器内安装了 miniconda,以便我可以安装 OpenCV 和 dlib。我也在容器内使用 conda 虚拟环境。

所有提到的软件都运行良好。现在我需要使用 OpenCV 访问网络摄像头,我使用此命令进行测试

python -c "import cv2;print(cv2.VideoCapture(0).isOpened())"

在主机上返回 True 但返回

[ WARN:0] global ../modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video0): can't open camera by index
False

从容器内部。

到目前为止我尝试过:

  1. lxc config device add rosfoxy video0 unix-char path=/dev/video0video0video1video2 并仍然得到相同的错误。
  2. lxc config device add rosfoxy logitech usb vendorid=046d productid=082b 导致 Device logitech added to rosfoxy,但仍然是同样的错误。
  3. 然后我尝试了 lxc profile device add ros logitech usb vendorid=046d productid=082b,结果是 Device logitech added to ros。测试时我得到同样的错误。
  4. 在主机上测试了 glxgearsglxinfo,两者都运行良好。但是,当从 LXC 容器内部测试它们时,它工作正常,但首先出现此错误:
libGL error: MESA-LOADER: failed to retrieve device information
libGL error: Version 4 or later of flush extension not found
libGL error: failed to load driver: i915
libGL error: failed to open /dev/dri/card0: No such file or directory
libGL error: failed to load driver: i965
3073 frames in 5.0 seconds = 614.256 FPS
5238 frames in 5.0 seconds = 1047.546 FPS
3766 frames in 5.0 seconds = 753.186 FPS
4214 frames in 5.0 seconds = 842.731 FPS
4926 frames in 5.0 seconds = 985.092 FPS
6007 frames in 5.0 seconds = 1201.399 FPS
5694 frames in 5.0 seconds = 1138.660 FPS
  1. 在主机上测试 guvcview,工作正常。但是在容器上,它不起作用,它给出:
V4L2_CORE: ERROR opening V4L2 interface for /dev/video2
V4L2_CORE: ERROR opening V4L2 interface for /dev/video3
V4L2_CORE: ERROR opening V4L2 interface for /dev/video0
V4L2_CORE: ERROR opening V4L2 interface for /dev/video1
GUVCVIEW: version 2.0.6
GUVCVIEW: couldn't open /home/ubuntu//.config/guvcview2/video0 for read: No such file or directory
V4L2_CORE: ERROR opening V4L interface: Permission denied
GUVCVIEW (1): Guvcview error
     no video device found

(guvcview:1526): dbind-WARNING **: 19:29:55.201: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-EhmzLUeJ8h: Connection refused

(guvcview:1526): Gtk-WARNING **: 19:29:55.307: Theme parsing error: <data>:1:17: not a number

(guvcview:1526): Gtk-WARNING **: 19:29:55.307: Theme parsing error: <data>:1:31: Using Pango syntax for the font: style property is deprecated; please use CSS syntax

(guvcview:1526): Gtk-WARNING **: 19:29:55.307: Theme parsing error: <data>:1:17: not a number

(guvcview:1526): Gtk-WARNING **: 19:29:55.307: Theme parsing error: <data>:1:32: Using Pango syntax for the font: style property is deprecated; please use CSS syntax

你会建议怎么做吗?

更新 1: 尝试了 lxc config device add rosfoxy video0 unix-char path=/dev/video0 gid=1000,但似乎不起作用。

从容器内部我尝试了

(base) ubuntu@rosfoxy:~$ v4l2-ctl --all
Failed to open /dev/video0: Permission denied

但是当我添加 sudo 时,我得到了:

(base) ubuntu@rosfoxy:~$ sudo v4l2-ctl --all
Driver Info:
    Driver name      : uvcvideo
    Card type        : Webcam C170: Webcam C170
    Bus info         : usb-0000:00:14.0-1
    Driver version   : 5.4.86
    Capabilities     : 0x84a00001
        Video Capture
        Metadata Capture
        Streaming
        Extended Pix Format
        Device Capabilities
    Device Caps      : 0x04200001
        Video Capture
        Streaming
        Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
...

在我看来,网络摄像头已被检测到!

但我还是明白

(py38) ubuntu@rosfoxy:~$ python -c "import cv2;print(cv2.VideoCapture(0).isOpened())"
[ WARN:0] global ../modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video0): can't open camera by index
False

更新 2:

我应该先发出 lxc config device remove rosfoxy video0 然后 lxc config device add rosfoxy video0 unix-char path=/dev/video0 gid=1000

感谢 Simos https://discuss.linuxcontainers.org/t/cant-open-camera-by-index-on-lxc-container/10452/8

解决方法

当您运行命令 lxc config device add rosfoxy video0 unix-char path=/dev/video0 时,会在容器中创建一个具有默认所有者和组的设备。这些是root/root。在主机上,此设备的组是 video,但在容器中没有设置将非 root 用户添加到此组。

因此,将命令修改为以下内容。 ubuntu:* 容器映像中的非 root 帐户的组 ID 为 1000。

lxc config device add rosfoxy video0 unix-char path=/dev/video0 gid=1000

USB 设备问题应该有类似的解决方案。有关文档,请参阅 https://linuxcontainers.org/lxd/docs/master/instances#type-usb。您可能需要明确设置 uidgid

如果要修改添加的 LXD 设备,则需要先将其删除,然后使用新参数重新添加。你可以像下面这样做。

lxc config device remove rosfoxy video0 
lxc config device add rosfoxy video0 unix-char path=/dev/video0 gid=1000

请注意,gid=1000 指定了容器中非 root 用户的组 ID。如果您使用不同类型的容器映像(Ubuntu 除外),则可能需要更改此值。如果您在容器中运行 id 命令,您可以在容器中找到您的非 root 帐户的组 ID。

,

这两个命令是我问题的答案:

第一个lxc config device remove rosfoxy video0 然后lxc config device add rosfoxy video0 unix-char path=/dev/video0 gid=1000

感谢 Simos https://discuss.linuxcontainers.org/t/cant-open-camera-by-index-on-lxc-container/10452/8

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res