gpt4 book ai didi

c++ - 如何在 MFC View 上显示 OpenCV Mat

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:47 25 4
gpt4 key购买 nike

我认为在 MFC View 上显示 OpenCV2 Mat 很简单,但事实并非如此。 This is only relevant material I found on google .请原谅我的无知,但我找不到任何其他 Material 来展示如何将 SetDIBitsToDevice 与一维数组“数据”成员返回一起使用。更具体地说,我需要知道如何为函数指定 BITMAPINFO。我要回到旧的 C 风格的 OpenCV 来使用 MFC 吗?

更新:

我找到了 an example of SetDIBitsToDevice这实际上适用于旧的 C 风格的 OpenCV。但是将它转换为 OpenCV2 很简单。为了让它发挥作用,我需要提及一些事情:

  1. Bpp 方法效果不佳,因为 Mat 的深度返回 0。我只是这样更改:

    static int Bpp(cv::Mat img) { return 8 * img.channels(); } 
  2. Mat 没有 origin 成员。但只需将 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;
}
}
}

最佳答案

这是在 MFC 中显示 OpenCV 数据的另一种可能方式,我使用它并且效果很好:

IplImage* image// <-- this contains the image you want to display
CvvImage tempdefault;
RECT myrect; // <-- specifiy where on the screen you want it to be displayed
myrect.top = 0;
myrect.bottom = _pictureh;
myrect.left = _picturex;
myrect.right = _picturew+_picturex;
tempdefault.Create(_pictureh,_picturew,32);
tempdefault.CopyOf(image);
tempdefault.DrawToHDC(pDC->GetSafeHdc(),&myrect);

关于c++ - 如何在 MFC View 上显示 OpenCV Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8501753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com