当前位置: 首页 > 知识库问答 >
问题:

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

澹台举
2023-03-14

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

所有提到的软件工作正常。现在我需要用OpenCV访问网络摄像头,我使用这个命令进行测试

python-c"导入cv2; print(cv2.VideoCapture(0). isOpen())"

在主机上返回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设备添加rosfoxy video0 unix字符路径=/dev/video0video0video1video2,但仍会收到相同的错误
  2. lxc config device add rosfoxy logitech usb vendorid=046d productid=082b导致device logitech添加到rosfoxy,但仍然存在相同的错误
  3. 然后我尝试了lxc profile device add ros logitech usb vendorid=046d productid=082b,结果是device logitech添加到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
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配置设备添加rosfoxy视频0 unix-char路径=/dev/视频0 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配置设备删除rosfoxy视频0然后lxc配置设备添加rosfoxy视频0 unix-char path=/dev/video o0 gid=1000

多亏了西莫斯https://discuss.linuxcontainers.org/t/cant-open-camera-by-index-on-lxc-container/10452/8

共有2个答案

苏淇
2023-03-14

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

首先lxc配置设备删除rosfoxy视频0然后lxc配置设备添加rosfoxy视频0 unix-char path=/dev/video o0 gid=1000

多亏了西莫斯https://discuss.linuxcontainers.org/t/cant-open-camera-by-index-on-lxc-container/10452/8

斜烈
2023-03-14

运行命令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。

 类似资料:
  • 问题内容: 我想从Python访问我的网络摄像头。 我尝试使用VideoCapture扩展(教程),但对我而言效果不佳,我不得不解决一些问题,例如分辨率> 320x230时它有点慢,有时它返回时没有明显原因。 是否有更好的方法从Python访问我的网络摄像头? 问题答案: OpenCV支持从网络摄像头获取数据,并且默认情况下随附Python包装器,您还需要安装OpenCV Python扩展名(称为

  • 我试图从我的摄像头获取图像使用导入OpenCV的python代码。代码如下: 代码工作正常,除了相机默认分辨率为640x480,我的代码似乎只能设置比这更低的分辨率值。例如,我可以将图像大小设置为320x240,但我不能将其更改为800x600。我没有出现错误:只是分辨率设置为默认值(640x480),因为我试图将其设置为更高的值。 我正在使用的摄像头(没有其他网络摄像头连接到计算机)是Quick

  • 问题内容: 我一直在尝试使用Python创建一个简单的程序,该程序使用OpenCV从我的网络摄像头获取视频供稿并将其显示在屏幕上。 我知道我之所以在这里,是因为创建了窗口,并且网络摄像头上的灯闪烁了,但是它似乎在窗口中什么都没有显示。希望有人可以解释我在做什么错。 在不相关的注释上,我注意到我的网络摄像头有时会在中更改其索引号,有时我需要输入0、1或2,即使我只连接了一个摄像头,也没有拔下插头(我

  • 问题内容: 如何访问我的IP摄像机流? 用于显示标准网络摄像头流的代码是 除了IP摄像机,我该如何做同样的事情? 我的系统: Python 2.7.14 OpenCV 2.4.9 Teledyne Dalsa Genie Nano XL相机 帮助将不胜感激 您可以将视频捕获对象用作 问题答案: 我回答了我自己的问题,报告了什么似乎是Python OpenCV中访问IP摄像机的 最全面的 总体过程。

  • 我想使用ffmpeg直播网络摄像头。我的罗技c920网络摄像头具有原始和压缩数据的输出流。命令产生以下控制台输出: 我想复制压缩的h264图像并将其发送到ffserver。 当我使用这个命令程序获取原始数据并使用h264编解码器转码。 当我将更改为时,我收到一个错误,因为ffmpeg尝试复制原始相机图像。 如何访问h264压缩图像并将其发送到服务器?

  • 我正在通过将前置摄像头设置为 AVD 管理器中的“webcam0”来将网络摄像头连接到模拟器。当我启动模拟器的相机应用程序时,我收到错误 以下是 Android 源代码的相关部分: 网络摄像头已被正确分配了0的ID,因为只有1个摄像头。但是,可能仍然为0。这意味着模拟器正在注册摄像头,但它没有费心更新连接的摄像头数量。 如何连接网络摄像头,使其能够被模拟器正确识别? 编辑:命令