2016. 7. 2.
2016. 8.26. Pathの設定方法を一部訂正
石立 喬

OpenCV3.1.0とVisual C++ 2015による画像処理と認識(1)

――― OpenCV3.1.0をダウンロードしてVisual Studio Community 2015で使う -----

 OpenCV3.1.0が2015年12月に公開され、Visual Studio 2015で使用できるようになったので、OSもWindows10に改めて、最新の環境でOpenCVを試すことにした。内容的には、「OpenCVとVisual C++による画像処理と認識」とほぼ同じとし、変更点に重点を置いて解説する。変更のない部分は解説を省略する場合があるので、対応する旧バージョンの資料を参照されたい。

OpenCV3.1.0とは
 OpenCVはオープンソースのComputer Vision用ライブラリで、その名の通り、画像処理用と言うよりは画像認識、画像理解用である。バージョン2には、OpenCV2.4.13.0まであり、機能が強化されたバージョン3は、OpenCV3.0が2015年6月に、OpenCV3.1.0が2015年12月に公開されている。
◎バージョン2からバージョン3への主な変更点(ライブラリモジュール)
 ・ライブラリモジュールがmainとextraに分けられた
 ・従来あったgnuの代わりに、CUDA関連のモジュールが多数追加された。
 ・nonfree、contrib、legacy、oclが、opencv_contribにまとめられた。
 ・extra(拡張)モジュールとして
   face ------- Face Recognition
   latentsvm --- Latent SVM
   reg -------- Image Registration
   text ------- Scene Text Detection and Recognituin
 など、具体的な応用を目的とした多数のモジュールが追加された
◎バージョン3.0からバージョン3.1.0への主な変更点(ライブラリモジュール)
 extraモジュールとして、
   dnn -------- Deep Neural Network
   fuzzy ------ Fuzzy Mathematics Image Processing
   sfm ------- Structure from Motion
 などが追加され、latentsvm がなくなった。

OpenCV3.1.0のダウンロード
 OpenCVのダウンロードについては、多くのサイトで紹介されているので、詳細は述べない。
1)http://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.1.0/opencv_3.1.0.exeをダウンロードする。
2)保存先は、C:\Program Files とする(デフォルトでは「ダウンロード」)。ただし、権限の都合などでそれ以外でも良いし、後から移し替えることもできる。
3)ダウンロードが終了すると自己解凍のウインドウが開くので、展開先を確認して「Extract」をクリックする。

Pathの設定
 これについても、多くの資料で紹介されているので、簡単な記述にとどめる。
1)「コントロールパネル」→「システムとセキュリティ」→「システム」と順次選択する。
2)左欄の「システムの詳細設定」をクリックする。
3)「システムのプロパティ」ウィンドウの「詳細設定」タブで、右下の「環境変数」をクリックする。
4)「環境変数」ウィンドウで、下部の「システム環境変数」をスクロールして変数「Path」を選択してから、「編集」をクリックする。
5)「環境変数名の編集」ウィンドウが開くので、右上の「新規」をクリックして、
   C:\Program Files\opencv\build\x64\vc14\bin
を追加し、「OK」をクリックする。「x64」は64ビットを意味し、「x86」の32ビット用がなくなった。「vc14」は、Visual Studio 2015を意味する。
 追加し終わった「環境変数名の編集」ウィンドウを図1に示す。


図1 PATHを設定し終わった「環境変数名の編集」ウィンドウ


Visual Studio Community 2015側の設定
◎Win32コンソールアプリケーションを作成する
1)Visual Studioを立ち上げ、「新しいプロジェクト」をクリックする。
2)「新しいプロジェクト」ウインドウで、
     左欄 --- Visual C++
     右欄 --- Win32コンソールアプリケーション
     名前 --- OpenCVApplication1(一例)
 として「OK」をクリックする。
◎プロパティマネージャーを表示させ、そこから各種設定を始める。
 Visual Studioのメニューから、「表示」→「その他のウィンドウ」→「プロパティマネージャー」をクリックする。図2は画面の右上方に表示されたプロパティマネージャーを示す。


図2 プロパティマネージャー


1)「Microsoft.Cpp..x64.userプロパティページ」ウィンドウを開く
 プロパティマネージャーのプロジェクト名「OpenCVApplication1(一例)」を展開し、「Debug | x64」→「Microsoft.Cpp.x64.user」と選択してダブルクリックすると、「Microsoft.Cpp.x64.userプロパティページ」ウィンドウが開く。このウィンドウは、「Release | x64」からも開くことができ、Debug構成とRelease構成に共通に使用できる(どちらか一方で設定しておけばよい)。
2)追加するインクルードファイルの場所を指定する
 「Microsoft.Cpp.x64.userプロパティページ」ウィンドウで、左欄で「共通プロパティ」→「C/C++」→「全般」を選択し、右欄で「追加のインクルードディレクトリ」を選択して、右側の「v」→「<編集...>」をクリックして図3に示す「追加のインクルードディレクトリ」ウインドウを開き、下記を入力して「OK」をクリックする。
     C:\Program Files\opencv\build\include
 この状態を図3に示す。


図3 「追加のインクルードディレクトリ」ウィンドウで、includeファイルの場所を指定する


3)そうすると、図4に示すように設定されるので、「OK」をクリックする。


図4 「OK」をクリックするとインクルードファイルの場所が設定される


4)追加するライブラリの場所を指定する
 「Microsoft.Cpp.x64.userプロパティページ」ウィンドウで、
   左欄で「共通プロパティ」→「リンカ」→「全般」を選択し、右欄で「追加のライブラリディレクトリ」を選択して、「v」→「<編集...>」をクリックして開いた図5に示すウィンドウで下記を入力して、「OK」をクリックする。
     C:\Program Files\opencv\x64\vc14\lib


