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