MFC架構下使用OpenCV:
OpenCV的圖片在MFC中使用通常採用CvvImage類,這個類的成員函數DrawToHDC可將點陣圖整體經縮放後顯示到視圖視窗中,解決了點陣圖的顯示問題,也就解決了OpenCV在MFC中的使用問題,但是也產生兩個問題:
1.MFC圖片視窗很可能和原始圖長寬比例不同,不處理會造成圖片變形。
2.OpenCV函式庫的函式大部分使用IplImage,要顯現在MFC的視窗勢必要轉換成CvvImage。
CvvImage使用注意事項:
1.必須 #include<highgui.h>
2.由於在CvvImage類別中有#define CImage CvvImage此一巨集,怕與CImage衝突,所以此巨集可以刪除。
3.如果函式參數中含有HDC,很可能無法移植去其他平台。
劃出視窗框架:
CPenPen;
CDC *thisDC=thisDlg->GetDlgItem(IDC_SHOWIMAGE)->GetDC();
Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
thisDC->SelectObject(&Pen);
CvvImage和MFC圖片視窗配合:
1.(CWnd::GetDlgItem()功用為得到得到指向視窗物件的指標)
2.(CWnd::GetWindowRect()功用為得到此視窗相對於螢幕座標的參數)
GetDlgItem(IDC_SPIC_SHOW(顯現視窗的識別子))->GetWindowRect(&SPicRect(自訂的CRect結構));
令dScaleX=視窗寬 / 圖片寬,
令dScaleY=視窗高 / 圖片高,
int iSizeX(圖片顯現在視窗的寬度), iSizeY(圖片顯現在視窗的高度),
iOffsetX(X方向位移量), iOffsetY(Y方向位移量);
if(dScaleX<dScaleY){
iSizeX=視窗寬;
iSizeY=圖片高*dScaleX;
iOffsetX=0;
iOffsetY=(視窗高-iSizeY)/2;
}
else{
iSizeX=圖片寬*dScaleY;
iSizeY=視窗高;
iOffsetX=(視窗寬-iSizeX)/2;
iOffsetY=0;
}
3.令圖片顯現在ShowRect(一自訂的CRect結構)範圍內:
ShowRect.left =iOffsetX;
ShowRect.right =iOffsetX+iSizeX;
ShowRect.top =iOffsetY;
ShowRect.bottom=iOffsetY+iSizeY;
顯現CvvImage:
1.自訂一CvvImage結構CvvShowImage
2.CDC *thisDC=thisDlg->GetDlgItem(IDC_SPIC_SHOW)->GetDC()
3.CWnd::GetDC()得到指向CDC 的指標,來讓GetSafeHdc()使用
4.CDC::GetSafeHdc()得到裝置內文的handle
5.CvvImage::DrawToHDC(hDC,&rect)將此CvvImage顯現在ShowRect上,如果圖和視窗大小不同,圖像會伸縮
CvvShowImage .CopyOf(IplShowImg,3(圖像通道數));
CvvShowImage .DrawToHDC(thisDC->GetSafeHdc(), &ShowRect);
留言列表