MFC+Opencv显示图像的几种方法

转自:http://lib.csdn.net/article/opencv/35826


早上小师妹遇到mfc显示opencv图像的问题,过来请教我,趁机总结下以前用过的几种方法好了。


(1)使用opencv的CvvImage类

该方法比较简单,但是opencv2.x以上版本已经不支持CvvImage类,不过可以在网上下载该类的头文件和源文件,添加到工程里就可以使用了。

void CXXXDlg::DrawIplImage2MFC(IplImage* img, unsigned int id)
{
	CDC* pDC = GetDlgItem(id)->GetDC();  
	HDC hDC = pDC->GetSafeHdc();  	
	CvvImage cimg;  
	cimg.CopyOf( img );  
	CRect rect;  
	GetDlgItem(id)->GetClientRect(&rect);  	
	cimg.DrawToHDC(hDC, &rect);  
	ReleaseDC( pDC );  
}

函数参数中id是控件ID,比如IDC_STATIC(下同)。


(2)使用MFC的绘图函数
该方法利用MFC的绘图函数,将opencv图像数据先copy到缓冲去然后在控件上显示出来。

void CXXXDlg::DrawIplImage2MFC(IplImage* img, unsigned int id)
{
	BYTE *g_pBits;
	 HDC g_hMemDC;
	 HBITMAP g_hBmp, g_hOldBmp;
	 CDC *pDC;
	 CStatic *pic;
	 int width, height;
	 CRect rect;
	 pDC = GetDlgItem(id)->GetDC();
	 pic = (CStatic*)GetDlgItem(id);
	 pic->GetClientRect(&rect);
	 width = rect.Width();
	 height = rect.Height();
	 g_hMemDC =::CreateCompatibleDC(pDC->m_hDC);
	 BYTE bmibuf[sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD)];
	 memset(bmibuf, 0, sizeof(bmibuf));
	 BITMAPINFO *pbmi = (BITMAPINFO*)bmibuf;
	 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	 pbmi->bmiHeader.biWidth = img->width;
	 pbmi->bmiHeader.biHeight = img->height;
	 pbmi->bmiHeader.biPlanes = 1;
	 pbmi->bmiHeader.biBitCount = 24;
	 pbmi->bmiHeader.biCompression= BI_RGB;
	 g_hBmp =::CreateDIBSection(g_hMemDC, pbmi, DIB_RGB_COLORS, (void**)&g_pBits, 0, 0);
	 g_hOldBmp = (HBITMAP)::SelectObject(g_hMemDC, g_hBmp);
	 BitBlt(g_hMemDC, 0, 0, width, height, pDC->m_hDC, 0, 0, SRCCOPY);
	 int l_width = WIDTHBYTES(img->width* pbmi->bmiHeader.biBitCount);
	 for (int row = 0; row < img->height;row++)  
	 memcpy(&g_pBits[row*l_width],&img->imageData[ (img->height - row - 1)*l_width], l_width);
	 TransparentBlt(pDC->m_hDC, 0, 0, width, height, g_hMemDC, 0, 0, img->width, img->height, RGB(0, 0, 0));
	 SelectObject(g_hMemDC, g_hOldBmp);
	 DeleteDC(g_hMemDC);
	 DeleteObject(pic);
	 DeleteObject(g_hBmp);
	 DeleteObject(g_hOldBmp);
}


(3)链接opencv窗口和MFC控件

该方法是将opencv的显示窗口与MFC的控件链接起来,效果是opencv的窗口恰好覆盖在控件上。

//pic是opencv窗口的标志符,name是窗口名字,ID同上,是MFC控件ID
bool CXXXDlg::attachWindow(string &pic,const char* name,int ID)
{
	pic=string(name);
	cv::namedWindow(pic, 1);
	HWND hWnd = (HWND) cvGetWindowHandle(name);
	HWND hParent = ::GetParent(hWnd);
	::SetParent(hWnd, GetDlgItem(ID)->m_hWnd);
	::ShowWindow(hParent, SW_HIDE);
	return true;
}
bool CXXXDlg::showImage(string pic,int id,cv::Mat mat)
{
	CRect rect;
	GetDlgItem(id)->GetClientRect(&rect);	
	cv::resize(mat,mat,cv::Size(rect.Width(),rect.Height()),CV_INTER_CUBIC);	
	imshow(pic,mat);
	return true;
}
</pre><pre>
使用方法是先链接opencv窗口的标识符和控件ID

