OpenCV2.1のコンパイル

ソースからの再コンパイル

OpenCVの本家で提供されているWindows用のインストーラで開発していて問題が出てきたら、ソースからOpenCVのライブラリを自分でコンパイルしなしたくなる。たとえば、デバックでOpenCVのライブラリ内までステップインしていきたいけど、Windowsインストーラ(OpenCV-2.1.0-win32-vs2008.exe)で入れたものではパス等の環境が合っていないとステップインでデバグできない、とか。TBBやIPPの機能を使いたい、とか。

OpenCV2.1のソースをダウンロードしてくる。もしくは、SVNのレポジトリからとって来る

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/

からOpenCV-2.1.0-win.zipをダウンロードする。

OpenCV-2.1-Readme.txtにコンパイルの手順の概要が書かれているので、これも一読。

解凍すると OpenCV-2.1.0 のディレクトリが作られる。

C:\OpenCV-2.1.0

に移動しておく。


 

Cmakeを使った再コンパイル、インストールの手順の大筋(Readmeに原本あるので一読)

1.CMakeダウンロード、インストール

http://www.cmake.org/cmake/resources/software.html

には、Linux, Win 用のソースがおいてある。インストーラーもWin,Mac,Linuxとそろっている。Win版の(cmake-2.8.3-win32-x86.exe)をとってくる。
インストーラーを実行。途中の選択で、Pathにcmakeを追加するように指定。デフォルトは、「追加しない」になっている。インストール先はどこでもいい。

1. Download CMake from http://www.cmake.org/cmake/resources/software.html
   and install it.

 

2 CMake を使ってMakeファイル(VS2008用ならソリューションファイル)を作る

cmake(gui)を起動。

where is the source code: C:\OpenCV-2.1.0

where to build the binaries: C:\OpenCV-2.1.0\build (build は初期では存在しないが、勝手に作られる。)

を設定して、Configureを押す。

specify the generator for this project

に、「Visual Studio 9 2008」を指定して、「Finish」押す。

makefileのパラメータ設定は必要に応じて。「configure」を押す。問題なければ、赤字がなくなる。

python 2.6, 2.7をOpenCVはサポートしている。python 3系列は未定らしい。python をあらかじめインストールしておくと、cmake-guiが見つけて設定してくれる。

「Generate」を押してVS2008用のソリューションファイル(名句ファイル)生成させる。

before:

after:

 

3.VS2008を使って、コンパイルする

OpenCV.sln を実行。

ビルド −> バッチビルド で「ALLBUILD」,「INSTALL」を選択して、ビルド。

 

たまたま、Pythonをインストールしてあったので、ビルドで問題が起きた。

pythonがデバック版でないと、こんなメッセージ出してコンパイル失敗する。

CMake Error at interfaces/python/cmake_install.cmake:41 (FILE):
  file INSTALL cannot find "C:/OpenCV-2.1.0/build/lib/Debug/cv.pyd".
Call Stack (most recent call first):
  interfaces/cmake_install.cmake:33 (INCLUDE)
  cmake_install.cmake:38 (INCLUDE)
Project : error PRJ0019: ツールはエラー コードを返しました : "ビルド後のイベントを実行しています..."

 

とりあえずPython使ってなかったのでアンインストールしてから、cmakeを実行しなおす。

python path の箇所が、「/registry」になる。 

 

 

4.コンパイルしたDLLを環境変数(PATH)に設定

C:\OpenCV-2.1.0\build\bin\Release

C:\OpenCV-2.1.0\build\bin\Debug;

C:\OpenCV-2.1.0\build\bin

を追加。

確認のため、サンプルを動かしてみる。

C:\OpenCV-2.1.0\samples\c に実行形式のファイルがいくつかある。DLLが見つかれないと、エラーでて実行できない。


 

 

5.VS2008で開発するために必要な設定をする。

VisualStudio2008起動して、ツール −> オプション −> プロジェクトおよびソリューションのVC++ディレクトリの設定箇所。

include ディレクトリの設定

C:\OpenCV-2.1.0\build\include\opencv

lib ディレクトリの設定

C:\OpenCV-2.1.0\build\lib

これで、ビルドしても、リンクエラーが出なくなる。

ML(Machine Learning :機会学習)用のサンプルデータベース(人物、車)

歩行者(人の全身)、車の画像認識の機械学習のトレーニングデータセット。顔認識のデータベースは後ほど調査予定

 

人物(全身)用

Daimler Pedestrian Classification Benchmark Dataset

