首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在LXC容器中使用OpenCV (Python)访问摄像头

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

Stack Overflow用户
提问于 2021-03-10 20:40:06
回答 2查看 711关注 0票数 0

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

所有上述软件运行良好。现在我需要使用OpenCV访问网络摄像头,我使用以下命令进行测试

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

,它在主机上返回True,但返回

代码语言:javascript
复制
[ 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仍然得到相同的Device logitech added to rosfoxy,但仍然导致了相同的错误。
  2. I随后尝试了lxc profile device add ros logitech usb vendorid=046d productid=082b,这导致了Device logitech added to ros。在测试时,我在主机上得到相同的error.
  3. Tested ( glxgearsglxinfo ),两者都很好。然而,当在LXC容器中测试它们时,它可以正常工作,但首先要处理这个错误:

代码语言:javascript
复制
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,运行良好。但是在容器上,它不起作用,它给出:

代码语言:javascript
复制
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,但似乎不起作用。

从容器里我他们试过

代码语言:javascript
复制
(base) ubuntu@rosfoxy:~$ v4l2-ctl --all
Failed to open /dev/video0: Permission denied

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

代码语言:javascript
复制
(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:
...

在我看来网络摄像头已经被探测到了!

但我还是明白

代码语言:javascript
复制
(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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-22 13:23:43

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

先是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

票数 0
EN

Stack Overflow用户

发布于 2021-03-10 22:46:51

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

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

代码语言:javascript
复制
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设备,您需要首先删除它,然后使用新的参数再次添加它。你可以像下面这样做。

代码语言:javascript
复制
lxc config device remove rosfoxy video0 
lxc config device add rosfoxy video0 unix-char path=/dev/video0 gid=1000

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66572518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档