我認爲在MFC上顯示OpenCV2墊視圖很簡單,但不是。 This is only relevant material I found on google。請原諒我的無知,但我找不到任何其他材料顯示如何使用SetDIBitsToDevice一維數組「數據」成員返回。更具體地說,我需要知道如何爲函數指定BITMAPINFO。我是否會回到Old C-style OpenCV來使用MFC?如何顯示在MFC視圖上的OpenCV墊
UPDATE:
我發現an example of SetDIBitsToDevice這實際上是老C風格的OpenCV。但將其轉換爲OpenCV2很簡單。有些事情我必須要提到,使其工作:
BPP方法不作爲墊的深度以及工作返回0。我只是改變這樣的:
static int Bpp(cv::Mat img) { return 8 * img.channels(); }
墊不具有產地會員。但簡單地把0放在FillBitmapInfo方法的原始參數上就可以了。
除此之外,下面的代碼很好用。希望這可以幫助其他開發者。
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;
}
}
}
的,什麼是錯,你提供的鏈接? – Sam
@vasile儘管在SetDIBitsToDevice上有文檔,但我無法弄清楚如何在一維數組「數據」成員返回時使用SetDIBitsToDevice。 –
@Paul我已經將你的例子看作其他幾個問題/答案的基礎。但是,我想知道,如何避免在'FillBitmapInfo'函數中使用'memset'的內存泄漏?或以某種方式自動釋放?你能否詳細說明這一點。 – adn