2016/06/26
C++でOpenCVのフォームアプリを作る(6) - MFC -
以下、MFCフォームアプリ作成方法の備忘録です。1. Visial Studio 2015を起動させ、ファイル(F) - 新規作成(N) - プロジェクト(P)を選択し、テンプレートのVisual C++からMFC、MFCアプリケーションを選択し、プロジェクト名(ここではMatToBmp)を入力し、OKボタンを押す。

2. 以下、「MFCアプリケーションウィザード」に従い、進む。「概要」ページは、「次へ」ボタンで次に進む。

3. 「アプリケーションの種類」ページでは、「ダイアログベース」と、「スタティック ライブラリでMFCを使用する」にチェックを入れて、「次へ」ボタンを押す。

4. 「ユーザーインターフェース機能」ページは、「次へ」ボタンで次に進む。

5. 「高度な機能」ページも、「次へ」ボタンで次に進む。

6. 「生成されたクラス」が表示されるので、「完了」ボタンを押す。

7. フォーム(ダイアログ)と.NET Frameworkのようなツールボックスが表示される。ツールボックスのボタンを押した際の動作のプログラムは、「プロジェクト名+Dlg.cpp」内(ここではMatToBmpDlg.cpp)に記載する。

8. 画像の表示部は、「Picture Control」をフォームに貼り付け、プロパティにて、IDをデフォルトのID_STATICで使用せずに、リネームする(ここでは、ID_STATIC_BMP)。また、Typeを「ビットマップ」に変更する。

ボタンを押したときのコードは以下の通り。
void CMatToBmpDlg::OnBnClickedButton1()
{
CBitmap m_bmp; //画像(bitmapファイル)
Mat readimage = imread("c:\\flower.bmp",1); //画像読み込み
char* ColorBuf = (char*)calloc(readimage.rows * readimage.rows * 4, sizeof(RGBQUAD));
for (int y = 0; y < readimage.rows; y++) {
for (int x = 0; x < readimage.cols; x++) {
// Blue
ColorBuf[y * readimage.cols * 4 + x * 4 + 0] = readimage.data[y * readimage.step + x * 3 + 0];
// Green
ColorBuf[y * readimage.cols * 4 + x * 4 + 1] = readimage.data[y * readimage.step + x * 3 + 1];
// Red
ColorBuf[y * readimage.cols * 4 + x * 4 + 2] = readimage.data[y * readimage.step + x * 3 + 2];
//Reserved
ColorBuf[y * readimage.cols * 4 + x * 4 + 3] = 0;
}
}
m_bmp.CreateBitmap(readimage.cols, readimage.rows, 1, 32, ColorBuf);
free(ColorBuf);
CStatic* pictbox = (CStatic*)GetDlgItem(IDC_STATIC_BMP);
pictbox->SetBitmap(m_bmp); //Picture Controlに表示
}
コードは、OpenCVでMat形式で画像を読み込み、Bitmap変換して、Picture Controlに表示させるものです。4行目でOpenCVにて画像を読み込み、5行目で変換後のBitmapの各データの領域を確保し、7~18行目でMat形式のデータをBitmap形式のデータに代入します。20行目でBitmapを作成し、23、24行目でそのBitmapをPicture Controlに表示します。実行結果は、以下の通り。

無事に動作しました。大変苦労しました。MFCで「静的リンク」のフォームアプリを作成できることが分かりましたが、コーディング~ビルドまでが難儀ですね。手間と苦労を考えると、実使用上問題なければ、「静的リンク」せずに、C++/CLIでコードを組んで、DLLファイルを同居させておいても良いような気がしました。