求OpenCv中Mat数据在MFC中显示方法 用CxImage来显示图像很方便mat支持的数据类型很多,StretchDibBit是否也支持这些种类型呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 数据格式RGBA,不是RGB吧。好像是这个问题,不知道你的程序问题 直接复制的数据区么。。Mat的数据没研究过,只知道IplImage*转Dib格式然后用MFC显示。这两个的数据区是一样的,只有存储方向是反的,Cvflip一下就可以了。 IplImage*可以显示,Mat不知道。 IplImage的很容易处理,但是Mat是2.3.1的,我想直接用了,格式转换也挺烦的...代码也简单: void mfcvProcess::Open(LPCTSTR lpszPathName){ ASSERT(lpszPathName); /*lpszPathName = L"G:\\";*/ if(GetFileAttributes(lpszPathName) == 0xFFFFFFFF) /*获取路径路径错误处理*/ { AfxMessageBox(L"路径不存在"); return; } /*文件名读入,转换*/ DWORD dwMinSize; dwMinSize = WideCharToMultiByte(CP_ACP,NULL,lpszPathName,-1,NULL,0,NULL,FALSE); //计算长度 char *bbb= new char[dwMinSize]; WideCharToMultiByte(CP_OEMCP,NULL,lpszPathName,-1,bbb,dwMinSize,NULL,FALSE); /*//char filename[100]; //wcstombs(filename,lpszPathName,100);*/ m_cvImg = imread(bbb,-1); /*if (!m_cvImg.data) { m_cvImg.release(); return; }*/ int i,j; /*Scalar dst_s,src_s;*/ //为BITMAPINFO结构分配内存并初始化 int headerSize = sizeof(BITMAPINFOHEADER) +sizeof(RGBQUAD)*256; dibInfo = (BITMAPINFO*) new char [headerSize]; dibiHeader = &(dibInfo->bmiHeader); dibiHeader->biSize = sizeof(BITMAPINFOHEADER); dibiHeader->biWidth = m_cvImg.cols; dibiHeader->biHeight = -m_cvImg.rows; dibiHeader->biPlanes = 1; dibiHeader->biCompression = BI_RGB; dibiHeader->biBitCount = WORD (m_cvImg.elemSize1()*m_cvImg.channels()*8); Mat tmp(m_cvImg.rows,m_cvImg.cols,CV_8UC3); /*flip(m_cvImg,m_mTmpImg,0);*/ for(i = 0; i<m_cvImg.rows; i++) { for(j = 0; j<m_cvImg.cols; j++) { /*src_s = cvGet2D(&tmpImg,i,j); dst_s = cvGet2D(tmp,i,j); dst_s.val[0] = src_s.val[0]; dst_s.val[1] = src_s.val[1]; dst_s.val[2] = src_s.val[2]; cvSet2D(tmp,i,j,dst_s);*/ tmp.at<Vec3b>(i,j)[0] = m_cvImg.at<Vec3b>(i,j)[0]; tmp.at<Vec3b>(i,j)[1] = m_cvImg.at<Vec3b>(i,j)[1]; tmp.at<Vec3b>(i,j)[2] = m_cvImg.at<Vec3b>(i,j)[2]; //m_cvImg.release(); } }/*end-for tmp.copyTo(m_cvImg); tmp.release();*/ m_cvImg.release(); m_cvImg = tmp; tmp.release(); /*memset(dibiHeader,0,sizeof(dibInfo->bmiHeader));*/} int mfcvProcess::Show( CDC *dc, int width, int height,BYTE *data){ return StretchDIBits( dc->m_hDC, ///获取dc 0, 0, width, height, 0, 0, width, height, data, dibInfo, DIB_RGB_COLORS, SRCCOPY);}打开并显示,代码如上.... 你的图片一定是太大或太小,StretchDibBit拉伸opencv里的图片时会发生变形的,可选的方法是显示时你用opencv里的cvsize把图片伸缩到与显示控件同样大小,然后再用StretchDibBit显示。就OK啦 我想了很久,找到一个折衷的办法,把图像的尺寸修改成DIBBit可以处理的4的倍数,这是BITMAP对数据的长和宽的要求的 http://blog.csdn.net/giantchen547792075/article/details/7061492 如何逐帧读取较大的视频文件 如何做AX视频监控 请教各位朋友图像缩放的问题,谢谢了 VC打印 VC一个工程有上百文件,不知道怎么回事,每次编译全都要重新编一遍 我可是用F7的呀 已知四点构如何造贝塞尔曲线 为何调用VirtualFree(m_VirtualMem, 0, MEM_RELEASE)老是不成功? ado访问sql server 2000 时,如何处理图片,和声音?(VC 6.0) 请问一个程序无响应的问题! VS 2010下怎么使用fcntl 函数 COM组件能不能像ActiveX控件那样作为浏览器插件? 多线程创建一个存储文件的过程
代码也简单:
void mfcvProcess::Open(LPCTSTR lpszPathName)
{
ASSERT(lpszPathName);
/*lpszPathName = L"G:\\";*/
if(GetFileAttributes(lpszPathName) == 0xFFFFFFFF) /*获取路径路径错误处理*/
{
AfxMessageBox(L"路径不存在");
return;
} /*文件名读入,转换*/
DWORD dwMinSize;
dwMinSize = WideCharToMultiByte(CP_ACP,NULL,lpszPathName,-1,NULL,0,NULL,FALSE); //计算长度
char *bbb= new char[dwMinSize]; WideCharToMultiByte(CP_OEMCP,NULL,lpszPathName,-1,bbb,dwMinSize,NULL,FALSE);
/*//char filename[100];
//wcstombs(filename,lpszPathName,100);*/
m_cvImg = imread(bbb,-1); /*if (!m_cvImg.data)
{
m_cvImg.release();
return;
}*/ int i,j;
/*Scalar dst_s,src_s;*/ //为BITMAPINFO结构分配内存并初始化
int headerSize = sizeof(BITMAPINFOHEADER) +sizeof(RGBQUAD)*256;
dibInfo = (BITMAPINFO*) new char [headerSize];
dibiHeader = &(dibInfo->bmiHeader);
dibiHeader->biSize = sizeof(BITMAPINFOHEADER);
dibiHeader->biWidth = m_cvImg.cols;
dibiHeader->biHeight = -m_cvImg.rows;
dibiHeader->biPlanes = 1;
dibiHeader->biCompression = BI_RGB;
dibiHeader->biBitCount = WORD (m_cvImg.elemSize1()*m_cvImg.channels()*8); Mat tmp(m_cvImg.rows,m_cvImg.cols,CV_8UC3);
/*flip(m_cvImg,m_mTmpImg,0);*/
for(i = 0; i<m_cvImg.rows; i++)
{
for(j = 0; j<m_cvImg.cols; j++)
{
/*src_s = cvGet2D(&tmpImg,i,j);
dst_s = cvGet2D(tmp,i,j);
dst_s.val[0] = src_s.val[0];
dst_s.val[1] = src_s.val[1];
dst_s.val[2] = src_s.val[2];
cvSet2D(tmp,i,j,dst_s);*/
tmp.at<Vec3b>(i,j)[0] = m_cvImg.at<Vec3b>(i,j)[0];
tmp.at<Vec3b>(i,j)[1] = m_cvImg.at<Vec3b>(i,j)[1];
tmp.at<Vec3b>(i,j)[2] = m_cvImg.at<Vec3b>(i,j)[2];
//m_cvImg.release();
}
}/*end-for
tmp.copyTo(m_cvImg);
tmp.release();*/
m_cvImg.release();
m_cvImg = tmp;
tmp.release();
/*memset(dibiHeader,0,sizeof(dibInfo->bmiHeader));*/}
int mfcvProcess::Show( CDC *dc, int width, int height,BYTE *data)
{
return StretchDIBits(
dc->m_hDC, ///获取dc
0,
0,
width,
height,
0,
0,
width,
height,
data,
dibInfo,
DIB_RGB_COLORS,
SRCCOPY);
}
打开并显示,代码如上....