OpenCV2.3.1をCentOS5.4にインストール
仕事でOpenCV 2.3.1をCentOS 5.4にインストールしたのですが、
えらい苦労をしたので、手順を整理しておきます。
JavaCV経由で使用したいので、そのための手順も含めています。
(参考)OpenCVの公式インストールガイドはこちら(英語)
http://opencv.willowgarage.com/wiki/InstallGuide
前提ライブラリ・ツールの導入
OpneCV 2.3.1をインストールするには、いくつか前提ライブラリが必要となります。
GCCのインストール
まず、コンパイラとしてGCC 4.3以降が必要です。
CentOS 5.4のデフォルトGCCは、バージョン4.1.2なので、バージョンアップする必要があります。
今回は、GCC、G++をバージョン4.4にバージョンアップします。
# yum -y install gcc44 gcc44-c++
これで以下にインストールされました。
# whereis gcc44 gcc44: /usr/bin/gcc44 # whereis g++ g++: /usr/bin/g++ /usr/share/man/man1/g++.1.gz
CMAKEのインストール
続いてcmakeをインストールします。ここではソースからインストールします。
# wget http://www.cmake.org/files/v2.8/cmake-2.8.6.tar.gz # tar xzf cmake-2.8.6.tar.gz # cd cmake-2.8.6
設定
/opt/cmake配下にインストールします。
# ./configure --prefix=/opt/cmake
ビルド
# make
インストール
# make install
コマンドを打ってインストール確認
# /opt/cmake/bin/cmake -version cmake version 2.8.6
(参考)
cmakeはRPMForgeからパッケージをダウンロードしてインストールする方法もあるようですが、現状のRPMForgeに登録されているバージョン(2.6-patch 4)を使うと、cmakeする際に、以下のようなエラーが発生します。
「CACHE」というプロパティが、cmakeバージョン2.8以降でないと使えないようです。
CMake Error at CMakeLists.txt:44 (set_property): set_property given invalid scope CACHE. Valid scopes are GLOBAL, DIRECTORY, TARGET, SOURCE, TEST.
TBBインストール
OpenCVは、2.1以降Intel Threading Building Blocks(TBB)を利用した並列化がサポートされています。
TBBを有効化しないと単一CPUしか使用してくれず、複数CPUあっても無駄になるので注意が必要です。
本家のドキュメントはこちら
http://threadingbuildingblocks.org/documentation.php
TBB Getting Started Guide
http://software.intel.com/sites/oss/pdfs/tbb_getting_started.pdf
TBBをダウンロードします。今回はTBB4.0 update1をインストールします。
# wget http://threadingbuildingblocks.org/uploads/77/177/4.0%20update%201/tbb40_20111003oss_lin.tgz
ダウンロードしたファイルを展開します。
# tar -xzf tbb40_20111003oss_lin.tgz
「TBB Getting Started Guide」を見ると、デフォルトのインストール場所は、
/opt/intel/tbb/
展開して出来たtbb40_20111003ossディレクトリを /opt/intel/tbb/tbb40_20111003oss 配下に移動します。
環境変数設定ファイルの編集
/opt/intel/tbb/tbb40_20111003oss/bin/tbbvars.sh を編集します。
自分の環境に合わせてプレースホルダーを書き換えます。
以下、今回の編集前後のdiff。
# diff tbbvars.sh tbbvars.sh.org 39c39 < echo cc3.4.3_libc2.3.4_kernel2.6.9 --- > echo SUBSTITUTE_INTEL64_ARCH_HERE 42c42 < export TBBROOT=/opt/intel/tbb/tbb40_20111003oss --- > export TBBROOT=SUBSTITUTE_INSTALL_DIR_HERE
編集後のtbbvars.sh
#!/bin/bash # # Copyright 2005-2011 Intel Corporation. All Rights Reserved. # # This file is part of Threading Building Blocks. # # Threading Building Blocks is free software; you can redistribute it # and/or modify it under the terms of the GNU General Public License # version 2 as published by the Free Software Foundation. # # Threading Building Blocks is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Threading Building Blocks; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # As a special exception, you may use this file as part of a free software # library without restriction. Specifically, if other files instantiate # templates or use macros or inline functions from this file, or you compile # this file and link it with other files to produce an executable, this # file does not by itself cause the resulting executable to be covered by # the GNU General Public License. This exception does not however # invalidate any other reasons why the executable file might be covered by # the GNU General Public License. get_ia32(){ echo SUBSTITUTE_IA32_ARCH_HERE } get_ia64(){ echo SUBSTITUTE_IA64_ARCH_HERE } get_intel64(){ echo cc3.4.3_libc2.3.4_kernel2.6.9 } export TBBROOT=/opt/intel/tbb/tbb40_20111003oss if [[ "$1" != "ia32" && "$1" != "intel64" && "$1" != "ia64" ]]; then echo "ERROR: Unknown switch '$1'. Accepted values: ia32, intel64, ia64" return 1; fi TBB_ARCH=$(get_$1) if [ -z "${LD_LIBRARY_PATH}" ] then LD_LIBRARY_PATH="$TBBROOT/lib/$1/$TBB_ARCH"; export LD_LIBRARY_PATH else LD_LIBRARY_PATH="$TBBROOT/lib/$1/$TBB_ARCH:${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH fi if [ -z "${LIBRARY_PATH}" ] then LIBRARY_PATH="$TBBROOT/lib/$1/$TBB_ARCH"; export LIBRARY_PATH else LIBRARY_PATH="$TBBROOT/lib/$1/$TBB_ARCH:${LIBRARY_PATH}"; export LIBRARY_PATH fi if [ -z "${CPATH}" ]; then CPATH="${TBBROOT}/include"; export CPATH else CPATH="${TBBROOT}/include:$CPATH"; export CPATH fi
OpenCVインストール
ダウンロード
OpenCVの最新版をダウンロードします。
# wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.3.1/OpenCV-2.3.1a.tar.bz2/download
ファイルの展開
# tar jxfv OpenCV-2.3.1a.tar.bz2
展開されたディレクトリを下記に移動させる
# mv OpenCV-2.3.1 /usr/local/src/
ディレクトリの作成
# cd /usr/local/src/OpenCV-2.3.1/ # mkdir release
ソリューションの作成
cmakeでソリューションを作成します。
# cd /usr/local/src/OpenCV-2.3.1/release/ # /opt/cmake/bin/cmake -D WITH_TBB=ON -D TBB_LIB_DIR=/opt/intel/tbb/tbb40_20111003oss/lib -D TBB_INCLUDE_DIR=/opt/intel/tbb/tbb40_20111003oss/include -D BUILD_EXAMPLES=YES -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv -D BUILD_NEW_PYTHON_SUPPORT=NO -D WITH_1394=OFF -D CMAKE_C_COMPILER=gcc44 -D CMAKE_CXX_COMPILER=g++44 ../
以下のような構成になります。
-- General configuration for opencv 2.3.1 ===================================== -- -- Built as dynamic libs?: YES -- Compiler: /usr/bin/g++44 -- C++ flags (Release): -Wall -Wno-long-long -pthread -ffunction-sections -O3 -DNDEBUG -fomit-frame-pointer -msse -msse2 -DNDEBUG -- C++ flags (Debug): -Wall -Wno-long-long -pthread -ffunction-sections -g -O0 -DDEBUG -D_DEBUG -ggdb3 -- Linker flags (Release): -- Linker flags (Debug): -- -- GUI: -- GTK+ 2.x: NO -- GThread: YES -- -- Media I/O: -- ZLib: YES -- JPEG: build -- PNG: build -- TIFF: build -- JPEG 2000: build -- OpenEXR: NO -- OpenNI: NO -- OpenNI PrimeSensor Modules: NO -- XIMEA: NO -- -- Video I/O: -- DC1394 1.x: NO -- DC1394 2.x: NO -- FFMPEG: NO -- codec: NO -- format: NO -- util: NO -- swscale: NO -- gentoo-style: NO -- GStreamer: NO -- UniCap: NO -- PvAPI: NO -- V4L/V4L2: / -- Xine: NO -- -- Other third-party libraries: -- Use IPP: NO -- Use TBB: YES -- Use ThreadingFramework: NO -- Use Cuda: NO -- Use Eigen: NO -- -- Interfaces: -- Python: NO -- Python interpreter: /usr/bin/python (ver ) -- Python numpy: NO (Python wrappers will not be generated) -- Java: NO -- -- Documentation: -- Sphinx: NO -- PdfLaTeX compiler: NO -- Build Documentation: NO -- -- Tests and samples: -- Tests: YES -- Examples: YES -- -- Install path: /usr/local/opencv -- -- cvconfig.h is in: /usr/local/src/OpenCV-2.3.1/release -- ----------------------------------------------------------------- -- -- Configuring done -- Generating done -- Build files have been written to: /usr/local/src/OpenCV-2.3.1/release
ビルド
前述の手順で作成したTBBの環境変数設定ファイルをsourceコマンドで読み込むことで、
OpenCVインストール時に必要となるTBBライブラリへの環境変数をセットします。
引数には環境ごとのアーキテクチャを選択します。
今回はintel64としています。
# cd /opt/intel/tbb/tbb40_20111003oss/bin/ # source tbbvars.sh intel64
確認
# echo $TBBROOT /opt/intel/tbb/tbb40_20111003oss
(参考)
上記の手順を忘れると、makeの実行時に以下のようなエラーが出ます。
/usr/bin/ld: cannot find -ltbb collect2: ld はステータス 1 で終了しました make[2]: *** [lib/libopencv_core.so.2.2.0] エラー 1 make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] エラー 2 make: *** [all] エラー 2
ビルドを実行します。
# cd /usr/local/src/OpenCV-2.3.1/release # make
インストール
# make install
ここまででOpenCVのインストールは完了です。
JavaCVから呼び出すために必要なこと
OpenCVを実行するユーザーの環境変数にOpenCVライブラリ、TBBライブラリへのパスを追加する必要があります。
今回は、以下のように実行ユーザーの${HOME}/.bashrcに追加しました。
# cat .bashrc export LD_LIBRARY_PATH=/usr/local/opencv/lib:/opt/intel/tbb/tbb40_20111003oss/lib/intel64/cc3.4.3_libc2.3.4_kernel2.6.9:$LD_LIBRARY_PATH
# source .bashrc # echo $LD_LIBRARY_PATH /usr/local/opencv/lib:/opt/intel/tbb/tbb40_20111003oss/lib/intel64/cc3.4.3_libc2.3.4_kernel2.6.9:/usr/local/opencv/lib:
以上で、OpenCVをJavaCV経由で呼び出すための準備が整いました。
疲れた・・・。
整理するとこの程度の手順だけど、
ライブラリのバージョン違いによるエラーとか、英語ドキュメントと格闘して原因調査しながらの試行錯誤がかなり大変でした。。。
もっとインストールが簡単になってほしいですね(^^;)