LinuxでOpenCVを入れて適当なコードをコンパイルするまで

* Fedora 20でのインストールについて新たに書きました
* 最新の(Mavericks) MacでOpenCVをインストールして使うやりかたについて新たに書きました.
OpenCVのインストール

sudo apt-get install libcv-dev libhighgui-dev libml-dev libcvaux-dev
sudo apt-get install opencv-doc

まずC++でOpenCVを使ったコード(main.cpp)を書きます.例えばこんな感じ.引数で渡した画像2枚の差の大きさを求めるプログラムです.

#include
#include
#include
int main(int argc, char *argv[]){
    cv::Mat img1=cv::imread(argv[1]);
    cv::Mat img2=cv::imread(argv[2]);
    std::cout << cv::norm(img1-img2) << std::endl;
}

これをコンパイルするときには,(1)cv.hなどのOpenCVのヘッダファイルが何処にあるのかの指定と,(2)libcvなどのOpenCVのライブラリが何処にあるのかの指定が必要です.これらを勝手にリストアップしてくれるのがpkg-configというコマンド.
まず,(1)のヘッダファイルについては

pkg-config --cflags opencv

を実行することでリストアップできます.僕の環境では

-I/opt/local/include/opencv

となりました.次に,(2)のライブラリについても同様に

pkg-config --libs opencv

を実行することでリストアップできます.僕の環境では

-L/opt/local/lib -lml -lcvaux -lhighgui -lcv -lcxcore

となりました.これをg++に引数としてソースコードと一緒に渡してやればコンパイル出来ますです.

g++ -o main main.cpp -I/usr/include/opencv -L/usr/lib/opencv -lcv -lhighgui

ここで,pkg-configの結果を直接g++に渡したいものです.そこで登場するのが`(バッククオート).コマンドを`で囲むと,その部分が,そのコマンドを実行した結果に置き換わります.つまり

g++ -o main main.cpp `pkg-config --cflag opencv` `pkg-config --libs opencv`

と書けばOK.
毎回こんな長いコマンドを打つのはやってられないので,Makefileに

main: main.cpp
     g++ -o main main.cpp `pkg-config --cflag opencv` `pkg-config --libs opencv`

と書いてやれば,makeコマンド一発でコンパイル出来ます.もうちょっと洗練して

main: main.o
     g++ -o $@ $< `pkg-config --libs opencv`
.cpp.o:
     g++ -o $@ -c $< `pkg-config --cflags opencv`

とかくとなおよし.


「LinuxでOpenCVを入れて適当なコードをコンパイルするまで」への4件のフィードバック

  1. Makefileについて、知ったかでしたが、すごくやさしい説明でやっと理解できました。
    ありがとうございます。

    返信

コメントする