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);

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 阿洲 的頭像
    阿洲

    阿洲程式天地

    阿洲 發表在 痞客邦 留言(0) 人氣()