MFC+opencv 顯示mat圖像

VS2015+opencv3.0 MFC顯示圖片中方法三在使用時,

  • 只能顯示彩色圖像,灰度圖像顯示有問題,經查找,是沒有設置圖像調色板的原因
  • 圖片控件寬度不爲4的倍數 顯示錯誤, 修改

代碼

/*****************************************************
*
* 函數名稱: void DrawcvMat(cv::Mat m_cvImg, UINT ID)
* 函數功能: 在picture control中顯示圖像,設置Freame或者rectangle都可以
*
* ****************************************************/
void CMFC_showImageDemoDlg::DrawcvMat(cv::Mat m_cvImg, UINT ID)
{ 
    cv::Mat img; 
    CRect rect; 

    GetDlgItem(ID)->GetClientRect(&rect);
    if (rect.Width()%4 != 0)
    {
        rect.SetRect(rect.left, rect.top, rect.left + (rect.Width() + 3) / 4 * 4, rect.bottom);  //調整圖像寬度爲4的倍數
        GetDlgItem(ID)->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOMOVE);
    }

    cv::Rect dst(rect.left, rect.top, rect.right, rect.bottom); 
    cv::resize(m_cvImg, img, cv::Size(rect.Width(), rect.Height()));  //使圖像適應控件大小 

    unsigned int m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];  
    BITMAPINFO* m_bmi = (BITMAPINFO*) m_buffer; 
    BITMAPINFOHEADER* m_bmih = &(m_bmi->bmiHeader); 
    memset(m_bmih, 0, sizeof(*m_bmih)); 
    m_bmih->biSize = sizeof(BITMAPINFOHEADER); 
    m_bmih->biWidth = img.cols;   //必須爲4的倍數
    m_bmih->biHeight = -img.rows; //在自下而上的位圖中 高度爲負
    m_bmih->biPlanes = 1; 
    m_bmih->biCompression = BI_RGB; 
    m_bmih->biBitCount = 8 * img.channels(); 

    if (img.channels() == 1)  //當圖像爲灰度圖像時需要設置調色板顏色
    {
        for (int i = 0; i < 256; i++)
        {
            m_bmi->bmiColors[i].rgbBlue = i;
            m_bmi->bmiColors[i].rgbGreen = i;
            m_bmi->bmiColors[i].rgbRed = i;
            m_bmi->bmiColors[i].rgbReserved = 0;
        }
    }

    CDC *pDC = GetDlgItem(ID)->GetDC(); 
    ::StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(), rect.Height(), img.data, (BITMAPINFO*) m_bmi, DIB_RGB_COLORS, SRCCOPY ); 
    ReleaseDC(pDC); 
}

來張效果圖 (雖然lenna是經典,但我還是更喜歡胖迪^-^)

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章