视频处理--学习:opencv mat在mfc中自适应显示

方法一 Mat 转成CImage格式显示

// 函数功能: 显示图片  【获取控件的CDC, 获取控件的CRect, 显示图片】
void ShowMat(cv::Mat img)
{
 	CDC *pDc = GetDlgItem(IDC_STATIC_PIC_DISPLAY)->GetDC();
 	CRect rect;
 	GetDlgItem(IDC_STATIC_PIC_DISPLAY)->GetClientRect(&rect);
 	DrawMat(pDc, img, rect);
 	ReleaseDC(pDC);
}

// 函数功能: 绘制图片 【将Mat 格式 转换成 CImage 显示】
BOOL DrawMat(CDC *pDC, cv::Mat &img, CRect &rect)
{
	cv::Size winSize(rect.right, rect.bottom);
	cv::Mat cvImgTmp(winSize, CV_8UC3);
	 if (img.size() != winSize)
	 {
	  	cv::resize(img, cvImgTmp, winSize);
	 }
	 else
	 {
	  	cvImgTmp = img;
	 }
	 CImage imgDst;
	 Mat2CImage(&cvImgTmp, imgDst);
	 imgDst.Draw(pDC->GetSafeHdc(), rect);
	 return true;
}

// 函数功能: Mat 转 CImage 格式
int Mat2CImage(cv::Mat *mat, CImage &img)
{
	 if (!mat || mat->empty())
	 	return -1;
	 int nBPP = mat->channels() * 8;
	 img.Create(mat->cols, mat->rows, nBPP);
	 if (nBPP == 8)
	 {
		  static RGBQUAD pRGB[256];
		  for (int i = 0; i < 256; i++)
		   pRGB[i].rgbBlue = pRGB[i].rgbGreen = pRGB[i].rgbRed = i;
		  img.SetColorTable(0, 256, pRGB);
	 }
	 uchar* psrc = mat->data;
	 uchar* pdst = (uchar*)img.GetBits();
	 int imgPitch = img.GetPitch();
	 for (int y = 0; y < mat->rows; y++)
	 {
		  memcpy(pdst, psrc, mat->cols*mat->channels());//mat->step is incorrect for those images created by roi (sub-images!)
		  psrc += mat->step;
		  pdst += imgPitch;
	 }
	 return 0;
}	

方法二 采用CvvImage格式显示

方法说明: 要使用CvvImage 显示, 需要在代码中添加 CvvImage.h 和 CvvImage.cpp 这两个文件。
备注: CvvImage.h 和 CvvImage.cpp 是早期opencv版本中的文件

// 函数功能: 显示Mat
void ShowMat(cv::Mat img )
{
	DrawPicToHDC(&(IplImage)(img), IDC_STATIC_PIC_DISPLAY);
}

// 函数功能: CvvImage 显示
void DrawPicToHDC(IplImage *img, UINT ID)
{
	 CDC *pDC = GetDlgItem(ID)->GetDC();
	 if (pDC == NULL)
	 {
	 	 return;
	 }
	 HDC hDC = pDC->GetSafeHdc();
	 CRect rect;
	 GetDlgItem(ID)->GetClientRect(&rect);
	 CvvImage cimg;
	 cimg.CopyOf(img, img->nChannels); // 复制图片
	 cimg.DrawToHDC(hDC, &rect); // 将图片绘制到显示控件的指定区域内
	 ReleaseDC(pDC);
}

猜你喜欢

转载自blog.csdn.net/XHW___001/article/details/84965931
今日推荐