OpenCV 2.1 をコンパイルしてUbuntuにインストールしましたので、メモを残しておきます。なお、Ubuntuの場合、通常はパッケージがあるのでそれをインストールするほうが楽だと思います(理由は最後に載せておきます)。
OS:Ubuntu 10.04 デスクトップ 日本語Remix版
1.コンパイルに必要なパッケージのダウンロード
Ubuntu用のマニュアルインストールの解説にしたがって作業をします。まずは、以下のパッケージをインストールします。
sudo apt-get install build-essential sudo apt-get install cmake
実はコンパイルだけならこれでも問題なかったのですが、これだとサンプルプログラムを作ってウィンドウを表示すると落ちます。
たぶん、画像処理ライブラリとしては使えるけど、GUI関係が使えないという状態です。
そこで、実用的にするために、gtk周りのパッケージとOpenCV Wikiのこのページを参考にffmpeg関係のライブラリのパッケージも入れておきます。
sudo apt-get install libgtk2.0-dev sudo apt-get install libavformat-dev libavcodec-dev libavfilter-dev libswscale-dev
ffmpeg関係のパッケージを一緒に入れたのはあまり深い意味はありません。
もし、その他に必要なパッケージがあれば、インストールしておきます。
2.OpenCV 2.1のソースコードをダウンロード
ソースコードをダウンロードしたら、適当な作業ディレクトリに解凍します。
ダウンロードしたファイルが、~/tmp にあり、~/work 以下に解凍するものとします。
cd ~/work mkdir opencv cd opencv mv ~/tmp/OpenCV-2.1.0.tar.bz2 . tar xjf OpenCV-2.1.0.tar.bz2
3.ライブラリコンパイル用のディレクトリを作成
ライブラリコンパイル用のディレクトリを作成します。release用とdebug用を作りたいので、それぞれrelease, debugという名前のディレクトリを作成しておきます。
mkdir release debug
4.CMakeによりMakefileを作成
まず、release用の作業です。今回は、
cd release cmake -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_PYTHON_SUPPORT=ON ../OpenCV-2.1.0
としました。
CMakeを実行すると、現在の環境を調べて、どのようにコンパイルするかという情報が表示されます。分量がちょっと多いですが参考までに、今回の環境で得られたものを下記に示しておきます。
-- Detected version of GNU GCC: 44 (404) -- checking for module 'gstreamer-base-0.10' -- package 'gstreamer-base-0.10' not found -- checking for module 'gstreamer-app-0.10' -- package 'gstreamer-app-0.10' not found -- checking for module 'gstreamer-video-0.10' -- package 'gstreamer-video-0.10' not found -- checking for module 'libdc1394-2' -- package 'libdc1394-2' not found -- checking for module 'libdc1394' -- package 'libdc1394' not found -- checking for module 'libv4l1' -- package 'libv4l1' not found -- Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR) -- Could NOT find Jasper (missing: JASPER_LIBRARY JASPER_INCLUDE_DIR) -- Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) -- Use INCLUDE: /usr/lib/python2.6/dist-packages/numpy/core/include -- IPP detected: -- Parsing 'cvconfig.h.cmake' running mkdir -p "/home/mor/work/opencv/release/unix-install/" 2>&1 -- -- General configuration for opencv 2.1.0 ===================================== -- -- Built as dynamic libs?: ON -- Compiler: -- C++ flags (Release): -Wall -pthread -march=i686 -ffunction-sections -O3 -DNDEBUG -fomit-frame-pointer -O3 -ffast-math -msse -msse2 -mfpmath=387 -DNDEBUG -- C++ flags (Debug): -Wall -pthread -march=i686 -ffunction-sections -g -O0 -DDEBUG -D_DEBUG -- Linker flags (Release): -- Linker flags (Debug): -- -- GUI: -- GTK+ 2.x: 1 -- GThread: 1 -- -- Image I/O: -- JPEG: TRUE -- PNG: TRUE -- TIFF: build -- JPEG 2000: build -- -- Video I/O: -- DC1394 1.x: 0 -- DC1394 2.x: 0 -- FFMPEG: 1 -- codec: 1 -- format: 1 -- util: 1 -- swscale: 1 -- gentoo-style: 1 -- GStreamer: 0 -- UniCap: FALSE -- PvAPI: -- V4L/V4L2: 1/1 -- Xine: FALSE -- -- Interfaces: -- Old Python: 0 -- Python: ON -- Python interpreter: /usr/bin/python2.6 -- Python numpy: 1 -- Use IPP: NO -- Use TBB: NO -- Build Documentation 0 -- -- Install path: /usr/local -- -- cvconfig.h is in: /home/mor/work/opencv/release -- ----------------------------------------------------------------- -- -- Configuring done -- Generating done -- Build files have been written to: /home/mor/work/opencv/release
debug版も同様ですが、CMakeに与えるオプションでDEBUGを指定します。
cd debug cmake -D CMAKE_BUILD_TYPE=DEBUG -D BUILD_PYTHON_SUPPORT=ON ../OpenCV-2.1.0
5. makeの実行とインストール
release版、debug版ともに、makeを行います。
make -j 2
release版の場合だけ、インストールします。
sudo make install sudo ldconfig
これでOpenCVが使えるようになります。
今回はdebug版はmake installせずに、debugディレクトリに置いたまま使用することにしました。
6.サンプルプログラムの実行
引数に与えた画像を表示するサンプルプログラムを試してみます。
#include <cv.h> #include <highgui.h> #include <iostream> void usage() { } int main(int argc, char *argv[]) { if (2 != argc) { usage(); throw std::exception(); } const std::string fn = argv[1]; IplImage *p_img = cvLoadImage(fn.c_str(), CV_LOAD_IMAGE_COLOR); cvNamedWindow("test", CV_WINDOW_AUTOSIZE); cvShowImage("test", p_img); cvWaitKey(0); // closing cvReleaseImage(&p_img); }これを、main.cppという名前で保存しておきます。
release版のライブラリを使いコンパイルする場合は、
g++ -Wall -I/usr/local/include/opencv -lcxcore -lcv -lcvaux -lml -lhighgui main.cpp
とします。
debug版を使いたいときは、作成したライブラリを直接使用するようにします。
たとえば、今回は環境変数でコントロールしました。
export LD_LIBRARY_PATH=/home/mor/work/opencv/debug/lib:$LD_LIBRARY_PATH g++ -g -O0 -Wall -I/home/mor/work/opencv/OpenCV-2.1.0/include/opencv -L/home/mor/work/opencv/debug/lib -lcxcore -lcv -lcvaux -lml -lhighgui main.cpp
とした後、 実行すればデバッグ版のライブラリを使ってコンパイル・実行ができます。
ライブラリの使い分け方はご自分の環境に合わせて工夫してみてください。
なお、ある環境である実行ファイルがどのライブラリを使うのかを見るには、ldd コマンドを使うと便利です。上記の2つの方法でコンパイルしたものを比較すると、OpenCV関係のライブラリが切り替わっていることがわかります。
おまけ:コンパイルした理由
Ubuntuの場合は、OpenCVがパッケージで提供されているので通常はそれを使うほうがよいと思います。
Synapticを起動してopencvで検索すると、2.0ベースのものがあります。
また、2.1ベースのパッケージを作成して公開している方もいます(OpenCV wikiのこちらのページに説明があります)。
ただ、私の環境では、OpenCV2.1のパッケージを試したところ、Webカメラからの動画像を取得するサンプルで、なぜかうまくカメラに接続できませんでした。そのため、今回のようにコンパイルをしたのですが、カメラを交換しているという事情もあり、ライブラリだけの問題かどうかまでは絞れてません。
また、実際に動作させながらライブラリ内の処理を追いかけていくとなるとデバッグ版のライブラリがあると便利だということも、ソースコードからライブラリをコンパイルした理由のひとつです。