Как отображать OpenCV Mat в MFC View

Я думал, что отображение OpenCV2 Mat в MFC View - это просто, но это не так. Это единственный релевантный материал, который я нашел в Google . Извините за мое невежество, но я не могу найти никаких других материалов, показывающих, как использовать SetDIBitsToDevice с возвращаемыми членами "данных" одномерного массива. В частности, мне нужно знать, как указать BITMAPINFO для функции. Могу ли я вернуться к старому OpenCV в стиле C для работы с MFC?

ОБНОВЛЕНИЕ:

Я нашел пример SetDIBitsToDevice , который на самом деле предназначен для старого OpenCV в стиле C. Но преобразовать его для OpenCV2 оказалось несложно. Есть вещи, которые мне нужно упомянуть, чтобы заставить его работать:

  1. Метод Bpp не работает, поскольку глубина Mat возвращает 0. Я просто изменил его так:

     static int Bpp (cv :: Mat img) {return 8 * img.channels (); }
    
  2. Мэт не имеет члена происхождения. Но просто установка 0 подходит для аргумента origin метода 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; 
    } 
} 
}

6
задан Tae-Sung Shin 15 December 2011 в 00:20
поделиться