5月20日までの課題【OpenCVを使ってウィンドウに画像を表示させる】について
まだ、課題が終了していない人のために、課題の解説のページを作りました。
このページを参考にして、20日までに課題を完成させてください。
今回は配った資料を見てもわかる範囲の課題だと思いますので、そちらを参考にしてもらっても結構です。
まず、課題のプログラムを書く前にすることがあります。
(ここは資料には載っていません)
1、プロジェクトの新規作成
「Visual C++」(以下、「VC」)にOpenCVの設定をします。
VCで新規プロジェクトを作成。メニューの「ファイル」から「新規作成」→「プロジェクト」と選択し、「Win32 コンソール アプリケーション」のプロジェクトを作成して、適当なプロジェクト名をつける。
なお、プロジェクト作成の際、「追加のオプション」から「プリコンパイル済みヘッダー」のチェックボックスを外しておく。
参考
URL(
http://ameblo.jp/fujimonia)より。
これでプロジェクトの作成は完了です。
2、Visual C++のプロジェクトの設定
これについては、プロジェクトを作成するごとに設定することが必要です。
はるさんのブログを参考にして各自設定をしてください。
参考URL(
http://ameblo.jp/fujimonia)の"環境変数のPATHに以下を追加する。"の設定の次からになります。
"以上で設定は完了。"のところまで。
3、プログラムを書く。
今回配布した資料は、画像を読み込んで、読み込んだ画像をセピア変換して表示するプログラムの資料になります。今回の課題は、画像を読み込んで表示させるだけなので、その部分だけをプログラムに書きます。
3-1、まず、プログラム中に
"stdafx.h"
"highgui.h"
"cv.h"
"cxcore.h"
"stdio.h"
をインクルードします。
念のため・・・インクルードとはここでは、include<stdio.h>のようにプログラム中にかくということです。
3-2、画像の読み込み
OpenCVには
cvLoadImage( "画像のファイル名", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );
という関数があり、この関数を使うことにより、画像を読み込むことができます。
(※なお、この関数を使うと、実行したときにウィンドウは表示されるが、画像が出ない、などが発生する人は、
ファイル名の後を、CV_LOAD_IMAGE_COLOR にしてみて実行してみてください。)
IplImage型の sourceImage に読み込んだ画像を格納します。
プログラムに書くと次のようになります。
IplImage *sourceImage = cvLoadImage( "image/source.bmp", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );
(※画像がでない場合)
IplImage *sourceImage = cvLoadImage( "image/source.bmp", CV_LOAD_IMAGE_COLOR );
とう感じになります。今回は、bmp形式の画像をimageというフォルダに保存しました。
jpg形式の画像を表示させたいなら、画像の拡張子をjpgなどに変更する必要があります。
とりあえず、画像の名前なので、画像の名前をそのままかいてやれば大丈夫です。
imageフォルダは、Visual C++から実行する場合は、cppファイルと同じフォルダに作り、exeファイルから実行する場合は、exeファイルと同じ場所に置きます。
- cppファイルは(プロジェクト名をtestにした場合)
ドキュメント⇒Visual studio 2008⇒projects⇒test⇒testの中にimageフォルダを作ります。そのフォルダの中に画像をファイルを入れておきます。
- exeファイルは(プロジェクト名をtestにした場合)
ドキュメント⇒Visual studio 2008⇒projects⇒test⇒Debugの中にimageフォルダを作ります。そのフォルダの中に画像をファイルを入れておきます。
今回は、どちらの方法でも動作することを確認するために、どちらのフォルダにもimageフォルダを置き、画像を格納しました。
3-3、画像が見つからなかった場合の処理
sourceImage に画像が格納されているはずなので、中身がNULLの場合、画像が見つからなかった(正しい場所に画像が格納されていない)ということになります。
その場合に、"画像が、見つかりません!"というエラーメッセージを表示させるところを一応作っておきます。
今回は、画像を正しい場所に入れておくという前提でやりますが、後々のプログラムでエラー処理は必要だと思いますので。
if文で分岐します。
条件は、上にも書いた通り
if(sourceImage = NULL){
printf("画像が見つかりません");
return -1;
}
これで完了です。
3-4、読み込んだ画像を表示させるウィンドウの生成
次に読み込んだ画像を表示させるためのウィンドウの生成を行います。
OpenCVの関数の中に、ウィンドウを生成する関数があります。
それが
cvNamedWindow( const char* name, CV_WINDOW_AUTOSIZE);
になります。
この関数で、ウィンドウを生成できます。
今回は、Sourceという名のウィンドウを生成します。
ここで、char型の配列 windowNameSource[]に"Source" を格納しておきます。
char windowNameSource[] = "Source";
プログラムに書くと次のようになります。
cvNamedWindow( windowNameSource, CV_WINDOW_AUTOSIZE);
これで、ウィンドウの生成は完了です。
3-5、読み込んだ画像を表示
やっと、ここで読み込んだ画像を表示させます。
ここでも、OpenCVの関数を使います。
ここで使うのは
cvShowImage( "画像を表示するウィンドウの名前", "画像の格納されているIplImage型の変数" );
となります。
今回は
表示するウィンドウの名前 : windowNameSource
画像の格納されている変数 : sourceImage
なのでプログラムに書くと
cvShowImage( windowNameSource, sourceImage );
となります。
3-6、キー入力を待つ処理
プログラムが動いている間にキー入力を待つ処理をします。
cvWaitKey( 0 );
を使います。cvWaitKey()が、0の場合はキーが押されるまで待ちます。
このプログラムは、何かキーを押した瞬間にウィンドウが閉じます。
とりあえず、この関数を入れておいてください。
3-7、後片付け
プログラムを終了する前に、cvReleaseImage() 関数を使って確保したメモリを解放してやる必要があります
プログラムにかくと以下のようになります。
cvReleaseImage( &sourceImage );
今回は、画像をsourceImageに格納したので、それを解放してやります。
そして、同じようにウィンドウを破棄します。
ウィンドウの破棄には、cvDestroyWindow()関数を使います。
プログラムに書くと以下のようになります。
cvDestroyWindow( windowNameSource );
あとは、return 0を返して終了です。
今までいろいろ書きましたが、資料のサンプルプログラムを参考にしてやればできると思います。
サンプルプログラムでの、セピア変換する部分を抜き、今回の課題に合うように変えてやれば完成です。
最後に、Visual C++の左側に出ている、ソリューションエクスプローラーをいじります。
ソースファイルにDirectShow.cpp
ヘッダファイルにDirectShow.h、ewclib.hを追加してください。
そうすると、ソースファイルが3つ、ヘッダファイルが4つになると思います。
追加の仕方は、ソースファイル(ヘッダファイルの場合はヘッダファイル)を右クリック⇒追加⇒既存の項目を選択すれば、出でくると思いますので、追加してください。
また、既存の項目を選択しても出てこないという人は、保存している場所が違う場合があります。
既存の項目で開くのは自分のプロジェクトフォルダのcppファイルのあるフォルダです。
なので、DirectShow.cpp、DirectShow.h、ewclib.hは、cppファイルのフォルダにコピーしておくことをおすすめします。
そして、実行して、dllファイルが見つかりません。などのエラーが出た場合は、dllファイルは、Visual C++からの実行の場合は、cppファイルのある場所、exeファイルからの実行の場合は、exeファイルのある場所に入れておかないといけないので、それらもコピーしてやるとエラーがなくなると思います。
ちなみに、dllファイルの場所は、OpenCVのフォルダのbinフォルダに入っていると思いますのでdllファイルすべてコピーしてください。
これで一通りできると思いますが、書き忘れていることもあるかもしれないので、エラーが消えないとかあったら、連絡してもらえると答えられるかもしれません。。
最終更新:2009年05月20日 20:21