MFC/C# 中显示 OpenCV 的 Mat

OpenCV 2.2 版本之前有个类叫做 Cvvimage 可以在 MFC 中显示 IplImage ,但是自从 2.2 版本之后这个类就消失了,有人把之前版本的代码抠出来继续用,但是这样也不是很方便,比如在 C++ 中还得把 Mat 转换为 IplImage。为此找了一些资料,总算是把 cv::Mat 在各种 Windows 窗体里面的显示问题解决了,这样用起来就方便多了。在此分享出来,有需要的朋友直接拿去用吧,此文为原创,转载请注明地址,谢谢~

本文地址:http://blog.csdn.net/houston11235/article/details/7678088

下面这个函数就是实现在 MFC 或者 C# 的窗体中显示 Mat 的功能,之所以这么说是因为不管编程语言是什么, Windows 的窗体都有一个叫做句柄(在 C# 中对应 handle)的东西,把这个作为函数的第二个参数传进来就行了。

这个函数要用到 ATL 中的 CImage 类,需要引用头文件 atlimage.h,注意这个要放在 cv.h 神马的前面,最好就放在 windows.h 后面,否则编译会出现 ‘min’ 和 ‘max’ 未定义的错误。

另外这个函数只实现了 3 通道图像的显示功能, 1 通道的图像请参考本文最后的链接。

  1. int ShowMat( cv::Mat img, HWND hWndDisplay )  
  2. {  
  3.     if (img.channels()<3 )  
  4.     {  
  5.         return -1;  
  6.     }  
  7.   
  8.     RECT rect;  
  9.     GetClientRect(hWndDisplay, &rect);  
  10.     cv::Mat imgShow( abs(rect.top - rect.bottom), abs(rect.right - rect.left), CV_8UC3 );  
  11.     resize( img, imgShow, imgShow.size() );  
  12.   
  13.     ATL::CImage CI;  
  14.     int w=imgShow.cols;//宽  
  15.     int h=imgShow.rows;//高  
  16.     int channels=imgShow.channels();//通道数  
  17.   
  18.     CI.Create( w, h, 8*channels);  
  19.     uchar *pS;  
  20.     uchar *pImg=(uchar *)CI.GetBits();//得到CImage数据区地址  
  21.     int step=CI.GetPitch();  
  22.     for(int i=0;i<h;i++)  
  23.     {  
  24.         pS=imgShow.ptr<uchar>(i);  
  25.         for(int j=0;j<w;j++)  
  26.         {  
  27.             for(int k=0;k<3;k++)  
  28.                 *(pImg+i*step+j*3+k)=pS[j*3+k];  
  29.             //注意到这里的step不用乘以3  
  30.         }  
  31.     }  
  32.   
  33.     HDC dc ;  
  34.     dc = GetDC( hWndDisplay );  
  35.     CI.Draw( dc, 0, 0 );  
  36.     ReleaseDC( hWndDisplay, dc);  
  37.     CI.Destroy();  
  38.   
  39.     return 0;  
  40. }  
int ShowMat( cv::Mat img, HWND hWndDisplay )
{
	if (img.channels()<3 )
	{
		return -1;
	}

	RECT rect;
	GetClientRect(hWndDisplay, &rect);
	cv::Mat imgShow( abs(rect.top - rect.bottom), abs(rect.right - rect.left), CV_8UC3 );
	resize( img, imgShow, imgShow.size() );

	ATL::CImage CI;
	int w=imgShow.cols;//宽
	int h=imgShow.rows;//高
	int channels=imgShow.channels();//通道数

	CI.Create( w, h, 8*channels);
	uchar *pS;
	uchar *pImg=(uchar *)CI.GetBits();//得到CImage数据区地址
	int step=CI.GetPitch();
	for(int i=0;i<h;i++)
	{
		pS=imgShow.ptr<uchar>(i);
		for(int j=0;j<w;j++)
		{
			for(int k=0;k<3;k++)
				*(pImg+i*step+j*3+k)=pS[j*3+k];
			//注意到这里的step不用乘以3
		}
	}

	HDC dc ;
	dc = GetDC( hWndDisplay );
	CI.Draw( dc, 0, 0 );
	ReleaseDC( hWndDisplay, dc);
	CI.Destroy();

	return 0;
}


参考链接: http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=15224

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值