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//[bin|doc|examples] とのことなので、
展開して出来た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経由で呼び出すための準備が整いました。

疲れた・・・。

整理するとこの程度の手順だけど、
ライブラリのバージョン違いによるエラーとか、英語ドキュメントと格闘して原因調査しながらの試行錯誤がかなり大変でした。。。

もっとインストールが簡単になってほしいですね(^^;)