在MFC中将OpenCV的Mat矩阵绘制到Picture Control控件中的方法

2019-04-15 16:22发布

转载:https://blog.csdn.net/andylanzhiyong/article/details/83620031 需要将此方法定义成类成员 void CXxxDlg::DrawMat2PicCtrl(cv::Mat src, int nID) //需要定义成Dlg的成员函数 { CRect rect; GetDlgItem(nID)->GetClientRect(&rect); // 获取图片控件矩形框 resize(src, src, cv::Size(rect.Width(), rect.Height())); // 缩放Mat,以适应图片控件大小 // 转换格式 ,便于获取BITMAPINFO switch (src.channels()) { case 1: cvtColor(src, src, CV_GRAY2BGRA); // GRAY单通道 break; case 3: cvtColor(src, src, CV_BGR2BGRA); // BGR三通道 break; default: break; } int nPixelBytes = src.channels() * (src.depth() + 1); // 计算一个像素多少个字节 // 制作bitmapinfo(数据头) BITMAPINFO bitInfo; bitInfo.bmiHeader.biBitCount = 8 * nPixelBytes; bitInfo.bmiHeader.biWidth = src.cols; bitInfo.bmiHeader.biHeight = -src.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; CDC *pDC = GetDlgItem(nID)->GetDC(); //获取图片控件DC //绘图 StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, src.cols, src.rows, src.data, &bitInfo, DIB_RGB_COLORS, SRCCOPY ); ReleaseDC(pDC); //释放DC }