日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mat 显示到MFC中Pictrue Control的问题

發(fā)布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mat 显示到MFC中Pictrue Control的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

時代在進步,近期忙于工作,好久沒能坐在辦公室寫點關于技術的東西了,想想感覺畢業(yè)后工作的幾年丟掉了自己的老本行,沒有在程序的海洋里徜徉,而是為了應付客戶和領導開始不斷背離初心。終于現(xiàn)在又有時間寫點東西了,很開心,我又回來了。

好了,閑言碎語不要講,講講今天要說的東西。

以前顯示到Picture Control用的是Iplimage*,但是隨著opencv的不斷更新,我發(fā)現(xiàn)opencv作者們開始主推Mat,我們下邊的也只能順應時代。

?

直接上代碼

void CMultipleCameraDlg::ShowMatImgToWnd(UINT ID, const Mat& disimg)//Mat圖像加載到picture control函數(shù) {CWnd *pictureWnd = GetDlgItem(ID);if (disimg.empty()) return ;static BITMAPINFO *bitMapinfo = NULL;static bool First = TRUE;if (First){BYTE *bitBuffer = new BYTE[40 + 4 * 256];//開辟一個內存區(qū)域if (bitBuffer == NULL){return;}First = FALSE;memset(bitBuffer, 0, 40 + 4 * 256);bitMapinfo = (BITMAPINFO *)bitBuffer;bitMapinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bitMapinfo->bmiHeader.biPlanes = 1;bitMapinfo->bmiHeader.biCompression = BI_RGB; //位圖壓縮類型,必須是 0(不壓縮), 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一for (int i = 0; i<256; i++){ //顏色的取值范圍 (0-255)bitMapinfo->bmiColors[i].rgbBlue = bitMapinfo->bmiColors[i].rgbGreen = bitMapinfo->bmiColors[i].rgbRed = (BYTE)i;}}bitMapinfo->bmiHeader.biHeight = -disimg.rows;bitMapinfo->bmiHeader.biWidth = disimg.cols;bitMapinfo->bmiHeader.biBitCount = disimg.channels() * 8;CRect drect;pictureWnd->GetClientRect(drect); //pWnd指向CWnd類的一個指針 CClientDC dc(pictureWnd);HDC hDC = dc.GetSafeHdc(); //HDC是Windows的一種數(shù)據(jù)類型,是設備描述句柄;SetStretchBltMode(hDC, COLORONCOLOR);StretchDIBits(hDC,0,0,drect.right, //顯示窗口寬度drect.bottom, //顯示窗口高度0,0,disimg.cols, //圖像寬度disimg.rows, //圖像高度disimg.data,bitMapinfo,DIB_RGB_COLORS,SRCCOPY); }

這一段代碼主要用的就是下邊這個

StretchDIBits(hDC,
????????0,
????????0,
????????img.cols,//drect.right, //顯示窗口寬度
????????img.rows,//drect.bottom, //顯示窗口高度
????????0,
????????0,
????????img.cols, //圖像寬度
????????img.rows, //圖像高度
????????img.data,
????????bitMapinfo,
????????DIB_RGB_COLORS,
????????SRCCOPY
????????);

在使用過程中我發(fā)現(xiàn)有得圖像顯示的沒問題,但是設置Mat srcROI( src,cvRect(m_ROIX, m_ROIY,roiwidth,roiheight));感興趣區(qū)域后,就不對了,數(shù)據(jù)有錯亂,后來終于找到問題出現(xiàn)原因:是因為字節(jié)對齊不一致。

假定位圖頭和調色板完全正確。顯示錯誤的原因:位圖每行數(shù)據(jù)都4字節(jié)對齊,OpenCV的cv::Mat沒有這個對齊。所以數(shù)據(jù)會錯位。
?

?

接下來在網上找到了強大的網友給出的另一個方案,這個就沒問題了

void LoginDlg::ShowMatImgToWnd(UINT nID, const Mat& srcImg) //Mat顯示 {cv::Mat imgTmp; CRect rect; GetDlgItem(nID)->GetClientRect(&rect); cv::resize(srcImg, imgTmp, cv::Size(rect.Width(), rect.Height())); // 統(tǒng)一轉換為 CV_8UC4 switch (imgTmp.channels()) { case 1: cv::cvtColor(imgTmp, imgTmp, CV_GRAY2BGRA); // GRAY --> BGRA(CV_8UC4) break; case 3: cv::cvtColor(imgTmp, imgTmp, CV_BGR2BGRA); // BGR --> BGRA(CV_8UC4) break; default: break; } // 計算一個像素多少個字節(jié)// 其實這里可以換成常量 int pixelBytes = imgTmp.channels()*(imgTmp.depth() + 1); // 使用 BITMAPINFO 結構體創(chuàng)建一個數(shù)據(jù)頭 BITMAPINFO bitInfo; bitInfo.bmiHeader.biBitCount = 8 * pixelBytes; // 可以換成常量24 bitInfo.bmiHeader.biWidth = imgTmp.cols; bitInfo.bmiHeader.biHeight = -imgTmp.rows; bitInfo.bmiHeader.biPlanes = 1; bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bitInfo.bmiHeader.biCompression = BI_RGB; bitInfo.bmiHeader.biClrImportant = 0; bitInfo.bmiHeader.biClrUsed = 0; bitInfo.bmiHeader.biSizeImage = 0; bitInfo.bmiHeader.biXPelsPerMeter = 0; bitInfo.bmiHeader.biYPelsPerMeter = 0; // 顯示 Mat // Mat data + BITMAPINFO --> MFC DigItem CDC *pDC = GetDlgItem(nID)->GetDC(); ::StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(), rect.Height(), imgTmp.data, &bitInfo, DIB_RGB_COLORS, SRCCOPY ); ReleaseDC(pDC); }

?

總結

以上是生活随笔為你收集整理的Mat 显示到MFC中Pictrue Control的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。