立体影像对观察量测平台(一)
打算做一個立體影像對的觀察和量測的平臺。為了防止遺忘,下面把實現步驟詳細記錄下來。
????? 擬采用單文檔程序實現,使用CxImage庫實現影像圖片的保存和顯示,使用拆分窗口分別顯示兩幅影像(或者使用一個窗口顯示互補色的兩幅影像)。
以下是詳細步驟。
?
(一)建立單文檔應用程序Stereo,視圖類CStereoView類使用CScrollView類為基類,便于以后視圖滾動,其余默認。
??????? 添加2個新視圖類(以默認的CStereoView類為基類)CLeftView和CRightView,用于顯示分割后的兩個左右視圖。
注意:這里兩個派生視圖類需要通過VC的類生成向導進行生成,且需要先使用MFC的CView類為基類,生成后再更改其基類為CStereoView類。否則在后面的CreateView函數中不符合RUNTIME_CLASS參數要求。
(二)建立分割窗口。
在CMainFrame類下添加:
CSplitterWnd類變量m_wndSplit,?? // 分割窗口
BOOL類型變量m_bCreateSpltr,???? // 是否已創建分割窗口,主要是用于OnSize消息中分隔欄的位置調整
BYTE類型變量m_btImageNum,????? // 判斷讀取的圖像應該存入哪個對象
OnSize消息??????????????????????????????????? // 調整窗口大小及分割欄的位置(居中)
OnCreateClient消息?????????????????????? // 實現分割窗口的功能
在OnCreateClient消息中實現分割窗口:
首先在當前框架下創建1行2列的分割窗口,m_wndSplit.CreateStatic(this,1,2)。創建成功,設置m_bCreateSpltr為真。
然后獲取客戶區大小,GetClientRec(rc)。
為分割窗口創建2個視圖,每個視圖寬度為客戶區寬度的一半,m_wndSplit.CreateView(0,0,RUNTIME_CLASS
(CLeftView),CSize(rc.Width()/2,rc.Height()),pContext);??? // (0,0)為左視圖,(0,1)為右視圖
設置分隔欄的位置,使其始終居中,即令兩個分割窗口始終大小相同,平分整個客戶區,該功能在OnSize消息中實現:
當分割窗口創建成功時,設置m_wndSplit的列寬為整個客戶區寬度的一半:
m_wndSplit.SetColumnInfo(0, rc.Width()/2, 0 )
然后重新計算顯示分割窗口:m_wndSplit.RecalcLayout()。
分割后的結果如圖:
?
(三)使用CxImage類庫加載和顯示圖像。
????? CxImage是一個源碼公開的免費的圖像操作庫,支持絕大多數圖像格式的讀寫和變換操作,使用它可以省去我們很多工作,我們不再需要針對各種圖像格式編寫相應的讀寫函數,從而利于我們將精力集中到要實現的主要功能上。現在CxImage庫最新版本是7.0,這里使用的是6.0版本。CxImage的詳細介紹見文章“CxImage圖像庫的使用”。
??????使用CxImage庫之前需要注意以下事項:
1.應用程序與CxImage的編譯版本必須一致,即應用程序是Debug,則CxImage庫也必須是Debug版。
2.VC環境設置為以下:
C++ --> Code Generation --> Use run-time library:Multithreaded DLL或Debug Multithreaded DLL
C++ --> Precompiled Headers:Not using precompiled Headers
C++ --> Preprocessor --> Additional include dircotories?:../CxImageInclude?? (CxImage庫頭文件的存放目錄)
Link -->General --> Object/library modules:至少添加一個cximage.lib,可以支持bmp、gif等格式的圖片,如果要支持jpeg、tiff等格式的圖片,需要再添加其他庫,這些庫都可以通過CxImage源碼工程生成。這里將lib文件都放置在工程目錄下的CxImageLib目錄下,因此這里填入的是:CxImageLib/cximage.lib CxImageLib/Jpeg.lib CxImageLib/Tiff.lib
Link --> Input --> Object/library modules:同上。
3.環境設置完即可以使用CxImage庫進行圖像的讀取和顯示操作了。
???? ?這里將圖像數據存放在文檔類中,即在CStereoDoc類中添加CxImage類的變量:m_xImage, m_xImageLeft, m_xImageRight。其中后兩個變量分別存放左右兩張影像,第一用于存放經過紅藍顏色合成后的影像。
??? ? 此外,為了使文件打開能自動識別左右,還需要添加一個BOOL變量:m_bLeftImage。
?? ?? 添加文件打開響應消息:OnFileOpen()。在該函數中設置文件打開對話框的文件格式過濾為我們支持的格式,如bmp、gif、jpeg、tiff等:
CString szFileExt = _T( "圖像格式文件(*.bmp,*.jpg,*.gif,*.tiff)|*.bmp;*.jpg;*.gif;*.tiff||" ) ;
CFileDialog fdlg( TRUE, NULL, NULL, NULL, szFileExt, NULL ) ;
?????? 讀取打開文件之前首先判斷要打開的是哪張圖像,左圖還是右圖。fdlg.DoModal后通過獲取文件名后綴來確定圖像文件的格式,然后調用相應的CxImage對象加載圖像:m_xImageLeft.Load( szFilePath, nImageType );
?????? 加載完圖像后,通知相應視圖顯示該圖像:pView = (CStereoView*)(((CMainFrame*)AfxGetMainWnd())->m_wndSplit.GetPane(0,0)); pView->Invalidate( FALSE ) ;
?????? 圖像的顯示需要在相應的視圖類中OnDraw函數中進行,首先判斷CxImage對象是否有效,如果已讀取了圖像,則顯示圖像:
pDoc->m_xImage.Draw( this->GetDC()->GetSafeHdc() ) ;
總結
以上是生活随笔為你收集整理的立体影像对观察量测平台(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux蓝屏修复工具,linux双系统
- 下一篇: 字幕编辑软件 SrtEdit 2012