図5 「追加のライブラリディレクトリ」ウィンドウで、ライブラリの場所を指定する


5)図6に示すように設定されるので、「OK」をクリックする。


図6 「OK」をクリックすると、追加のライブラリの場所が設定される


6)追加するライブラリの名称を指定する
 「Microsoft.Cpp.x64.userプロパティページ」ウィンドウで、左欄で「共通プロパティ」→「リンカ」→「入力」を選択し、右欄で「追加の依存ファイル」を選択し、右側の「v」をクリックし、さらに,<編集...>をクリックすると、図7に示す「追加の依存ファイル」ウィンドウが開くので、図のように入力して、「OK」をクリックする(下方の「継承の値:」はそのまま)。
 opencv_world310.libはRelease構成用、opencv_world310d.libはDebug構成用である。


図7 使用したいライブラリ名を選択して登録する


7)図8のように設定されるので、「OK」をクリックする。


図8 「OK」をクリックすると使用したいライブラリ名が登録される


初めてのOpenCV3.1.0プログラム
 初めてのプログラムは、やはり「Hello World!」からと言うことと、市販のOpenCV本ではOpenCV添付のレナ嬢(lena.jpg)を使うことが多いので、それに従う。
 lena.jpgは、
    ..../opencv/sources/samples/data/lena.jpg
にあり(従来のsamples/cpp/lena.jpgから変わった)、これを
    .../Visual Studio 2015/Projects/OpenCVApplication1/OpenCVApplication1/lena.jpg
にコピーしておく。
 図9はプログラムの内容で、これを参照しながら、以下に順次説明する。
◎インクルードファイルと名前空間の指定
 "stdafx.h"は自動的に設定されたもので、これはそのままにしておく。OpenCV3.1.0のインクルードファイルは、総合的なopencv2/opencv.hppのみで良い。参考までに確認したところによると、下記の個別ファイルで代用できた。
   opencv2/highgui/highgui.hpp -------- imread、imshow関数に必要
   opencv2/imgproc/imgproc.hpp ------- putText関数用
 使用する関数の多くは、名前空間cvに属しているので、これを宣言しておく。
◎画像の読み込み
 画像の読み込みには、関数imreadを使う。引数には、画像ファイル名の他に、カラーで読み込む(3チャンネル)かグレイスケール(1チャンネル)で読み込むかなどのフラグがある。ただし、デフォルトではIMREAD_COLOR = 1 なので、一般にはファイル名のみで良い。使用できるフラグの一部を参考までに以下に示す。「 = 0」などで示した整数値は、代わりに使用できることを意味する。
   IMREAD_GRAYSCALE = 0
   IMREAD_COLOR = 1 ------ デフォルト
◎画像の上に文字を描く
 関数putTextを使用する。引数には、文字を上書きしたい画像ファイル名、描きたい文字列、画像上の位置、文字のフォント(デフォルト設定はない)、サイズ、色、太さ(デフォルトは1)、近傍ピクセルの連結方法がある。最後に、もう一つデフォルトでfalseの引数があり、これをtrueにすると文字が上下逆転するが、一般には使用しない。
 画像のフォントには、
   FONT_HERSHEY_SIMPLEX = 0
   FONT_HERSHEY_PLAIN = 1
などがあり、ピクセルの連結方法には、
   LINE_4 = 4 --------- 4近傍連結
   LINE_8 = 8 --------- 8近傍連結、デフォルト
   LINE_AA = 16 ------- アンチエリアス
などがある。
 日本語が使えるフォントが無いのが残念である。
 色は、Scalar(b, g, r)で表す。RGBの順序が逆であるので要注意。
◎画像表示用のウィンドウを準備する
 関数namedWindowを使用する。引数はウィンドウの名称(同時にウィンドウのタイトル名でもある)とフラグで、フラグには、
   WINDOW_NORMAL = 0
   WINDOW_AUTOSIZE = 1 ------ デフォルト
などがある。NORMALの場合には、ウィンドウを最大化すると、それに従って画像も拡大されるが、AUTOSIZEの場合には、画像のサイズは変わらない。
◎ウィンドウに画像を表示する
 関数imshowを使用する。引数は、表示するウィンドウの名称(namedWindowで付けたもの)と画像名である。
◎キー入力を待って、全てのウィンドウを閉じ、プログラムの実行を終了する。
 キー入力待ちには、関数waitKeyを使用する。引数は、キー入力後の待ち時間であるが、一般には0で良い。そして、開いているすべてのウィンドウを、destroyAllWindows()で閉じる。destroyAllWindowsは、無くても良さそうであるが、多数のウィンドウを用いた場合には、役に立つことがある。


図9 作成したプログラム


得られた結果
 図10はプログラムの実行結果である。


図10 得られた結果


結論
 旧バージョンで行った方法に倣って、OpenCV3.1.0をダウンロードし、Visual Studioの環境設定を行なった。今回は、Debug構成のみでなく、Release構成でも使えるようにし、それぞれ動作を確認した。
 ライブラリが一本化されて、opencv_world310(d).libになり、プログラム上でも、 #include <opencv2/opencv.hpp> のみで済むようになったのは有難い。
 ライブラリモジュールがmainとextraに分かれ、extra(拡張)モジュールにface、text、dnn、sfmなどがあって、具体的な応用に対応し易くなった。ただし、これらの拡張モジュールを導入するには、CMakeなどの手を借りる必要がありそうである。




「Visual C++の勉強部屋」(目次)へ