簡単なデモンストレーションでは、mfcとopencvがよく使用されます。次に、2つの使用を一緒に記録します。
まず、最初にVS2015を開き、opencv_mfcという名前のMFCプロジェクトを作成し、ダイアログボックスの種類を選択して、残りはデフォルトの操作に従います。
##たとえば、ボタンボタンに画像を表示し、画像コントロールを表示します。
次に、リソースビューのダイアログバーを開き、ダイアログにコントロールを追加します。デフォルトで元の2つのボタンを削除し、IDがIDC_PICの画像コントロールを追加し、IDがIDC_BTN_OPENでタイトルが「画像を開く」のボタンコントロールを追加して、上記の手順を完了し、次の画像を取得します。
次に、ソリューションエクスプローラーに切り替えて、opencv_mfcDlg.hに次のヘッダーファイルと宣言ファイルを追加します。
プロジェクトのプロパティで新しいopencv属性テーブルを作成し、インクルードパスとライブラリパスを構成します。
opencvヘッダーファイルをxxDlg.cppに含めます。
#include "opencv2/opencv.hpp"
using namespace cv;
上記はOpenCVのヘッダーファイルであり、主に画像コントロールのサイズを取得するためにメンバー変数を追加します。
CRect rect;
3番目に、次のように、opencv_mfcDlg.cppソースファイルのOnInitDialog()関数にカスタムコードを追加します。
//----------------------------【自定义代码处】--------------------------------------
CWnd *pWnd1 = GetDlgItem(IDC_PIC);//CWnd是MFC窗口类的基类,提供了微软基础类库中所有窗口类的基本功能。
pWnd1->GetClientRect(&rect);//GetClientRect为获得控件相自身的坐标大小
namedWindow("src1", WINDOW_AUTOSIZE);//设置窗口名
HWND hWndl = (HWND)cvGetWindowHandle("src1");//hWnd 表示窗口句柄,获取窗口句柄
HWND hParent1 = ::GetParent(hWndl);//GetParent函数一个指定子窗口的父窗口句柄
::SetParent(hWndl, GetDlgItem(IDC_PIC)->m_hWnd);
::ShowWindow(hParent1, SW_HIDE);
Mat srcImg = imread("bk.jpg");
resize(srcImg, srcImg, Size(rect.Width(), rect.Height()));
imshow("src1", srcImg);
//----------------------------【自定义代码处】--------------------------------------
簡単に言うと、最初に画像コントロールのサイズを取得し、次にnamewindow関数を使用してウィンドウを作成し、次にそのハンドルを取得して、画像コントロールに関連付けます。後で別の画像が表示されます。初期化時に画像が表示されない場合、プログラムが起動し、画像コントロールに濃い灰色の影が付いているため、明るい色の画像が追加されます。(この手順は必要ありません)
4番目に、ボタンにメッセージ応答関数を追加します。ダイアログボックスのリソースビューでボタンを直接右クリックして、メッセージ応答関数を追加します。コードは次のとおりです。
void CcvMFCDlg::OnBnClickedBtnOpen()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szFilter[] = _T("图片文件 (*.jpg)|*.jpg|All Files (*.*)|*.*||");
// 构造打开文件对话框
CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
CString strFilePath;
// 显示打开文件对话框
if (IDOK == fileDlg.DoModal())
{
// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里
strFilePath = fileDlg.GetPathName();
USES_CONVERSION;
char *s = T2A(strFilePath);
Mat srcImg = imread(s);
resize(srcImg, srcImg, Size(rect.Width(), rect.Height()));
imshow("src1", srcImg);
}
}
手順3:bk.jpgが読み込まれていない場合、ウィンドウは次のようになります。画像領域に影があります。手順3の最後の3行のコードでは、背景と一致する画像を使用して影を覆っています。
画像を読み込んだ後の効果:
参照:cvGetWindowHandle()の解決策が見つかりません
参照:[MFCフレームワークでは、OpenCVおよびMFCウィンドウバインディング方法]
遭遇問題:
1、cvGetWindowHandle()は未定義です
解決策:アドオン
#include<opencv2/highgui/highgui_c.h>