【问题标题】:cv2.VideoCapture not working in docker container on a mac hostcv2.VideoCapture 在 mac 主机上的 docker 容器中不起作用
【发布时间】:2017-08-23 15:02:06
【问题描述】:

我无法在 Mac OS Sierra 10.12.6 主机上的 Ubuntu 16.04 docker 容器中打开网络摄像头或捕获视频。

vid = cv2.VideoCapture(0)

其中vid.isOpened() 返回Falseret, img = vid.read() 返回False, None

我不只是使用 pip 的 opencv。我从源代码编译了 cv2。应该安装ffmpeg。容器无法连接到网络摄像头设备吗?

我尝试使用以下命令运行 docker:

docker run -it --privileged --device=/dev/video0:/dev/video0 --entrypoint /bin/bash <ImageID>

我的 dockerfile 如下:

#
# Ubuntu Dockerfile
#
# https://github.com/dockerfile/ubuntu
#

# Pull base image.
FROM ubuntu:16.04

# Install.
RUN \
  sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list && \
  apt-get update && \
  apt-get -y upgrade && \
  apt-get install -y build-essential && \
  apt-get install -y software-properties-common && \
  apt-get install -y byobu curl git htop man unzip vim wget && \
  apt-get install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libv4l-dev && \
  apt-get install -y python-dev python-numpy libtbb2 libtbb-dev libjpeg8-dev libpng12-dev libtiff5-dev libjasper-dev libdc1394-22-dev && \
  apt-get install -y libxvidcore-dev libx264-dev && \
  apt-get install -y libgtk-3-dev && \
  apt-get install -y libatlas-base-dev gfortran && \
  apt-get install -y libopencv-dev && \
  rm -rf /var/lib/apt/lists/*


RUN apt-get update && apt-get install python2.7-dev python3.5-dev

# Set environment variables.
ENV HOME /root

# Define working directory.
WORKDIR /root

# Get OpenCV
RUN wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
RUN unzip opencv.zip
RUN wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
RUN unzip opencv_contrib.zip

# GET PIP
RUN apt-get update && apt-get install -y python3-pip
RUN pip3 install numpy

# Build OpenCV
## NOTE: cd wont work by itself, need to be with the actual command to be performed
WORKDIR /root/opencv-3.1.0
RUN mkdir build
WORKDIR /root/opencv-3.1.0/build
RUN cmake -D CMAKE_BUILD_TYPE=RELEASE \
  -D CMAKE_INSTALL_PREFIX=/usr/local \
  -D INSTALL_PYTHON_EXAMPLES=ON \
  -D INSTALL_C_EXAMPLES=OFF \
  -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
  -D BUILD_EXAMPLES=ON \
  -D PYTHON_EXECUTABLE=/usr/bin/python3.5 \
  -D PYTHON_PACKAGES_PATH=/usr/local/lib/python3.5/site-packages \
  -D PYTHON_NUMPY_INCLUDE_DIR=/usr/local/lib/python3.5/dist-packages/numpy/core/include ..

RUN make -j4
RUN make install
RUN ldconfig

## RENAME BUILT cv2.so
WORKDIR /usr/local/lib/python3.5/dist-packages
RUN mv cv2.cpython-35m-x86_64-linux-gnu.so cv2.so
WORKDIR /usr/local/lib/python3.5/site-packages
RUN ln -s /usr/local/lib/python3.5/dist-packages/cv2.so cv2.so

## DELETE DIRECTORIES
# WORKDIR /root
# RUN rm -rf opencv-3.1.0 opencv_contrib-3.1.0 opencv.zip opencv_contrib.zip

# Define default command.
CMD ["bash"]

【问题讨论】:

  • 使用 docker 工具箱还是 docker for mac?
  • Docker for mac,版本 17.06.0-ce-mac19

标签: python opencv docker dockerfile


【解决方案1】:

您无法使用 Docker for Mac 执行此操作。问题是 Docker 运行 Hyperkit,而后者又基于 Xhyve

如果您阅读了xhyve的自述文件

明显缺少声音、USB、HID 和任何类型的图形支持。以服务器虚拟化为重点,这并不是严格的要求。 bhyve 未来可能会获得桌面虚拟化功能,但这似乎不是优先事项。

因此,您在 Hyperkit VM 中运行的 docker 容器将永远无法访问该设备。

您的--device=/dev/video0:/dev/video0 只是从容器内部映射一个设备,它可能根本不存在于虚拟机中。

那么你有什么选择?不要使用 Docker for Mac,而是使用 VirtualBox 或 VMWare fusion。在其中创建 Ubuntu 16.04 或任何其他受支持的 OS VM。使用该 VM 的设置与该 VM 共享网络摄像头设备。现在您的虚拟机操作系统将拥有该设备。

在您的 VM 中安装 docker 并访问设备。

【讨论】:

  • 好的,谢谢您的信息。我确实注意到你之前问过我是使用 docker toolbox 还是 docker for mac。它在docker工具箱上可行吗?还是两者都不可行?
  • Toolbox 使用 VirtualBox 和一个很小的 ​​boot2docker 镜像。你也可以这样做。但是,既然您正在解决问题,最好加载带有 GUI 的操作系统。这就是为什么我建议使用 VirtualBox + Ubuntu Desktop。一旦你弄清楚了,你可以随时移动到工具箱
【解决方案2】:

我注意到在 macOS 上运行的 Docker 无法使用摄像头的问题。我不太想在我的mac上安装VM,但是我想利用Docker的便利,所以我设计了技术方案,从mac本身读取镜像,使用docker容器作为服务器。

将军:

  • 将 docker 用作服务,监听端口,接收和处理图像
  • 使用 macOS 读取图像,并将图像分析任务交给 Docker 容器

具体的:

  • 从 macOS 读取图片,并不难
  • 通过像socket这样的进程间通信(IPC)将图像发送到Docker容器(我现在不是很了解,我会稍微研究一下)
  • 处理图像使用一些特定的算法
  • 通过 IPC 将结果返回给 macOS 主机
  • mac 上的其他简单工作

该方法可以总结为这张图片

我没有实现它,但是我搜索了一些可能有帮助的材料,我在下面列出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多