我正在创建一个应用程序,其中显示由MFC&处理。图像处理由OpenCV处理。对于第一部分,我使用CImage-> Load()从Memory加载24 bpp位图(颜色),使用StretchBlt()&然后使用CImage的GetBits()函数将指针移交给原始数据到OpenCV Mat。这一半很好,因为我可以显示orig。我的MFC应用程序中的彩色图像&随后可以使用OpenCV将彩色图像剥离成各种灰度格式(r,G,B Sobel)。(使用Opencv验证 - > imshow()
CImage myImage;
wchar_t* wcharPointer=(_T("C:\\TestPic.bmp"));
myImage.Load(wcharPointer);
myImage.StretchBlt(dc.m_hDC,0,0,
myImage.GetWidth(),myImage.GetHeight(),SRCCOPY);
Mat m1(294,456,CV_8UC3,((unsigned char*)myImage.GetBits())-(293*456*3));
//-(293*456*3) Because bitmap is Bottom up,still, image displayed is
//inverted
Mat arrayOf3[3];
split(m1,arrayOf3);
现在,当我想将指向8位灰度图像的指针传回MFC以在应用程序中显示时,我似乎遇到了问题。由于CImage将m_pBits decalres为prvate,我不能将cv :: Mat - >数据分配给CImage。
方法1如下
CBitmap bitmap1;CDC memdc;
memdc.CreateCompatibleDC( &dc);
bitmap1.CreateBitmap(456,294,1,8,(void*)arrayOf3[0].data);
//返回1,所以我假设从OpenCV成功切换到MFC?
dc.BitBlt(10,0,456,294,&安培; memdc,0,0,SRCCOPY); //但这会导致空白屏幕
//方法1失败..不确定为什么......也许DDB不是DIB被创建
So Onto Approach2,我创建了一个bitmapInfo&填充所有必需的值。
BITMAPINFO bitInfo={0};
memset(&bitInfo, 0, sizeof(bitInfo));
bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitInfo.bmiHeader.biWidth = 456;
bitInfo.bmiHeader.biHeight = -294; // top-down image
bitInfo.bmiHeader.biPlanes = 1;
bitInfo.bmiHeader.biBitCount = 8;
bitInfo.bmiHeader.biCompression = BI_RGB; //Uncompressed image
bitInfo.bmiHeader.biSizeImage = 456*294;
bitInfo.bmiHeader.biClrUsed = 0;
bitInfo.bmiHeader.biClrImportant= 0;
我环顾四周&在这种情况下我对如何填充颜色表的理解是缺乏的。 我看到的一种方法是将每个8位灰度图像缩放到颜色表中的24 bpp(或32),我想避免,因为这个操作是时间敏感的。 我该如何生成Colortable?另外,我应该怎么办呢? 提前谢谢..