string pic;
attachWindow(pic,"win",IDC_PIC);
然后在需要显示图像的地方调用showImage

Mat mat=imread("1.jpg");
showImage(pic,IDC_PIC,mat);	

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Classes)是Microsoft公司开发的一个用于Windows应用程序开发的C++类库。它提供了一个图形用户界面(GUI)框架,使开发人员可以创建Windows应用程序。OpenCV(Open Source Computer Vision)是一个开源的计算机视觉库,它支持各种图像处理和计算机视觉算法,包括图像处理、高级计算机视觉、机器学习、目标检测和跟踪等。 MFCOpenCV可以一起使用来开发Windows图像处理应用程序。MFC提供了图形界面,可以让用户与程序进行交互;而OpenCV提供了强大的图像处理和计算机视觉功能,可以对图像进行分析和处理。使用MFCOpenCV结合起来可以让开发人员轻松地创建一个功能强大的图像处理程序。 在使用MFCOpenCV开发图像处理应用程序时,开发人员需要熟悉MFCOpenCV的相关知识,掌握MFC的Windows编程和OpenCV图像处理能力。开发人员可以使用MFC的窗口、对话框和控件等创建图形界面,然后使用OpenCV来进行图像的读取、处理和输出等操作。开发人员需要在开发过程中注意MFCOpenCV的相互调用关系,使得程序可以正确运行。 总之,MFCOpenCV是两个强大的工具,它们可以一起使用来开发图像处理应用程序。在使用MFCOpenCV开发图像处理应用程序时,开发人员需要熟悉它们的相关知识并合理地运用它们的功能,才能开发出高效、易用、功能强大的应用程序。 ### 回答2: MFC是Microsoft Foundation Class的缩写,是Windows操作系统上的一个GUI应用程序框架,可以帮助开发者快速地创建窗口和用户界面。而OpenCV是一个流行的开源计算机视觉库,可以用于图像处理、模式识别、物体跟踪等方面。由于MFCOpenCV都是针对Windows系统的开发,因此结合使用这两个工具可以方便地实现图像处理和GUI设计的功能。 通过MFC,开发者可以创建一个具有图形界面的应用程序,然后与OpenCV结合可以实现图像处理的各种功能,例如图像滤波,图像分割,特征提取等。通过这种方法,开发者可以快速且方便地开发出图像处理软件,而且可以为MFC界面添加很多可以增强用户体验的控件。 举个例子,假设我们要设计一个用于人脸识别的软件,我们可以使用MFC创建一个简单的用户界面,然后通过OpenCV提供的人脸检测算法来实现人脸识别功能。在这个软件中,OpenCV将负责图像处理和人脸检测部分,而MFC将负责用户界面的设计和数据的输入输出。 总之,MFCOpenCV的结合可以为Windows下的图像处理软件开发提供很大的便利,可以满足很多应用程序的需求。 ### 回答3: MFC是Microsoft Foundation Class的缩写,是微软公司针对Windows操作系统开发的应用程序框架。它提供了许多可重用的类,用于简化Windows应用程序的开发过程。而OpenCV是一种开源计算机视觉库,提供了许多图像处理和计算机视觉算法及工具,可以用于实现包括人脸检测、图像识别等多种应用。它的优势在于它的代码简洁易懂,易于学习,同时也提供了Python、C++等多种编程语言的接口。 使用MFCOpenCV4相结合可以实现很多图像处理的应用,比如图像的读入、载入、预处理、显示等等,可以非常方便的实现对图像的各种操作。另外,MFC框架可以提供一些Windows操作系统的API,用于支持与系统交互的功能,比如打开选择文件框、保存文件框等等。结合OpenCVMFC图像处理应用可以方便的实现这些操作和一些自定义的交互界面。 总之,MFCOpenCV4的结合可以方便、高效的实现计算机视觉领域的图像处理应用程序,为人工智能和机器视觉等领域提供了很好的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值