OpenCV3をさくらのレンタルサーバでビルドする

コーディングはWindows+VisualStudioやMacintosh+Xcode等のデスクトップ(GUI)環境に慣れている方が多いかと思いますが、Webサービスの一部としてOpenCVを使いたい場合、バックエンドはWindowsではなくLinuxの場合が少なくありません。そこで、Linuxを使用したレンタルサーバ上でOpenCV3をビルドする手順を解説します。

さくらインターネット社が提供する『さくらのレンタルサーバ』は、(執筆時点で)スタンダードプラン以上ならSSHでのシェルログインに対応しており、OpenCV3のビルドも可能です。ここでは、スタンダードプランを『cv123.sakura.ne.jp』というアカウントで契約したものとして進めます。(以降、cv123の部分は実際に契約したアカウントに合わせて読み替えてください。)

なお、共有タイプのレンタルサーバは複数のユーザーとCPUやメモリ等のリソースを共有していますので、極端に負荷のかかる処理は避けましょう(アカウントを停止される場合もあります。)。高負荷な処理は専有サーバ等を契約して行うようにましょう。

CMakeとOpenCVのインストール

まずは契約したレンタルサーバへSSH接続でシェルログインします。(さくらのレンタルサーバにおけるSSH接続手順は公式サイトで解説されています。)

ホームディレクトリ( /home/cv123/ )配下に作業用のディレクトリを用意します。ここでは /home/cv123/local/src とします。
作成したディレクトリへ移り、CMakeのソースコードをダウンロード、展開、make、インストールします。
※CMakeのソースコードのURLはダウンロードページから確認ください。(執筆時点の最新版は3.2.2のため、以下は3.2.2の場合の例です。)

mkdir -p ~/local/src
cd ~/local/src
wget http://www.cmake.org/files/v3.2/cmake-3.2.2.tar.gz
tar xvf cmake-3.2.2.tar.gz
cd cmake-3.2.2
./bootstrap --prefix=~/local
make
make install

正常に完了するとcmakeが作業ディレクトリ内へインストールされます。

/home/cv123/local/bin/cmake

続いてOpenCVのソースコードをダウンロードし、展開してccmakeでビルドオプションを設定します。
※OpenCVのソースコードのURLもダウンロードページで確認できます。(執筆時点の最新版は3.0RC1のため、以下は3.0RC1の場合の例です。)

cd ~/local/src
wget https://github.com/Itseez/opencv/archive/3.0.0-rc1.zip
unzip 3.0.0-rc1.zip
cd opencv-3.0.0-rc1
ccmake ~/local/bin/ccmake ~/local/src/opencv-3.0.0-rc1

Continue(cキー)で各オプションが表示されたら、パスや用途に応じて変更し、Configure(cキー)し、Generate(gキー)します。
以下で赤色に変えた部分がパスに関するものと、初期設定から変えた部分です。

