Установка OpenCV в контейнере Docker

Я пытаюсь Dockerise приложение Python, которое зависит от OpenCV. Я пробовал несколько разных способов, но я продолжаю получать... ImportError: No module named cv2 при попытке запустить приложение.

Вот мой текущий файл Docker.

FROM python:2.7

MAINTAINER Ewan Valentine <[email protected]>

RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 

# Various Python and C/build deps
RUN apt-get update && apt-get install -y \ 
    wget \
    build-essential \ 
    cmake \ 
    git \
    pkg-config \
    python-dev \ 
    python-opencv \ 
    libopencv-dev \ 
    libav-tools  \ 
    libjpeg-dev \ 
    libpng-dev \ 
    libtiff-dev \ 
    libjasper-dev \ 
    libgtk2.0-dev \ 
    python-numpy \ 
    python-pycurl \ 
    libatlas-base-dev \
    gfortran \
    webp \ 
    python-opencv 

# Install Open CV - Warning, this takes absolutely forever
RUN cd ~ && git clone https://github.com/Itseez/opencv.git && \ 
    cd opencv && \
    git checkout 3.0.0 && \
    cd ~ && git clone https://github.com/Itseez/opencv_contrib.git && \
    cd opencv_contrib && \
    git checkout 3.0.0 && \
    cd ~/opencv && mkdir -p build && cd build && \
    cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \ 
    -D INSTALL_C_EXAMPLES=ON \ 
    -D INSTALL_PYTHON_EXAMPLES=ON \ 
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ 
    -D BUILD_EXAMPLES=OFF .. && \
    make -j4 && \
    make install && \ 
    ldconfig

COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . /usr/src/app 

И мой файл требований .txt

Flask==0.8
gunicorn==0.14.2
requests==0.11.1
bs4==0.0.1
nltk==3.2.1
pymysql==0.7.2
xlsxwriter==0.8.5
numpy==1.11
Pillow==3.2.0
cv2==1.0
pytesseract==0.1

Ответ 1

Исправлено с немного другой настройкой

FROM python:2.7

MAINTAINER Ewan Valentine <[email protected]>

RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 

# Various Python and C/build deps
RUN apt-get update && apt-get install -y \ 
    wget \
    build-essential \ 
    cmake \ 
    git \
    unzip \ 
    pkg-config \
    python-dev \ 
    python-opencv \ 
    libopencv-dev \ 
    libav-tools  \ 
    libjpeg-dev \ 
    libpng-dev \ 
    libtiff-dev \ 
    libjasper-dev \ 
    libgtk2.0-dev \ 
    python-numpy \ 
    python-pycurl \ 
    libatlas-base-dev \
    gfortran \
    webp \ 
    python-opencv \ 
    qt5-default \
    libvtk6-dev \ 
    zlib1g-dev 

# Install Open CV - Warning, this takes absolutely forever
RUN mkdir -p ~/opencv cd ~/opencv && \
    wget https://github.com/Itseez/opencv/archive/3.0.0.zip && \
    unzip 3.0.0.zip && \
    rm 3.0.0.zip && \
    mv opencv-3.0.0 OpenCV && \
    cd OpenCV && \
    mkdir build && \ 
    cd build && \
    cmake \
    -DWITH_QT=ON \ 
    -DWITH_OPENGL=ON \ 
    -DFORCE_VTK=ON \
    -DWITH_TBB=ON \
    -DWITH_GDAL=ON \
    -DWITH_XINE=ON \
    -DBUILD_EXAMPLES=ON .. && \
    make -j4 && \
    make install && \ 
    ldconfig

COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . /usr/src/app 

Ответ 2

Спасибо, что опубликовали это. Я столкнулся с тем же вопросом и попробовал ваше решение, и хотя он, казалось, установил OpenCV, оставил мне проблему с конфликтующими версиями библиотеки Python six, поэтому я выбрал другой маршрут. Я думаю, что более простой способ сделать это - установить Anaconda в свой контейнер, а затем добавить OpenCV. Я использую Python 2, поэтому весь мой Dockerfile для установки OpenCvv - это просто:

FROM continuumio/anaconda
EXPOSE 5000

ADD . /code-directory
WORKDIR code-directory
RUN conda install opencv

CMD ["python", "run-code.py"]

Это установит Anaconda из файла dunkerfile continuumio/anaconda, а затем будет использовать Anaconda для установки opencv. Для этого необходим отдельный файл Dockerio Continumio для Python 3.

Ответ 3

Здесь образ, который построен на Ubuntu 16.04 с Python2 + Python3 + OpenCV. Вы можете вытащить его, используя docker pull chennavarri/ubuntu_opencv_python