歩行者検出用に人の全身を切り出したサンプルデータがある。歩行者を単身で抜き出したサンプルで、ほぼ、人をバウンディングボックスで囲った領域で切り出していあり、非常に精度よく集められてたサンプル。「人全身写真×4800枚+人でない写真×5000枚」 のセットが5セット用意されている。画像サイズは18ピクセル×36ピクセルに統一されている。画像形式がPGMという一般的ではないものなので利用時は注意。

http://www.gavrila.net/Research/Pedestrian_Detection/Daimler_Pedestrian_Benchmark_D/Daimler_Pedestrian_Class__Benc/daimler_pedestrian_class__benc.html

USC Pedestrian Detection Test Set

人の全身を含む写真のサンプル。人の場所を示したXMLファイル(groundtruth)が添付されている。人を囲う左上の座標と、囲う箱のサイズ(x、Y)で表記したもの。サンプルは、A,B,Cの3セット用意されている。Aは205枚の写真に313人、Bは54枚の写真に271人、Cは100枚の写真に232人となっている。

http://iris.usc.edu/Vision-Users/OldUsers/bowu/DatasetWebpage/dataset.html

MIT CBCL Pedestrian Database(Center for Biological and Computational Learning) 歩行者用

人の全身写真(歩行者)の、切り出しされているもの。PPMフォーマット。924枚の写真。

http://cbcl.mit.edu/cbcl/software-datasets/PedestrianData.html

 

車用

UIUC Image Database for Car Detection

自動車の側面の写真のデータベース。車載カメラから見た他の車の自動認識の訓練データとしてはふさわしくない。対象(自動車)は切り出されてPGMファイルとして集められている。サンプル数は、トレーニング用の正例画像が500、誤例画像が550。その他に、テスト用に自動車が風景にある写真が170枚+108枚。

http://l2r.cs.uiuc.edu/~cogcomp/Data/Car/

MIT CBCL Car Database(Center for Biological and Computational Learning) 車用

車の正面と背面のデータベース。正面や背面から少しずれた視点からの写真も含まれている。車を切り出した写真になっているが、切り出しが少し甘めになっている。用途としては、車載カメラからの他の車の映像に近いものが多く含まれる。画像データはPPMフォーマット

http://cbcl.mit.edu/cbcl/software-datasets/CarData.html

CMU Testing Images for Car Detection (@Object Recognition Using Statistical Modeling Project)

車を撮影した写真としては、撮影アングルが多彩。道路沿いの歩道から撮影された感じの写真が多い。駐車場や路上の監視用途の認識システムの学習データに向いている。写真は切り抜かれていない。正解情報が別ファイルで与えられている。画像データはPGMフォーマット

http://vasc.ri.cmu.edu/idb/html/car/index.html

カルフォルニア工科大学(Caltech)のもの

顔や車だけでなく、飛行機、バイク、葉っぱ、といったものデータベースも含む。しかし、認識対象の切り出し画像でもなければ、正解位置をしめしたデータ(Groundtruth)もない。あまり親切なデータベースではない。

http://www.vision.caltech.edu/html-files/archive.html

日系Linux11月号 OpenCVでAndroid上のARアプリケーション作る記事の件

連載7回目で11月号で最終となる、ARアプリケーションのアルゴリズム の巻きでは、Androidを搭載した開発ボード(BeagleBoard)で画像認識(ジェスチャー認識)してリモコンをつくる開発工程を解説している。

ここで手の形状を認識するのに、肌色認識としてHSVのH(色相)をつかって手抽出してから、HoG(Histgram of Oriented Gradients)を使っている。HoGのヒストグラムを、グー、チョキ、パーのテンプレートのHogを直接距離を計算して近ければそれと判定する方法をとっている。

こんな認識フローもあるんだ、と。Hog作るときは、肌色抽出などしないで、グレー画像から作るのが一般的かと思っていた。肌色抽出後だと、うまく肌色抜ければ制度が出るだろうが、HoGは輪郭形状にシビアだと思われるので、肌色抽出が失敗すると痛いことになりそうだが、どうなんだろう。

あと、特徴量のHoGを直接、グー、チョキ、パーのテンプレートのHogと距離を計算するのもアリなのだなぁ。ここに機械学習を使わないのもシンプル。

VS2008(VisualStudio2008)デフォルトのプロジェクトディレクトリ構造

ソースのルートがどこに設定されているか、しばしば迷うのでメモ