ANT_EXECUTABLE                   ANT_EXECUTABLE-NOTFOUND
BUILD_CUDA_STUBS                 OFF
BUILD_DOCS                       OFF
BUILD_EXAMPLES                   OFF
BUILD_JASPER                     OFF
BUILD_JPEG                       OFF
BUILD_OPENEXR                    OFF
BUILD_PACKAGE                    ON
BUILD_PERF_TESTS                 ON
BUILD_PNG                        OFF
BUILD_SHARED_LIBS                ON
BUILD_TBB                        OFF
BUILD_TESTS                      ON
BUILD_TIFF                       OFF
BUILD_WITH_DEBUG_INFO            ON
BUILD_WITH_DYNAMIC_IPP           OFF
BUILD_ZLIB                       OFF
BUILD_opencv_apps                ON
BUILD_opencv_calib3d             ON
BUILD_opencv_core                ON
BUILD_opencv_features2d          ON
BUILD_opencv_flann               ON
BUILD_opencv_hal                 ON
BUILD_opencv_highgui             ON
BUILD_opencv_imgcodecs           ON
BUILD_opencv_imgproc             ON
BUILD_opencv_ml                  ON
BUILD_opencv_objdetect           ON
BUILD_opencv_photo               ON
BUILD_opencv_shape               ON
BUILD_opencv_stitching           ON
BUILD_opencv_superres            ON
BUILD_opencv_ts                  ON
BUILD_opencv_video               ON
BUILD_opencv_videoio             ON
BUILD_opencv_videostab           ON
BUILD_opencv_world               OFF
CLAMDBLAS_INCLUDE_DIR            CLAMDBLAS_INCLUDE_DIR-NOTFOUND
CLAMDBLAS_ROOT_DIR               CLAMDBLAS_ROOT_DIR-NOTFOUND
CLAMDFFT_INCLUDE_DIR             CLAMDFFT_INCLUDE_DIR-NOTFOUND
CLAMDFFT_ROOT_DIR                CLAMDFFT_ROOT_DIR-NOTFOUND
CMAKE_BUILD_TYPE                 Release
CMAKE_CONFIGURATION_TYPES        Debug;Release
CMAKE_INSTALL_PREFIX             /home/cv123/local
CUDA_BUILD_CUBIN                 OFF
CUDA_BUILD_EMULATION             OFF
CUDA_HOST_COMPILER               /usr/bin/cc
CUDA_SDK_ROOT_DIR                CUDA_SDK_ROOT_DIR-NOTFOUND
CUDA_SEPARABLE_COMPILATION       OFF
CUDA_TOOLKIT_ROOT_DIR            CUDA_TOOLKIT_ROOT_DIR-NOTFOUND
CUDA_VERBOSE_BUILD               OFF
EIGEN_INCLUDE_PATH               EIGEN_INCLUDE_PATH-NOTFOUND
ENABLE_AVX                       OFF
ENABLE_AVX2                      OFF
ENABLE_COVERAGE                  OFF
ENABLE_FAST_MATH                 OFF
ENABLE_FMA3                      OFF
ENABLE_IMPL_COLLECTION           OFF
ENABLE_NOISY_WARNINGS            OFF
ENABLE_OMIT_FRAME_POINTER        ON
ENABLE_POPCNT                    OFF
ENABLE_PRECOMPILED_HEADERS       ON
ENABLE_PROFILING                 OFF
ENABLE_SOLUTION_FOLDERS          OFF
ENABLE_SSE                       ON
ENABLE_SSE2                      ON
ENABLE_SSE3                      ON
ENABLE_SSE41                     OFF
ENABLE_SSE42                     OFF
ENABLE_SSSE3                     OFF
EXECUTABLE_OUTPUT_PATH           /home/cv123/local/bin/opencv/3.0.0-rc1/bin
GENERATE_ABI_DESCRIPTOR          OFF
GIGEAPI_INCLUDE_PATH             GIGEAPI_INCLUDE_PATH-NOTFOUND
GIGEAPI_LIBRARIES                GIGEAPI_LIBRARIES-NOTFOUND
INSTALL_CREATE_DISTRIB           OFF
INSTALL_C_EXAMPLES               OFF
INSTALL_PYTHON_EXAMPLES          OFF
INSTALL_TESTS                    OFF
INSTALL_TO_MANGLED_PATHS         OFF
OPENCV_CONFIG_FILE_INCLUDE_DIR   /home/cv123/local/src/opencv-3.0.0-rc1
OPENCV_EXTRA_MODULES_PATH
OPENCV_WARNINGS_ARE_ERRORS       OFF
OPENEXR_INCLUDE_PATH             OPENEXR_INCLUDE_PATH-NOTFOUND
PVAPI_INCLUDE_PATH               PVAPI_INCLUDE_PATH-NOTFOUND
PYTHON2_EXECUTABLE               /usr/local/bin/python2.7
PYTHON2_INCLUDE_DIR              /usr/local/include/python2.7
PYTHON2_INCLUDE_DIR2     
PYTHON2_LIBRARY                  /usr/local/lib/libpython2.7.so
PYTHON2_LIBRARY_DEBUG    
PYTHON2_NUMPY_INCLUDE_DIRS
PYTHON2_PACKAGES_PATH            lib/python2.7/site-packages
PYTHON3_EXECUTABLE       
PYTHON3_INCLUDE_DIR      
PYTHON3_INCLUDE_DIR2     
PYTHON3_LIBRARY          
PYTHON3_LIBRARY_DEBUG    
PYTHON3_NUMPY_INCLUDE_DIRS
PYTHON3_PACKAGES_PATH    
VTK_DIR                          VTK_DIR-NOTFOUND
WEBP_INCLUDE_DIR                 WEBP_INCLUDE_DIR-NOTFOUND
WITH_1394                        OFF
WITH_CLP                         OFF
WITH_CUBLAS                      OFF
WITH_CUDA                        ON
WITH_CUFFT                       ON
WITH_EIGEN                       ON
WITH_FFMPEG                      ON
WITH_GDAL                        OFF
WITH_GIGEAPI                     ON
WITH_GSTREAMER                   ON
WITH_GSTREAMER_0_10              OFF
WITH_GTK                         ON
WITH_GTK_2_X                     OFF
WITH_IPP                         ON
WITH_IPP_A                       OFF
WITH_JASPER                      ON
WITH_JPEG                        ON
WITH_LIBV4L                      ON
WITH_NVCUVID                     OFF
WITH_OPENCL                      ON
WITH_OPENCLAMDBLAS               ON
WITH_OPENCLAMDFFT                ON
WITH_OPENCL_SVM                  OFF
WITH_OPENEXR                     ON
WITH_OPENGL                      OFF
WITH_OPENMP                      OFF
WITH_OPENNI                      OFF
WITH_OPENNI2                     OFF
WITH_PNG                         ON
WITH_PVAPI                       ON
WITH_QT                          OFF
WITH_TBB                         OFF
WITH_TIFF                        ON
WITH_UNICAP                      OFF
WITH_V4L                         ON
WITH_VTK                         ON
WITH_WEBP                        ON
WITH_XIMEA                       OFF
WITH_XINE                        OFF

