MFC:CImage显示OpenCV:Mat矩阵图像

转自: http://www.opencv.org.cn/forum/viewtopic.php?p=52713



/*************************************/

//1.读入Mat矩阵(cvMat一样),Mat img=imread("*.*");//cvLoadImage
//确保转换前矩阵中的数据都是uchar(0~255)类型(不是的话量化到此区间),这样才能显示。(初学者,包括我经常忘了此事)
//2.根据矩阵大小创建(CImage::Create)新的的CImage类
CImage CI;
int w=img.cols;//宽
int h=img.rows;//高
int chinnels=img.channels();//通道数
CI.Destroy();//创建前,最好使用它,防止重复创建,程序崩溃
CI.Create(w,h,8*chinnels);

//3.下来就是对CI进行赋值了,这里是最核心的地方,分二类讨论
//	(1)如果是1个通道的图像(灰度图像) DIB格式才需要对调色板设置
//	CImage中内置了调色板,我们要对他进行赋值:
RGBQUAD* ColorTable;
int MaxColors=256;
//这里可以通过CI.GetMaxColorTableEntries()得到大小(如果你是CI.Load读入图像的话)
ColorTable = new RGBQUAD[MaxColors];
CI.GetColorTable(0,MaxColors,ColorTable);//这里是取得指针
for (int i=0; i(i);
		for(int j=0;j(i);
			for(int j=0;jm_hDC,rect,SRCCOPY);
		///或者
			CPaintDC dc(this);
		CI.Draw(dc.m_hDC,0,0);//这个以某个dc(可以是窗口)的(0,0)为起点




总结起来就是:


void MatToCImage( Mat &mat, CImage &cImage)
{
	//create new CImage
	int width    = mat.cols;
	int height   = mat.rows;
	int channels = mat.channels();

	cImage.Destroy(); //clear
	cImage.Create(width, 
		height, //positive: left-bottom-up   or negative: left-top-down
		8*channels ); //numbers of bits per pixel

	//copy values
	uchar* ps;
	uchar* pimg = (uchar*)cImage.GetBits(); //A pointer to the bitmap buffer
		
	//The pitch is the distance, in bytes. represent the beginning of 
	// one bitmap line and the beginning of the next bitmap line
	int step = cImage.GetPitch();

	for (int i = 0; i < height; ++i)
	{
		ps = (mat.ptr(i));
		for ( int j = 0; j < width; ++j )
		{
			if ( channels == 1 ) //gray
			{
				*(pimg + i*step + j) = ps[j];
			}
			else if ( channels == 3 ) //color
			{
				for (int k = 0 ; k < 3; ++k )
				{
					*(pimg + i*step + j*3 + k ) = ps[j*3 + k];
				}			
			}
		}	
	}

}



你可能感兴趣的:(Opencv学习,C++,mfc,distance,byte,delete,文档,百度)