opencv与mfc

簡単なデモンストレーションでは、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行のコードでは、背景と一致する画像を使用して影を覆っています。

画像を読み込んだ後の効果:

 

参考:MFCとopenCVを併用して写真を表示

参照:cvGetWindowHandle()の解決策が見つかりません

参照:[MFCフレームワークでは、OpenCVおよびMFCウィンドウバインディング方法]

遭遇問題:

1、cvGetWindowHandle()は未定義です

解決策:アドオン

#include<opencv2/highgui/highgui_c.h>

 

おすすめ

転載: blog.csdn.net/juluwangriyue/article/details/108886191