2012/11/10

OpenCVでHelloWorld

前提条件

Visual C++とOpenCVがインストールされている。

対象とする人

ググってやってみたけどよくわかんない人
ライブラリを設定するのが面倒な人

やること

Visual C++、OpenCVが正しく動くか調べる。

やる

1. Visual C++を起動。

ちなみにOpenCVは起動するもんじゃないよ。


2. プロジェクトの作成

新しい空のプロジェクトを作る。
「新しいプロジェクト」
「Win32コンソールアプリケーション」
「空のプロジェクト」
詳しくはググれ。

3. C++だけで動かす

C++だけで動かないならOpenCVも動かない。やばい。
まず、main.cppというファイルを追加して、
int main() {
  return 1192;
}
とか書いて実行してみる。
これだと実行プログラム(コンソールウィンドウが表示される)は速攻閉じちゃうけど、
出力ウィンドウに「コード1192で終了しました。」と出ればいいんじゃない。

4. インクルードディレクトリの指定

OpenCVを使おう。
まずインクルードフォルダを指定する。
構成プロパティ
→ C/C++(これはプロジェクトにC/C++プログラムを含まないと表示されない!)
→ 追加のインクルードディレクトリ
これにOpenCVのincludeディレクトリを指定する。
これは君がOpenCVをインストールした場所によるのだが、
OpenCV2.2なら
C:\OpenCV2.2\include
だし、
OpenCV2.4なら
C:\opencv\build\include
とかそんな感じだろう。

5. あとはソースコードに書いちゃえ

こうやってGUIでぽちぽち設定するのは面倒なので、
残りの設定はソースコード内に書く。

main.cppの上の方に書き足す。(ちなみに普通は別のヘッダファイルに書くんだよ)
OpenCV2.2でデバッグモードだったら
#include "opencv2\\opencv.hpp"
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220d.lib")
OpenCV2.4.2でデバッグモードで
32bitプログラムを作るつもりでVisual C++ 2010を使うのだったら
#include "opencv2\\opencv.hpp"
#pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core242d.lib")
#pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc242d.lib")
#pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui242d.lib")
#pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect242d.lib")
※「\」が「\\」となっていることにすごーく注意してほしい。



指定するファイルを理解した方がいい。
各一行目のインクルード文では、4.で指定したインクルードディレクトリ内の
opencv2\opencv.hpp
をインクルードしている。
この中身ではOpenCVの本体(分割されている)をさらに呼んでいる。

次からの行はライブラリの入力だ。
まずOpenCV2.2。
これはデバッグモードとリリースモードで読み込むライブラリが異なるだけだ。
末尾にdがつくものがデバッグモード用。
つかないものがリリースモード用だ。
このなんとかモードというのはVisual C++で上指定するもので、OpenCVに限った話ではない。
デバッグモードはデバッグするとき用で、処理は遅い。
リリースモードは速いがデバッグには向かない。
上記の参考サイトでは
#ifdef _DEBUG
によってデバッグモードかどうかを調べている。

次にOpenCV2.4。指定するライブラリは
opencv\\build\\【32bitか64bitか】\\【vc9かvc10か】\\lib\\opencv_*24【バージョン】【デバッグモードかリリースモードか】.lib
となっている。
  • 【32bitか64bitか】とりあえず64bitパソコンの君も32bitプログラムを作ってみよう。だからbuild\\x86を指定しよう。
  • 【vc9かvc10か】vc9とはVisual C++ 2008のことで、vc10とはVisual C++ 2010のこと。
  • 【バージョン】2.4.2なら24のあとは2だ。
  • 【デバッグモードかリリースモードか】OpenCV2.2と同じ。末尾のdの有無がかわる。
このライブラリは機能(関数)ごとに分かれている。
機械学習ならopencv_mlだし、動画の入出力にはopencv_videoが必要だ。
ライブラリが足りないと動かないし、サンプコードを載せているサイトにもそういう記述は少ない。
新しいことをやるときにどのライブラリが必要か確かめた方がいい。

僕はopenCV2.4.2をC:\OpenCV2.4にインストールした。
以下のように指定している。
#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_core242d.lib")            // opencv_core
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_imgproc242d.lib")        // opencv_imgproc
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_highgui242d.lib")        // opencv_highgui
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_objdetect242d.lib")    // opencv_objdetect
//以下、必要に応じて追加
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_ml242d.lib")            // opencv_ml
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_features2d242d.lib")    // opencv_features2d
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_video242d.lib")        // opencv_video
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_calib3d242d.lib")        // opencv_calib3d
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_flann242d.lib")        // opencv_flann
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_contrib242d.lib")        // opencv_contrib
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_legacy242d.lib")        // opencv_legacy
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_gpu242d.lib")            // opencv_gpu
#else
//Releaseモードの場合
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_core242.lib") 
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_imgproc242.lib")
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_highgui242.lib")
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_objdetect242.lib")
//以下、必要に応じて追加
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_ml242.lib")
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_features2d242.lib")
#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_video242.lib")
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_calib3d242.lib")
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_flann242.lib")
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_contrib242.lib")
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_legacy242.lib")
//#pragma comment(lib,"C:\\OpenCV2.4\\build\\x86\\vc10\\lib\\opencv_gpu242.lib")
#endif

6. 実行してミスれ

さて、ここまでやったのでなんか動きそうな気がする。main関数を拡張しよう。

using namespace cv;
int main() {
  // たぶんここに女の人(レナさん)の画像がある。開いて確認してみよう。
  Mat image = imread("C:\\opencv\\samples\\cpp\\lena.jpg");
  // 表示用のウィンドウをつくる。
  cvNamedWindow("gori");
  // 画像をウィンドウに表示する。
  imshow("gori", image);
  // なにかキーが入力されるまで待つ
  waitKey(0);

  // キーが入力されると、この行にたどり着き、終了
  return 0;
}

もうお分かりの通り、OpenCV2.2ならばlena.jpgの位置は
"C:\\OpenCV2.2\\samples\\cpp\\lena.jpg"
となるだろう。
ここではミスを避けるために絶対パスで指定している。
「\\」は2個重ねる!!

PATHをいじった人:

ほかのサイトを参考にして、すでにPATHをいじった人は、レナの画像が表示されるだろう。
大成功だ。感謝しなさい。

PATHをいじってない人:

プログラムを実行すれば、ライブラリが足りないといわれるだろう。
libファイルは確かに指定した。
しかしライブラリの本体はdllというもので、プログラム実行時に参照される。
OpenCV2.2なら
C\OpenCV2.2\lib
2.4だと上でlibを指定した要領で
C\opencv\build\x86\vc10\bin
とかにある。

Windowsはdllを探す。
このときに環境変数のPATHに指定したディレクトリも探す。
だからPATHに上のディレクトリを追加する。
環境変数のいじりかたはググれ。


HelloWorldは?

ググれ。

0 件のコメント:

Related Posts Plugin for WordPress, Blogger...