cv2.VideoCapture不能在mac主机上的docker容器中工作

我无法打开networking摄像头或在Mac OS Sierra 10.12.6主机上的Ubuntu 16.04泊坞窗容器中捕捉video。

vid = cv2.VideoCapture(0) 

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

我没有使用从PIP OpenCV。 我从源代码编译cv2。 应该安装ffmpeg。 容器是否无法连接到networking摄像头设备?

我试着运行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 for Mac来做到这一点。 问题是Docker运行Hyperkit ,而Hyperkit又基于Xhyve

如果你阅读xhyve的自述

缺乏声音,USB,HID和任何forms的graphics支持。 关注服务器虚拟化,这不是严格的要求。 bhyve未来可能获得桌面虚拟化能力,但这似乎不是优先考虑事项。

因此,在Hyperkit虚拟机内部运行的Docker容器将永远无法访问设备。

你的--device=/dev/video0:/dev/video0只是从容器内映射一个设备,根本不在虚拟机中。

那么你有什么select? 而不是使用Mac的Docker,使用VirtualBox或VMWare融合。 在其中创build一个Ubuntu 16.04或任何其他支持的OS VM。 使用该VM的设置将networking摄像头设备与VM共享。 现在你的虚拟机操作系统将有设备。

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