マイドキュメント

  - Projects

       - created_project_name

             - Debug (ここにDebugの実行exe)

             - Release(ここにReleaseの実行exe)

             - created_project_name(ここにcpp source がおかれ、ルートになる。exeが参照する画像などのデータのルートディレクトリはここ)

                    - Debug

                    - Release

openCV2.1のインストール

opencv の2.1がリリースされた(2010.4)

openCVの本家でもインストールの解説があるのでここを参考にした。

http://opencv.jp/opencv2-x-tips/install-on-windowswindows32bit-64bit-visual-studio-opencv21

 

opencv2.1インストール手順

OpenCV2.1のインストールには大きく2種類あって、

1.インストーラでお手軽にインストール

2.インテルのTBB(Threading Building Blocks)を利用するために、ライブラリを自分でコンパイルする。

がある。インテルのマルチコアをつかっていて、並列計算で速度をあげてみたい向きには2番がよい。とりあえず、OpenCVで遊んでみたい向きには1で十分だろう。

TBB(Threading Building Blocks)の解説

http://www.threadingbuildingblocks.org/file.php?fid=77

 

ここではお手軽インストールをしてみる。

WIN用のインストーラが、 OpenCV-2.1.0-win32-vs2008.exe なので、これをダウンロードして実行。

http://sourceforge.net/projects/opencvlibrary/files/

VisualStudio2008 の環境で使うと相性がよさそう。無料のExpress EditionでとりあえずOKなので、あらかじめインストールしておく。

OpenCV2.1のインストーラは特にインストーラの指示にしたがって進めるだけ。

・デフォルトのインストールディレクトリは、C:\OpenCV2.1\

環境変数のPATHに追加してもOKとこたえると、C:\OpenCV2.1\bin(ここにはOpenCVのDLLがある。) がPATHに追加される。

くらいを確認しておく。

 

動作確認をするため、インストールされたサンプルプログラムを実行してみる。サンプルは、C:\OpenCV2.1\samples\c に入っている。上記の環境変数PATHが設定されていれば、動作する。USBカメラがないと動かないサンプルもあるので注意。

たとえば、OpenCVを使った顔認識のサンプル(facedetect.exe)はUSBカメラが必要なので、USBカメラをつないで動作させてみる。ー>お、動いた。ちゃんと顔を認識して○してくれる。

VS2008(visual studio 2008 express edition)で動作確認

静的ライブラリのフォルダの設定と、インクルードファイルのフォルダの設定をする。

1. VS2008を起動して、ツール −> オプション −>プロジェクトおよびソリューション −>VC++ディレクトリ −> インクルードファイル 

で、C:\OpenCV2.1\include\opencv

 

2. VS2008を起動して、ツール −> オプション −>プロジェクトおよびソリューション −>VC++ディレクトリ −>ライブラリファイル

C:\OpenCV2.1\lib

を新規に追加する。

 

プロジェクトで依存するライブラリ(lib)を設定する。

プロジェクト −> プロパティイ −> 構成プロパティ −> リンカ −> 入力 

で追加の依存ファイルに、cv210d.lib cvaux210d.lib cxcore210d.lib cxts210.lib highgui210d.lib ml210d.lib opencv_ffmpeg210d.lib 

を設定する。これは 「構成」がDebugの時。

「構成」がRelease の時は cv210.lib cvaux210.lib cxcore210.lib cxts210.lib highgui210.lib ml210.lib opencv_ffmpeg210.lib

のように各libから d をとる。

cxts210.libだけは、debug, release 両方で同じlibになる。

コンピュータビジョン最先端ガイドの人物検出サンプルプログラムを動かしてみる

概要

コンピュータビジョン(CV)の本を買った。サンプルを動かしてみる。

環境

  • VC++2008 ExpressEdition
  • OpenCV1.0 は別途インストールする必要がある。

用意するもの

sample code

コンピュータビジョン最先端ガイドの出版元HPからサンプルコードをダウンロード (opluse.shop-pro.jp/?pid=21043524) ObjectDetection.zip です。

画像データ

車に乗せるカメラで人を検出するという応用目的で、人の画像と人でない画像を集めた画像データベースがある。このデータベースを使って人を検出するプログラムの有効性を評価しようというもの。

ダイムラークライスラー社の関係と思われる画像データベースが、Daimler Pedestrian Classification Benchmark Dataset。

http://www.gavrila.net/Research/Pedestrian_Detection/Daimler_Pedestrian_Benchmark_D/Daimler_Pedestrian_Class__Benc/daimler_pedestrian_class__benc.html

