2014.11.26.
2015. 1.23. 「追加のインクルードファイル」→「追加のインクルードディレクトリ」
石立 喬
OpenCVとVisual C++による画像処理と認識(1)
――― OpenCVをダウンロードしてVisual Studio で使う -----
今まで、Visual C++を用いた画像処理について解説してきたが、「それがどう役に立つのか?」の疑問が湧いてくる。画像を色反転しても、グレイ化しても、ぼかしても、そんな用途がどこにあるのかの空しさがある。最近のデジカメにネガはないし、写真をぼかして見たいとも思わない。
一方、画像認識や画像理解は、防犯用監視カメラやクルマの運転補助、銀行ATMなどに広く使われていて、必要性が納得できる。実は、これらの前処理に画像処理が使われているのである。
そこで、画像認識などに連携させて画像処理を見直し、さらに、画像認識にまで踏み込んだ内容にしたいと思う。
画像認識では、OpenCVライブラリが著名なので、これをWindows8.1とVisual
Studio Express 2013の環境を用いて、C++言語で利用する。OpenCVに関しては、多数の書籍とWebサイトが内外にあり、これらを有難く参考にさせて頂く(あまり多くて、どれが原典か分かりにくく、個々の資料に対する出典の表示と謝辞は省略)。
OpenCVとは
オープンソースのComputer Vision用ライブラリで、その名の通り、画像処理用と言うよりは画像認識、画像理解用である。便利な画像処理用ライブラリも多く含まれるが、従来説明してきた細かくコード化したものに比べて、自由度は低い。多くの書籍・資料があるので、詳細は、それらを参照されたい。
OpenCVのダウンロード
OpenCVのダウンロードについても、多くのサイトで紹介されているので、詳細は述べない。最新バージョン(2014.11.30現在)は2.4.10
で、Windows用をダウンロードする。
1)ダウンロード元は、http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.10
で、ここからopencv-2.4.10.exeをダウンロードする。
2)保存先は、C:\Program Files とする。ただし、権限の都合などでそれ以外でも良いし、後から移し替えることもできる。
3)ダウンロードが終了すると自己解凍のウインドウが開くので、展開先を確認して「Extract」をクリックする。
Pathの設定
これについても、多くの資料で紹介されているので、簡単な記述にとどめる。
1)「コントロールパネル」→「システムとセキュリティ」→「システム」と順次選択する。
2)左欄の「システムの詳細設定」をクリックする。
3)「システムのプロパティ」ウィンドウの「詳細設定」タブで、右下の「環境変数」をクリックする。
4)「システム変数」ウィンドウで、スクロールして変数「Path」を選択してから、「編集」をクリックする。
5)「システム変数の編集」ウィンドウが開くので、
;C:Program Files\opencv\build\x86\vc12\bin
を追加し、「OK」をクリックする。「x86」は32ビットを意味し、Win32コンソールアプリケーションで使用するので、これを選ぶ。「vc12」は、Visual
Studio 2013を意味する。
Visual Studio Express 2013側の設定
◎何かのWin32コンソールアプリケーション(空で良い)を作成する
1)Visual Studioを立ち上げ、「新しいプロジェクト」をクリックする。
2)「新しいプロジェクト」ウインドウで、
左欄 --- Visual C++
右欄 --- Win32コンソールアプリケーション
名前 --- OpenCVApplication1(一例)
として「OK」をクリックする。
◎プロパティマネージャーを表示させ、そこから各種設定を始める。
Visual Studioのメニューから、「表示」→「その他のウィンドウ」→「プロパティマネージャー」をクリックする。図1は画面の右上方に表示されたプロパティマネージャーを示す。
図1 プロパティマネージャー
◎「Microsoft.Cpp.Win32.userプロパティページ」ウィンドウを開く
プロパティマネージャーのプロジェクト名「OpenCVApplication1(一例)」を展開し、「Debug
| Win32」→「Microsoft.Cpp.Win32.user」と選択してダブルクリックすると、「Microsoft.Cpp.Win32.userプロパティページ」ウィンドウが開く。
◎追加するインクルードファイルの場所を指定する
1)「Microsoft.Cpp.Win32.userプロパティページ」ウィンドウで、
左欄で「共通プロパティ」→「C/C++」→「全般」を選択し、右欄で「追加のインクルードディレクトリ」を選択して、右側の「v」→「<編集...>」をクリックして「追加のインクルードディレクトリ」ウインドウを開き、下記を入力して「OK」をクリックする。
C:\Program Files\opencv\build\include
この状態を図2に示す。
図2 インクルードディレクトリ入力用のウィンドウ
2)そうすると、図3に示すように設定されるので、「OK」をクリックする。
図3 「OK」をクリックするとインクルードファイルの場所が設定される
◎追加するライブラリの場所を指定する
1)「Microsoft.Cpp.Win32.userプロパティページ」ウィンドウで、
左欄で「共通プロパティ」→「リンカ」→「全般」を選択し、右欄で「追加のライブラリディレクトリ」を選択して、「v」→「<編集...>」をクリックして開いたウィンドウで下記を入力して、「OK」をクリックする。
C:\Program Files\opencv\x86\vc12\lib
2)図4に示すように設定されるので、「OK」をクリックする。
図4 「OK」をクリックすると、追加のライブラリの場所が設定される
◎追加するライブラリの名称を指定する
1)「Microsoft.Cpp.Win32.userプロパティページ」ウィンドウで、
左欄で「共通プロパティ」→「リンカ」→「入力」を選択し、右欄で「追加の依存ファイル」を選択し、右側の「v」をクリックし、さらに,<編集...>をクリックすると、図5に示す「追加の依存ファイル」ウィンドウが開くので、図のように入力して、「OK」をクリックする(下方の「継承の値:」はそのまま)。
ライブラリは、モジュール別になっていて、一番上に記述したライブラリは、coreモジュールのバージョン2.4.10で、デバッグ用を示すdが付いている。この他にも多くのモジュールがあるが、当面必要なものに限定してある。
図5 使用したいライブラリ名を選択して登録する
2)図6のように設定されるので、「OK」をクリックする。
図6 「OK」をくりっくすると使用したいライブラリが登録される
初めてのOpenCVプログラム
初めてのプログラムは、やはり「Hello World!」からと言うことと、市販のOpenCV本ではOpenCV添付のレナ嬢(lena.jpg)を使うことが多いので、それに従う。
lena.jpgは、
..../opencv/sources/samples/cpp/lena.jpg
その他にあり、これを
.../Visual Studio 2013/Projects/OpenCVApplication1/OpenCVApplication1/lena.jpg
にコピーしておく。
図7はプログラムの内容で、これを参照しながら、以下に順次説明する。
cvやCV_で始まる関数や構造体、定数は、バージョン2.4.10から無くなり、これらは、非推奨で、使用できても動作がおかしいことがある。古い資料を参照するときは注意が必要である。
◎インクルードファイルなど
"stdafx.h"は自動的に設定されたもので、これはそのままにしておく。OpenCVのインクルードファイルは、ここではhighguiモジュールを使用するだけで良いので、最低限の設定にしてある。これで、画像の読み込み、表示、ウィンドウの生成、破棄ができる。
使用する関数の多くは、名前空間cvに属しているので、これを宣言しておく。
◎画像の読み込み
画像の読み込みには、関数imreadを使う。引数には、画像ファイル名の他に、カラーで読み込む(3チャンネル)かグレイスケール(1チャンネル)で読み込むかなどのフラグがある。ただし、デフォルトではIMREAD_COLOR
= 1 なので、一般にはファイル名のみで良い。使用できるフラグを参考までに以下に示す。「
= -1」などで示した整数値は、代わりに使用できることを意味する。
IMREAD_UNCHANGED = -1
IMREAD_GRAYSCALE = 0
IMREAD_COLOR = 1 ------ デフォルト
IMREAD_ANYDEPTH = 2
IMREAD_ANYCOLOR = 4
画像として読み込んだimage1がMatクラスであることについては、OpenCVの基本的な約束であるので、次項以降で詳述する。
◎画像の上から文字を描く
関数putTextを使用する。引数には、上書きしたい画像ファイル名、描きたい文字列、画像上の位置、文字のフォント(デフォルト設定はない)、サイズ、色、太さ(デフォルトは1)、近傍ピクセルの連結方法がある。最後に、もう一つデフォルトでfalseの引数があり、これをtrueにすると文字が上下逆転するが、一般には使用しない。
画像のフォントには、
FONT_HERSHEY_SIMPLEX = 0
FONT_HERSHEY_PLAIN = 1
FONT_HERSHEY_DUPLEX = 2
FONT_HERSHEY_COMPLEX = 3
FONT_HERSHEY_TRIPLEX = 4
FONT_HERSHEY_COMPLEX_SMALL = 5
があり、ピクセルの連結方法には、
4 ----------- 4近傍連結
8 ----------- 8近傍連結 -------- デフォルト
CV_AA = 16 -- アンチエリアス
がある。
日本語が使えるフォントが無いのが残念である。
色は、Scalar(b, g, r)で表す。RGBの順序が逆であるので要注意。
◎画像表示用のウィンドウを準備する
関数namedWindowを使用する。引数はウィンドウの名称(同時にウィンドウのタイトル名でもある)とフラグで、フラグは、
WINDOW_NORMAL = 0
WINDOW_AUTOSIZE = 1 ------ デフォルト
WINDOW_OPENGL = 4096
がある。NORMALの場合には、ウィンドウを最大化すると、それに従って画像も拡大されるが、AUTOSIZEの場合には、画像のサイズは変わらない。OPENGLは、OpenGLで使える。
◎ウィンドウに画像を表示する
関数imshowを使用する。引数は、表示するウィンドウの名称(namedWindowで付けたもの)と画像名である。
◎キー入力を待って、全てのウィンドウを閉じ、プログラムの実行を終了する。
キー入力待ちには、関数waitKeyを使用する。引数は、キー入力後の待ち時間であるが、一般には0で良い。そして、開いているすべてのウィンドウを、destroyAllWindows()で閉じる。destroyAllWindowsは、無くても良さそうであるが、多数のウィンドウを用いた場合には、役に立つことがある。
図7 作成したプログラム
得られた結果
図8はプログラムの実行結果で、lena.jpgのサイズが大きい(512 x 512)のには驚いた。
図8 得られた結果