将Mat图像画到控件; void CpbtestDlg::DrawMat(cv::Mat & img, UINT nID) { cv::Mat imgTmp; CRect rect; GetDlgItem(nID)->GetClientRect(&rect); // 获取控件大小 cv::resize(img, imgTmp, cv::Size(rect.Width(), rect.Height()));// 缩小或放大Mat并备份 // 转一下格式 ,这段可以放外面, switch (imgTmp.channels()) { case 1: cv::cvtColor(imgTmp, imgTmp, CV_GRAY2BGRA); // GRAY单通道 break; case 3: cv::cvtColor(imgTmp, imgTmp, CV_BGR2BGRA); // BGR三通道 break; default: break; } int pixelBytes = imgTmp.channels()*(imgTmp.depth() + 1); // 计算一个像素多少个字节 // 制作bitmapinfo(数据头) BITMAPINFO bitInfo; bitInfo.bmiHeader.biBitCount = 8 * pixelBytes; bitInfo.bmiHeader.biWidth = imgTmp.cols; bitInfo.bmiHeader.biHeight = -imgTmp.rows; bitInfo.bmiHeader.biPlanes = 1; bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bitInfo.bmiHeader.biCompression = BI_RGB; bitInfo.bmiHeader.biClrImportant = 0; bitInfo.bmiHeader.biClrUsed = 0; bitInfo.bmiHeader.biSizeImage = 0; bitInfo.bmiHeader.biXPelsPerMeter = 0; bitInfo.bmiHeader.biYPelsPerMeter = 0; // Mat.data + bitmap数据头 -> MFC CDC *pDC = GetDlgItem(nID)->GetDC(); ::StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(), rect.Height(), imgTmp.data, &bitInfo, DIB_RGB_COLORS, SRCCOPY ); ReleaseDC(pDC); }
|