ここから、DC-ped-dataset_base.tar.gz をダウンロードする。ほかにも DC-ped-dataset_add-1.tar.gz などあるが、このサンプルプログラムを動かすだけなら必要ない。

解凍すると画像ファイルが沢山できるが、形式がPGM という一般人にはあまりなじみのないもの。http://vision.kuee.kyoto-u.ac.jp/lecture/dsp/?menu=sample_pnm

を参考にしてViewerをダウンロードしておく。

手順の補足メモ

ダウンロードしたものにインストラクションが書いてあるので、アルゴリズムが判っていれば、インストラクションに沿ってやれば多分できる。が、とりあえず動かしてみたい、アルゴリズムの中身はおいておいて、という人向けにメモを残しておく。

まず、人の画像と、人でない画像をプログラムにわからせます。学習、と呼ばれるプロセスです。学習した結果を使って、未知の画像を人の画像、そうでないかを判定して、プログラムの良し悪しを評価します。これは識別(評価、テスト)と言われます。これを、アダブーストと呼ばれる機械学習手法を使ってやってみます。

学習

まず学習。学習をするプログラム(プロジェクト)は、\ObjectDetection\training にあるtraining.sln です。ここに入っている学習機(Adaboost)に人の画像と、人でない画像のリストを渡します。リストは、ObjectDetection\data\list\training_list の中に入れます。人の画像リストは、poslist.txt. 人でない画像のリストはneglist.txtというファイルに入れます。

リストの作り方。まず、すでにダウンロードしたダイムラークライスラーの画像データベース(DC-ped-dataset_add-1.tar.gz)を解凍する。すると、DC-ped-dataset_base の下に、 1,2,3,T1,T2というディレクトリができる。それぞれにディレクトリには、人の画像4800枚、人でない画像5000枚がある。

ディレクトリ T1に移って下記のコマンドを入力します.

dir ped_examples /b /s > poslist.txt

dir non-ped_examples /b /s > neglist.txt

これでT1の人画像がposlist.txtに、人でない画像がneglist.txtに書き出される。

この操作を他の 1,2,3,T2 のディレクトについてもやって、画像リストを作っておくとよい。あとで識別(テスト)するときに使う。

手始めに、T1のサンプルを学習に使うことにして、T1のディレクトリのposlist.txt neglist.txt を\ObjectDetection\data\list\training_list に入れます。

\ObjectDetection\training にあるtraining.sln をビルドして実行すると学習が始まります。小一時間結構待ちます。

終了すると、識別器は/ObjectDetection/data/training_data/classifier.txt, 確率密度関数は/ObjectDetection/data/training_data/pdf/に出されます。RealAdaboostと呼ばれる学習アルゴリズムを使っています。両者の意味はアルゴリズムを勉強しないと意味不明だと思います。

認識

上で学習した結果を使って、未知の画像を認識してみます。識別のプログラムはObjectDetection\testing にあります。

識別器の能力を計ります。機械なので間違えますのでその能力を2つの指標で評価します。

一つ目は、人とわかっている画像を入力して、識別器が人と判定する割合と、人と判定できなかった割合を調べます。これはmiss rate と呼ばれます。人の画像を見せて、すべて人と認識したら、ミスは0%です。少なければ優秀な機械です。

もうひとつは、人でない画像を入力して、人を間違って判定してしまう割合を調べます。false positive といいます。間違って、人だ、と言ってしまう割合です。もちろん、少ないほうが優秀な機械です。

この評価をするために、再び人の画像リストと、人でない画像のリストをつくります。学習の時は、T1の画像を使ったので、そのほかの画像、たとえば 1 の画像を使うなら、1 のフォルダにさっき作った poslist.txt と neglist.txt を \ObjectDetection\data\list\testing_list にコピーします。これで1の人画像がposlist.txtで、人でない画像がneglist.txtで指定されます。

認識するには、ObjectDetection\testing\testing.sln をビルドして実行すればよいのだが、実行する前に結果の出力先output.txtを確認する。

\ObjectDetection\data\testing_data というディレクトリをあらかじめ作っておかないと、output.txtが作られない。ソースを見ればすぐわかるのだが、ダウンロードしたものを解凍しただけだと、testing_dataなるフォルダがなく、結果出力を見ることができないので注意。

おまけ

imageMagick なにやらいろいろ使えそう。

PerlMagick for activestate perl , ImageMagickObject OLE control for VBscript, WSH とある。

http://www.imagemagick.org/script/command-line-tools.php

