MFC+OpenCV打开图像

一、打开对话框时直接显示出图像。

1、建立一个基于对话框的工程AppDlg,在对话框中加入一个按钮IDC_CAMERA,标题为“打开图像” ;

2、添加CvvImage类;

3、为AppDlg添加以下public类型的变量:

	 CDC* pDC; //显示控件设备上下文
  HDC hDC; //显示控件设备句柄
	 CRect rect;  
	 CvvImage cimg; 
	 cv::Mat image;

4、在对话框中添加Picture控件,为用于显示图像,其ID为IDC_PICTURE

5、为AppDlg添加虚函数OnInitDialog,并加入以下代码:

BOOL CAppDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化
    pDC = GetDlgItem(IDC_PICTURE)->GetDC();//根据ID获得窗口指针再获取与该窗口关联的上下文指针  
    hDC= pDC->GetSafeHdc();    // 获取设备上下文句柄  
    GetDlgItem(IDC_PICTURE)->GetClientRect(rect); //获取box1客户区  

	return TRUE; 
	// 异常: OCX 属性页应返回 FALSE
}

注意:不能再OnInitDialog里显示图像,此时对话框还没有显示出来。

6、添加WM_PAINT消息,并添加以下代码:

void CHistDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
        Mat image = imread("111.jpg"); 
	cimg.CopyOf( &IplImage(image) );  
	cimg.DrawToHDC(hDC, &rect);  
}
此时,在对话框显示的显示的时候,就直接弹出图像111.jpg。这种显示图像的方式有很多应用场合。

【注释】
(1)HDC与CDC

HDC是设备描述句柄,简单的说,HDC就是句柄,是WINDOWS的一种数据类型;

CDC是MFC封装的Windows 设备相关的一个类,封装了几乎所有的关于HDC的操作,简单的说,CDC是MFC里的一个类。
也可以这样说,HDC定义的变量指向一块内存,这块 内存用来描述一个设备的相关的内容,所以也可以认为HDC定义的是一个指针;而CDC类定义一个对象, 这个对象拥有HDC定义的一个设备描述表,同时也包 含与HDC相关的操作的函数。

通过pDC获得hdc句柄:

       HDC hdc=pDC->GetSafeHdc();
(2)为了减少使用IPlImage来定义一副图像(因为有手动释放内存的麻烦),所以,尽量使用Mat来定义图像,使用Mat的IPlImage()方法的直接进行Mat与IPlImage的转化,


二、使用按钮打开图像。

与上述的步骤基本相同,只是第6步不同而已。



你可能感兴趣的:(mfc,opencv,打开图像)