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

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の様々な機能を活用したプログラムを実装できます。

関連記事