Здесь Dockerfile (предоставленный в том же реестре докер-хаба, упомянутом выше), который установит opencv для python2 и python3 на Ubuntu 16.04, а также установит соответствующую ссылку raw1394. Скопировано из https://github.com/chennavarri/docker-ubuntu-python-opencv

FROM ubuntu:16.04
MAINTAINER Chenna Varri

RUN apt-get update
RUN apt-get install -y build-essential apt-utils

RUN apt-get install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev \
  libavformat-dev libswscale-dev
RUN  apt-get update && apt-get install -y python-dev python-numpy \
  python3 python3-pip python3-dev libtbb2 libtbb-dev \
  libjpeg-dev libjasper-dev libdc1394-22-dev \
  python-opencv libopencv-dev libav-tools python-pycurl \
  libatlas-base-dev gfortran webp qt5-default libvtk6-dev zlib1g-dev

RUN pip3 install numpy

RUN apt-get install -y python-pip
RUN pip install --upgrade pip

RUN cd ~/ &&\
    git clone https://github.com/Itseez/opencv.git &&\
    git clone https://github.com/Itseez/opencv_contrib.git &&\
    cd opencv && mkdir build && cd build && cmake  -DWITH_QT=ON -DWITH_OPENGL=ON -DFORCE_VTK=ON -DWITH_TBB=ON -DWITH_GDAL=ON -DWITH_XINE=ON -DBUILD_EXAMPLES=ON .. && \
    make -j4 && make install && ldconfig

# Set the appropriate link
RUN ln /dev/null /dev/raw1394

RUN cd ~/opencv

Некоторые дополнительные инструкции для людей, начинающих с Docker:

  • В каталоге, в который вы помещаете этот файл Docker, создайте изображение докера как docker build -t ubuntu_cv .

  • Как только изображение будет построено, вы можете проверить, выполнив docker images

    REPOSITORY   TAG       IMAGE ID      CREATED             SIZE
    
    ubuntu_cv  latest    6210ddd6346b   24 minutes ago      2.192 GB
    
  • Вы можете запустить контейнер докера как docker run -t -i ubuntu_cv:latest

Ответ 4

from    ubuntu:12.10

# Ubuntu sides with libav, I side with ffmpeg.
run echo "deb http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntu quantal main" >> /etc/apt/sources.list
run apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1DB8ADC1CFCA9579


run apt-get update
run apt-get install -y -q wget curl
run apt-get install -y -q build-essential
run apt-get install -y -q cmake
run apt-get install -y -q python2.7 python2.7-dev
run wget 'https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg' && /bin/sh setuptools-0.6c11-py2.7.egg && rm -f setuptools-0.6c11-py2.7.egg
run curl 'https://raw.github.com/pypa/pip/master/contrib/get-pip.py' | python2.7
run pip install numpy
run apt-get install -y -q libavformat-dev libavcodec-dev libavfilter-dev libswscale-dev
run apt-get install -y -q libjpeg-dev libpng-dev libtiff-dev libjasper-dev zlib1g-dev libopenexr-dev libxine-dev libeigen3-dev libtbb-dev
add build_opencv.sh /build_opencv.sh
run /bin/sh /build_opencv.sh
run rm -rf /build_opencv.sh

Ответ 5

Чтобы установить Opencv (последний) в Docker... шаги аналогичны версии Linux, только путь символической ссылки отличается:

apt install -y libtiff5-dev libjpeg8-dev libpng-dev
apt install -y libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
apt install -y libxine2-dev libv4l-dev
apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
apt install -y qt5-default
apt install -y libatlas-base-dev
apt install -y libfaac-dev libmp3lame-dev libtheora-dev
apt install -y libvorbis-dev libxvidcore-dev
apt install -y libopencore-amrnb-dev libopencore-amrwb-dev
apt install -y x264 x265 v4l-utils
apt install -y libprotobuf-dev protobuf-compiler
apt install -y libeigen3-dev

wget --output-document cv.zip https://github.com/opencv/opencv/archive/4.0.1.zip
wget --output-document contrib.zip 
https://github.com/opencv/opencv_contrib/archive/4.0.1.zip
unzip cv.zip
unzip contrib.zip
cd opencv-4.0.1
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
  -D CMAKE_INSTALL_PREFIX=/usr/local \
  -D WITH_TBB=ON \
  -D WITH_V4L=ON \
  -D WITH_QT=ON \
  -D WITH_OPENGL=ON \
  -D WITH_CUDA=ON \
  -D WITH_NVCUVID=OFF \
  -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.0.1/modules \
  -D OPENCV_ENABLE_NONFREE=ON \
  ..

make -j 'number of gpu'
make install 
ldconfig
ln -s /usr/local/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so /usr/local/lib/python3.6/dist-packages/cv2/python-3.6/cv2.so

Это работает для меня!