【问题标题】:Access webcam using OpenCV (Python) in Docker?在 Docker 中使用 OpenCV (Python) 访问网络摄像头?
【发布时间】:2017-06-30 18:02:41
【问题描述】:

我正在尝试将 Docker 用于我们的一个项目,该项目使用 OpenCV 来处理网络摄像头馈送 (Python)。但我似乎无法访问 docker 中的网络摄像头,这是我用来测试网络摄像头访问的代码:

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

这是我迄今为止尝试过的,

 docker run --device=/dev/video0 -it rec bash

 docker run --privileged --device=/dev/video0 -it rec bash

 sudo docker run --privileged --device=/dev/video0:/dev/video0 -it rec bash

所有这些都返回False,我做错了什么?

【问题讨论】:

  • 我认为不能保证cv2.VideoCapture(0) 实际上是/dev/video0。你试过video1之类的吗?这是哪个 Linux?
  • @karlphillip 是的,我试过那些和它的 Ubuntu 16.04。
  • 我知道这可能是隐含的...但是 /dev/video0 真的知道在主机上工作吗?是否已经用 VLC (vlc v4l2:///dev/video0) 之类的东西进行了测试?我知道这也可能无关紧要,但为了完整起见,提及所涉及内容的版本以及可能用于构建rec 图像的Dockerfile 是谨慎的。
  • @AndyShinn 我试过在主机上运行它,它没有任何问题。并且docker镜像是基于github.com/ageitgey/face_recognition#face-recognition

标签: python opencv docker


【解决方案1】:

尝试使用这个:

-v /dev/video0:/dev/video0

代替

--device=/dev/video0 

并执行:

$ xhost + 

docker 运行之前

【讨论】:

    【解决方案2】:

    你提供的链接中的 Dockerfile 没有说明 opencv 是如何安装的,你能提供你使用的 Dockerfile 吗?或者你是如何安装opencv的?

    如果通过 pip 安装 opencv,VideoCapture(0) 将不起作用。

    你正确地使用了--device=/dev/video0:/dev/video0

    【讨论】:

    • 啊,我确实通过 pip 安装了 opencv。我应该如何安装它?
    • 尝试改用这个dockerfile。它是 ubuntu 14.04,包括 dlib 和 opencv
    • 我还在面部识别 dockerfile 中的 dockerfile 末尾添加了一些行供您取消注释
    【解决方案3】:

    我发现让 dockerized OpenCV 能够连接到您的网络摄像头的最简单方法是使用以下 Dockerfile:

    FROM ubuntu:20.04
    
    ENV TERM=xterm
    ENV DEBIAN_FRONTEND=noninteractive
    
    RUN apt-get update && apt-get install -y --no-install-recommends \
        libopencv-dev \
        python3-opencv \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
    WORKDIR /app
    ADD . /app
    
    ENV PYTHONUNBUFFERED=1
    ENV PYTHONPATH=/app
    

    然后构建它并以这种方式运行:

    docker build -t opencv-webcam .
    docker run -it -v $PWD:/app/ --device=/dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY opencv-webcam bash
    

    并使用python3 script.py在容器内运行以下脚本:

    import cv2
    
    
    WINDOW_NAME = "Opencv Webcam"
    
    def run():
    
        cv2.namedWindow(WINDOW_NAME)
    
        video_capture = cv2.VideoCapture(0)
    
        while True:
            ret, frame = video_capture.read()
            print(ret, frame.shape)
    
            cv2.imshow(WINDOW_NAME, frame)
            cv2.waitKey(1)
    
    if __name__ == "__main__":
        run()
    

    【讨论】:

      【解决方案4】:

      我在使用非特权 Dockerfile(即使用 USER 行)时遇到了问题:

      容器必须以--user {UID} 开头;不是--user {UID}:{GID}(与docker-compose.yml 中的 user: 行相同!如果设置了gid,奇怪的是这不会继承访问网络摄像头文件(/dev/video0 等)所需的视频组权限。 此外,必须将内部 Dockerfile 用户添加到视频组;在 USER 行之后添加这个(在安装 sudo 并将用户添加到 sudoers 之后):

      RUN sudo usermod -a -G video <InternalUsername>

      在您尝试这些步骤之前:在特权模式下运行所有​​内容以测试您的问题是否真的出在此处。

      【讨论】:

        猜你喜欢
        • 2011-06-12
        • 2019-04-10
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 2021-01-08
        • 1970-01-01
        相关资源
        最近更新 更多