サイトアイコン CV & Technologies

C++でOpenCVを使ったコードを動かすためのDockerfile

C++でOpenCVを使ったコードを動かすためのDockerfileです。Python関係のインストールはしません。

Dockerfile

#Dockerfile
FROM ubuntu:16.04

RUN apt-get update && apt-get install -y --no-install-recommends \
    wget git cmake nano libeigen3-dev libgtk-3-dev qt5-default freeglut3-dev libvtk6-qt-dev libtbb-dev \
    libjpeg-dev libjasper-dev libpng++-dev libtiff-dev libopenexr-dev libwebp-dev \
    libhdf5-dev libopenblas-dev liblapacke-dev \
    && rm -rf /var/lib/apt/lists/*

COPY opencv-3.2.0.tar.gz .
RUN tar xfvz opencv-3.2.0.tar.gz
COPY opencv3.2_build-ubuntu16.04.sh /opencv-3.2.0/
RUN cd opencv-3.2.0 && chmod 777 opencv3.2_build-ubuntu16.04.sh && ./opencv3.2_build-ubuntu16.04.sh && cd build && make -j4
RUN cd opencv-3.2.0/build && make install && ldconfig

イメージのビルド

OpenCVのソースコードを先にダウンロードしてDockerfileと同じディレクトリに入れておきます。異なるバージョン、ファイル名の場合はDockerfileを適宜書き換えてください。また、ビルドオプションはopencv3.2_build-ubuntu16.04.shを参考にしましたが、Python用のバインディングはビルドしないように変更しています。opencv3.2_build-ubuntu16.04.sh

ls
------------------------------
Dockerfile          opencv3.2_build-ubuntu16.04.sh
opencv-3.2.0.tar.gz
------------------------------
docker build -t opencv .
------------------------------
Successfully tagged opencv:latest
------------------------------

起動とOpenCVコードのコンパイル

起動
docker run -it opencv:latest /bin/bash
コード
//test.cpp
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>

int main(int argc, const char* argv[])
{
  system("wget http://www.cellstat.net/wp-content/uploads/2016/10/sample.jpg");
  cv::Mat src = cv::imread("sample.jpg", cv::IMREAD_COLOR);
  cv::imwrite("output.jpg", src);
  return 0;
}
コンパイルと実行
g++ test.cpp -o test.out `pkg-config --cflags opencv` `pkg-config --libs opencv`

./test.out

Dockerのファイル掃除

いろいろ試行錯誤しているうちに余計なファイルが溜まるので、その削除方法です。

docker rm $(docker ps -aq) #すべてのコンテナを削除
docker images | awk '/<none/{print $3}' | xargs docker rmi #タグがnoneになっているimageを削除
モバイルバージョンを終了