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);
}