GUI画像処理プログラミング : OpenCV Visual Studio CLR and C# - プロジェクト1:ボタンクリックで画像読み込み

目的


 開発環境が整っていることを確認するために、ボタンクリックで画像を読み込み表示させる簡単なプログラムを作成する。

※OpenCV2.2で実装した

準備


 D:\imageに、ファイル名"waraebaii.jpg" サイズ640x480[pix]を設置する。


開発


●プロジェクト名:pro1 
GUIプログラムの準備を参照
●ソリューションエクスプローラーは次の様になる。
 


●Form1.cpp
 
//実際には、必要な物だけpragma commentを記述すれば良い
#ifdef _DEBUG
    //Debugモードの場合.   
   #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")            // opencv_core
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")        // opencv_imgproc
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")        // opencv_highgui
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220d.lib")    // opencv_objdetect
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220d.lib")            // opencv_ml
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220d.lib")    // opencv_features2d
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220d.lib")        // opencv_video
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220d.lib")        // opencv_calib3d
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220d.lib")        // opencv_flann
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220d.lib")        // opencv_contrib
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220d.lib")        // opencv_legacy
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220d.lib")            // opencv_gpu
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220.lib")            // opencv_core
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220.lib")        // opencv_imgproc
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220.lib")        // opencv_highgui
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220.lib")    // opencv_objdetect
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220.lib")            // opencv_ml
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220.lib")    // opencv_features2d
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220.lib")        // opencv_video
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220.lib")        // opencv_calib3d
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220.lib")        // opencv_flann
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220.lib")        // opencv_contrib
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220.lib")        // opencv_legacy
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220.lib")            // opencv_gpu
#endif

#include "stdafx.h"
#include <stdio.h>
#include "Form1.h"
#include "opencv2\\opencv.hpp"        //これ一つincludeしておけばよい
#define  LOADPASS "D:\\image\\waraebaii.jpg"  //読み込む画像のパス

using namespace pro1;

System::Void Form1::button_open_Click(System::Object ^sender, System::EventArgs ^e)
{

//==============================================================================================================================//
//===cvCreateImage=画像用メモリの確保。cvCreate(画像サイズ、ビット深度、チャネル)
//===サイズ指定にはcvSize(width,height)が便利
//===ビット深度は基本的に8Uを使う。ソーベルフィルタ等、一部関数では16Sを使用しなければならないので、その時はそれに従う。
//===使い終わった段階でメモリを解放する。cvReleaseImageにIplImageのポインタのポインタを渡す。

  IplImage *loadImage = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);        

//==============================================================================================================================//
//cvLoadImage(char* filename, int flags)
//===BMP,JPEG,PNG,PPM,PGM,PBM..よく使う画像フォーマットには対応している。
//=====読み込んだデータを解析して、適切なフォーマットを選択してくれる。
//===flagsを省略するとCV_LOAD_IMAGE_ANYCOLORになる。これは3チャネルか1チャネルかを自動判断する。
  
  loadImage = cvLoadImage(LOADPASS);                                            

//==============================================================================================================================//
//=loadImageに失敗した場合(ファイルパスの間違いなど)はNULLを返すので、その時はメッセージボックスで表示。
//===MessageBox::Show("String")

  if(loadImage == nullptr)
    {
    MessageBox::Show("loadImage Error");                                    
  }

//==============================================================================================================================//
//表示ウィンドウの作成=cvNamedWindow(char * WINDOWNAME, int flags)
//===デフォルトでflagsはCV_WINDOW_AUTOSIZE(=1)になっている。
//=====flags=1は画像データに合わせてウィンドウサイズを自動変更。
//=====flags=0はウィンドウサイズに合わせて画像データを拡大/縮小。

  cvNamedWindow("LOAD", CV_WINDOW_AUTOSIZE);

//==============================================================================================================================//
//表示ウィンドウの表示=cvShowImage(char *WINDOWNAME, IplImage *image)

  cvShowImage("LOAD", loadImage);

//==============================================================================================================================//
//cvWaitKey(int delaytime)
//===delaytime[ms]だけ、プログラムを遅延させる
//===delaytimeが0の時、何かキーが押されるまでプログラムは停止する
 
  cvWaitKey(0);     //何かキーが押されるまではイメージを表示させるため

  cvDestroyAllWindows();       //cvNamedWindowで作成したウィンドウの一斉破棄.
  cvReleaseImage(&loadImage);   //不要になった段階で解放する。解放してもウィンドウに表示したイメージが消える訳ではない
}


●Form1.h

  関数のプロトタイプ宣言
  System::Void button_open_Click(System::Object^  sender, System::EventArgs^  e);


●Form1.h(デザイン)
 
 オブジェクト名(button_open)をForm1.h上に設置
 プロパティで背景色、文字色を変更して遊ぶ


●結果