用CxImage来显示图像很方便
mat支持的数据类型很多,StretchDibBit是否也支持这些种类型呢

解决方案 »

  1.   

    数据格式RGBA,不是RGB吧。好像是这个问题,不知道你的程序问题
      

  2.   

    直接复制的数据区么。。Mat的数据没研究过,只知道IplImage*转Dib格式然后用MFC显示。这两个的数据区是一样的,只有存储方向是反的,Cvflip一下就可以了。
      

  3.   

    IplImage*可以显示,Mat不知道。
      

  4.   

    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);
    }
    打开并显示,代码如上....
      

  5.   

    你的图片一定是太大或太小,StretchDibBit拉伸opencv里的图片时会发生变形的,可选的方法是显示时你用opencv里的cvsize把图片伸缩到与显示控件同样大小,然后再用StretchDibBit显示。就OK啦
      

  6.   

    我想了很久,找到一个折衷的办法,把图像的尺寸修改成DIBBit可以处理的4的倍数,这是BITMAP对数据的长和宽的要求的
      

  7.   

    http://blog.csdn.net/giantchen547792075/article/details/7061492