我认为在MFC View上显示OpenCV2 Mat很简单,但事实并非如此.这只是我在谷歌上找到的相关资料.请原谅我的无知,但我找不到任何其他材料显示如何使用一维数组"数据"成员返回SetDIBitsToDevice.更具体地说,我需要知道如何为函数指定BITMAPINFO.我是否会回到旧C风格的OpenCV与MFC一起工作?
更新:
我找到了一个SetDIBitsToDevice的例子,它实际上是旧的C风格的OpenCV.但是将它转换为OpenCV2很简单.有些事情我需要提及才能使其发挥作用:
当Mat的深度返回0时,Bpp方法不能很好地工作.我只是改变了这样:
static int Bpp(cv::Mat img) { return 8 * img.channels(); }
Run Code Online (Sandbox Code Playgroud)Mat没有原始成员.但是简单地将0设置为FillBitmapInfo方法的origin参数就可以了.
除此之外,以下代码工作得很好.希望这也有助于其他开发者.
void COpenCVTestView::OnDraw(CDC* pDC)
{
COpenCVTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
if(pDoc->m_cvImage.empty()) return;
// TODO: add draw code for native data here
int height=pDoc->m_cvImage.rows;
int width=pDoc->m_cvImage.cols;
uchar buffer[sizeof( BITMAPINFOHEADER ) + 1024];
BITMAPINFO* bmi = (BITMAPINFO* )buffer;
FillBitmapInfo(bmi,width,height,Bpp(pDoc->m_cvImage),0);
SetDIBitsToDevice(pDC->GetSafeHdc(), 0, 0, width,
height, 0, 0, 0, height, pDoc->m_cvImage.data, bmi,
DIB_RGB_COLORS);
}
void COpenCVTestView::FillBitmapInfo(BITMAPINFO* bmi, int width, int height, int bpp, int origin)
{
assert(bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
memset(bmih, 0, sizeof(*bmih));
bmih->biSize = sizeof(BITMAPINFOHEADER);
bmih->biWidth = width;
bmih->biHeight = origin ? abs(height) : -abs(height);
bmih->biPlanes = 1;
bmih->biBitCount = (unsigned short)bpp;
bmih->biCompression = BI_RGB;
if (bpp == 8)
{
RGBQUAD* palette = bmi->bmiColors;
for (int i = 0; i < 256; i++)
{
palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
palette[i].rgbReserved = 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
来自 MSDN:
lpvBits [in] 指向存储为字节数组的颜色数据的指针。有关详细信息,请参阅以下备注部分。
这是您必须使用从 Mat::data 返回的数据初始化的指针。
| 归档时间: |
|
| 查看次数: |
11415 次 |
| 最近记录: |