cv2.VideoCapture在mac主机上的docker容器中不起作用

时间:2017-08-23 15:02:06

标签: python opencv docker dockerfile

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

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"]

1 个答案:

答案 0 :(得分:1)

使用Docker for Mac无法做到这一点。问题是Docker运行Hyperkit,后者又基于Xhyve

如果您阅读xhyve

的自述文件
  

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

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

您的--device=/dev/video0:/dev/video0只是从容器内部映射设备,而根本不在VM中。

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

在VM安装泊坞窗内并访问设备。