Generateを終えたらmakeします。

make

make時、さくらのレンタルサーバ(スタンダード)+OpenCV 3.0RC1では以下のビルドエラーが出ましたので、それぞれソースコードを手修正します。

  • stray~関連

    /home/cv123/local/src/opencv-3.0.0-rc1/modules/imgproc/src/hough.cpp:1: error: stray '\357' in program
    hough.cppの1行目の先頭にUTF-8のBOMがありコンパイルに失敗するので、BOMを手動で削除
  • malloc.h関連

    In file included from /home/cv123/local/src/opencv-3.0.0-rc1/modules/imgcodecs/src/rgbe.cpp:47:
    /usr/include/malloc.h:3:2: error: #error "<malloc.h> has been replaced by <stdlib.h>"
    rgbe.cppの47行目のmalloc.hをstdlib.hに書き換える

エラーなくmakeを完了したらインストールします。

make insatll

正常にインストールできた場合、 EXECUTABLE_OUTPUT_PATH に指定したパスにopencvの各モジュールが生成されているはずです。

簡単なプログラムで動作を確認

設定が正常に行えているか、簡単なプログラムで確認します。
ここでは、ホームディレクトリ配下にサンプルプログラム(prj/cvt/src/cvt.cpp)を作成します。

mkdir -p ~/prj/cvt/src
cd ~/prj/cvt/src
vi cvt.cpp

cvt.cppに以下のように記述します。
※あらかじめテスト用の画像ファイルを ~/prj/cvt/source.png に配置してください。

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>

int main(int argc, const char* argv[])
{
  //読み込む画像と書き出す画像のパスを設定
  cv::String source_path = "~/prj/cvt/source.png";
  cv::String dest_path = "~/prj/cvt/dest.png";

  //画像の読み込み
  cv::Mat source = cv::imread(source_path, cv::IMREAD_UNCHANGED);

  //画像の書き出し
  cv::imwrite(dest_path, source);

  return 0;
}

コンパイルと実行にあたり、環境変数のパス設定を確認しておきます。

  • PKG_CONFIG_PATH

    printenv PKG_CONFIG_PATH

    OpenCVのライブラリパス内(~/local/lib/pkgconfig)が取得できれば変更不要ですが、設定がない場合は手動設定します。

    setenv PKG_CONFIG_PATH ~/local/lib/pkgconfig

    ※上記のsetenvは環境変数を差し替えますので、もともと設定されていた値がある場合は

    setenv PKG_CONFIG_PATH printenvで確認できた元の値:~/local/lib/pkgconfig

    のように:で区切って追記します。

  • LD_LIBRARY_PATH

    printenv LD_LIBRARY_PATH

    OpenCVのライブラリパス(~/local/lib)が取得できれば変更不要ですが、設定がない場合は手動設定します。

    setenv LD_LIBRARY_PATH ~/local/lib

    ※上記のsetenvは環境変数を差し替えますので、もともと設定されていた値がある場合は

    setenv LD_LIBRARY_PATH printenvで確認できた元の値:~/local/lib

    のように:で区切って追記します。

環境変数の準備ができたらコンパイルします。

g++ -v -o cvt.o cvt.cpp `pkg-config --cflags --libs opencv`

正常に参照できていれば cvt.o が生成されますので、実行してみます。

./cvt.o

dest_pathに設定したパス(~/prj/cvt/dest.png)へファイルが出力されれば正常です。

より複雑なプログラムの場合、Makefileを作成する等してコンパイルの手間軽減を考える必要があるかと思いますが、以上のようにインストールと設定を行うことで、OpenCVの様々な機能を活用したプログラムを実装できます。