您的位置:首页 > 运维架构

[opencv][MFC]显示mat图片于mfc

2014-05-14 15:42 447 查看
对话框和单文档大同小异

之前一直使用老版本的Cvvimage类来实现,也是网上大多数人使用的方法

机缘巧合,自己试着写一个独立的显示函数,不依托于cvvimage类,

于是有了如下代码

void CxxxDlg::DrawcvMat(cv::Mat m_cvImg, UINT ID)//显示mat在picture控件中
{
cv::Mat img;
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
cv::Rect dst(rect.left,rect.top,rect.right,rect.bottom);
cv::resize(m_cvImg,img,cv::Size(rect.Width(),rect.Height()));

unsigned int m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];
BITMAPINFO* m_bmi = (BITMAPINFO*) m_buffer;
BITMAPINFOHEADER* m_bmih = &(m_bmi->bmiHeader);
memset(m_bmih, 0, sizeof(*m_bmih));
m_bmih->biSize = sizeof(BITMAPINFOHEADER);
m_bmih->biWidth = img.cols;
m_bmih->biHeight = -img.rows;           // 在自下而上的位图中 高度为负
m_bmih->biPlanes = 1;
m_bmih->biCompression = BI_RGB;
m_bmih->biBitCount = 8 * img.channels();

CDC *pDC = GetDlgItem(ID)->GetDC();
::StretchDIBits(
pDC->GetSafeHdc(),
0, 0, rect.Width(), rect.Height(),
0, 0, rect.Width(), rect.Height(),
img.data,
(BITMAPINFO*) m_bmi,
DIB_RGB_COLORS,
SRCCOPY
);
ReleaseDC(pDC);
}


基本思路是根据picture控件的尺寸大小改变mat的尺寸,然后显示即可,

相对于普通的bitmap位图显示没啥优点

现实于控件中的图片,如要加鼠标操作不会有啥不便应该,

横向纵向各自比例换算即可,

参考了http://ju.outofmemory.cn/entry/46316,但我只为显示mat,stretchdibits部分改了改,二次开发新函数要麻烦了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: