opencv 与 mfc

A veces, para demostraciones sencillas, a menudo se utilizan mfc y opencv. Ahora registre el uso de los dos juntos.

Primero, abra VS2015, cree un proyecto MFC llamado opencv_mfc, seleccione el tipo de cuadro de diálogo y siga las operaciones predeterminadas para el resto.

## Por ejemplo, muestra una imagen en el botón Botón y muestra el control de imagen:

Luego abra la barra de diálogo de la vista de recursos y agregue controles al diálogo. Elimine los dos botones predeterminados originales, agregue un control de imagen, la ID es IDC_PIC y luego agregue un control de botón, la ID es IDC_BTN_OPEN, el título es "imagen abierta" para completar los pasos anteriores y obtener la siguiente imagen:

 

En segundo lugar, cambie al Explorador de soluciones y agregue los siguientes archivos de encabezado y archivos de declaración en opencv_mfcDlg.h:

Cree una nueva tabla de atributos de opencv en las propiedades del proyecto y configure la ruta de inclusión y la ruta de la biblioteca.

Incluya el archivo de encabezado opencv en xxDlg.cpp:

#include "opencv2/opencv.hpp"
using namespace cv;

Lo anterior es el archivo de encabezado en OpenCV, y luego agrega una variable miembro, principalmente para obtener el tamaño del control de imagen:

CRect rect;

En tercer lugar, agregue código personalizado a la función OnInitDialog () en el archivo fuente opencv_mfcDlg.cpp de la siguiente manera:

//----------------------------【自定义代码处】--------------------------------------
	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);
//----------------------------【自定义代码处】--------------------------------------

En pocas palabras, primero obtenga el tamaño del control de imagen, luego use la función namewindow para crear una ventana, luego obtenga su identificador y asócielo con el control de imagen. Se muestra otra imagen en la parte posterior.Si esta imagen no se muestra en la inicialización, el programa se inicia y el control de imagen tiene una sombra gris oscura, por lo que se agrega una imagen de color claro. (Este paso no es necesario)

En cuarto lugar, agregue una función de respuesta de mensaje al botón. Haga clic directamente con el botón derecho en el botón en la vista de recursos del cuadro de diálogo para agregar una función de respuesta de mensaje. El código es el siguiente:

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);
	}
}

Paso 3: Cuando bk.jpg no está cargado, la ventana se ve así. El área de la imagen tiene una sombra. Las últimas tres líneas de código en el Paso 3 usan una imagen consistente con el fondo para cubrir la sombra.

El efecto después de cargar una imagen:

 

Referencia: MFC y openCV se utilizan juntos para mostrar imágenes

Referencia: no se puede encontrar la solución de cvGetWindowHandle ()

Referencia: [En el marco MFC, método de enlace de ventana OpenCV y MFC]

Problemas de encuentro:

1 、 cvGetWindowHandle () no está definido

Solución: agregar

#include<opencv2/highgui/highgui_c.h>

 

Supongo que te gusta

Origin blog.csdn.net/juluwangriyue/article/details/108886191
Recomendado
Clasificación