opencvのインストール(opencv1.0)

Visual C++ 2008 Express Edition を使って無料で環境を作る。openCVは既に1.1,2.0, 2.1と版を重ねているが、Webでダウンロードできる過去の研究のサンプルコードは、昔(Opencvが1.0のころ)に作られ、動作確認されているので、アルゴリズムの確認のためにはいまだにopencv1.0の環境を作っておく必要がある。ので、やってみたメモを残す。

材料をそろえる

OpenCV1.0

http://opencv.jp/

で、OpenCV_1.0.exe をダウンロード

Visual C++

visual studio 2008 express で検索。場所は時折変わる。

インストール

vstudio 2008

  1. visual studio 2008 express のインストーラーを起動(isoイメージをダウンロードして、仮想CDドライブなどを使うと便利 バーチャルクローンドライブhttp://www.slysoft.com/ja/virtual-clonedrive.html など)
  2. VisualC++2008ExpressEditionのみを選択してインストールしておけばよい。デフォルトの選択でインストール開始。

openCV 1.0

  1. ダウンロードしたOpenCV_1.0.exeを実行。
  2. 環境変数PATHへの設定は自動にさせる。
  3. Visual studioにOpencvのヘッダーファイルとライブラリの場所を設定する。VisualC++を起動する。メニューの「ツール」−「オプション」を選択する。ダイアログで、「プロジェクトおよびソリューション」ー「VC++ディレクトリ」ツリーを展開する。右ペインで、「ディレクトリを表示するプロジェクト」の選択ボックスを「インクルードファイル」にする。
  4. 以下の4つのディレクトリを追加する。C:\Program Files\OpenCV\otherlibs\highgui、C:\Program Files\OpenCV\cxcore\include、C:\Program Files\OpenCV\cvaux\include、C:\Program Files\OpenCV\cv\include

  5. さらに、右ペインで、「ディレクトリを表示するプロジェクト」の選択ボックスを「ライブラリ ファイル」にして、C:\Program Files\OpenCV\lib を追加する。OKを押して完了。

テスト動作で確認

opencvを使ったたくさんのサンプルコードが、c:\Program Files\OpenCV\samples\c (デフォルトのインストール時)にある。

動作確認として、demhist.c(同じDirにあるbaboon.jpgも使うので一緒にコピー)を使ってみる。

  1. vc++を起動。
  2. 新規のプロジェクトを作成。Win32コンソールアプリケーションを選択。「空のプロジェクトを作成」にチェック 。ここではimagetestとした。
  3. プロジェクトの静的ライブラリの設定をする。VC++のメニューの プロジェクト − imagetestのプロパティ 。

    プロパティのページで「構成プロパティ」−「リンカ」−「入力」を選択して、「追加の依存ファイル」の欄に、「highgui.lib cv.lib cxcore.lib」を追記する。demhist.cを実行するにはこの3つのlibだけでよいが、ほかのサンプルコードを実行するときは必要なものを入れる。選ぶのが面倒なら、追加の手間は面倒ではあるが、全部入れてしまうのもよい(cvcam.lib highgui.lib cxts.lib cv.lib cxcore.lib ml.lib cvaux.lib cvhaartraining.libで全て)

  4. プロジェクトにソースファイルを追加。ここでは、imagetest.cpp としておいた。この追加したソースファイルに、demhist.cのコードをまるまるコピーして、ビルドする。プログラムが参照する画像ファイル(baboon.jpg)も忘れないでソースと同じディレクトリにコピーしておくこと。正常にビルドされるとこんな感じでビルドが完了する。


  5. VC++のメニューから 「デバッグ」−「デバッグ開始」を選択して実行。インストール直後に実行すると「highgui100.dllが見つからなかったため、このアプリケーションを開始できませんでした。」と、コンポーネントが見つかりませんとエラーを返されるが、設定が反映されてないだけなので、システムを再起動すると次回からは動くようになる。
  6. ビルドの際、「imagetest.obj : error LNK2001: 外部シンボル "_cvSet" は未解決です。」などの、ビルドエラーがたくさん出たら、上記3のリンカの設定が間違っている。よくやるミスは、Debug と Release の設定をそれぞれしないといけないのに、片方を設定し忘れる。


補足

文字コードの警告が出る。解決する方法

c:\program files\opencv\cv\include\cvcompat.h(784) : warning C4819:
ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。
データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
この警告で指摘されているcvcompat.hをVC++で開いて、ちょこっと変更かけて保存しなおすと警告が出なくなる。