開發工具
VS2008+Qt4.8.0+GDAL1.9
要點
接口要獨立,軟件平台與算法模塊獨立,平台中各接口設計靈活,修改時容易。
設計軟件時一步步來,每個功能逐一實現,某個功能當比較獨立時可以做一個測試程序,測試無誤後將功能添加到工程中。此外,在軟件設計過程中,自身會想到一些功能,為了測試功能方案的可行性,可以單獨做一個測試示例,測試方案是否可行,這樣主動地學習可以學到很多新的知識。同時也可以增強自己解決問題的能力。
軟件的主線:
1.打開圖像後,將影像及其含有的波段數(微波圖像是極化方式)以樹形結構顯示在界面上,採用QTreeWidget;
2.雙擊某個波段或極化方式後,顯示出縮略圖,這裏記錄好波段,GDALRasterBand類指針對象。縮略圖還需保存縮小的倍數,這在後面ROI區域選擇時會用到。需要保存的值設為成員變量。
3.選擇縮略圖的某一塊區域(ROI區域),讀出該區域原始圖像數據,作為金字塔第一層,然後依次向上再構建四層,總共五層,將第五層圖像顯示在視圖中,視圖採用QGraphicsView框架。這裏有一個重點是如何讀出ROI區域代表的源圖像數據,需要根據鼠標按下和鼠標釋放時的座標求出,核心就是座標轉換。構建出的金字塔每一層的圖像(QImage)和數據(unsigned char*)都保存在容器中,這裏容器設為成員變量。
4.在視圖縮放時就是調用不同的金字塔層。
5.實現視圖中圖像拖拽的關鍵就在於重寫QGraphicsView類的鼠標移動事件,在主程序中設置一個定時器,定時跟蹤鼠標的變化,然後根據移動的位移設置滑動條。如此就實現了拖拽。
6.做算法處理時,要注意是對ROI區域源圖像數據的處理,而非保存在金字塔中的圖像數據,因為源圖像數據不一定是字節類型,而金字塔中的數據類型均為字節類型,做顯示用嘛。處理完後,以處理完後的數據為金字塔第一層,再進行構建,保存。
函數接口
這裏最關鍵的就是數據的接口,因為軟件大部分都是從涉及圖像數據的輸入輸出,還有數據的保存。
1.設計採樣讀源圖像的接口,類似於RasterIO,這裏面原理就是利用RasterIO這個接口。
template<class T>
void getImgData(GDALRasterBand* poBand,T* data,int x_off,int y_off,int x_size,int y_size,int width,int height);
2.創建高斯金字塔的接口
void createGaussImages(unsigned char *data,int width,int height);
因為使用Qt顯示圖形是採用的是RGB888的格式,因此data不是第一層圖像數據,但第一層圖像數據通過data獲得,第一層的寬為width,高為height
3.顯示視圖的接口
顯示的視圖是從金字塔中調出來的
void showImage(QImage *image);
特別注意
圖像操作中均是指針的操作,因此要特別留意指針的使用。在指針重新只想一塊地址區時都要先進性判斷,如下
if (data)
{
delete []data;
data=NULL;
}
data=new unsigned char[width*height];
此外,對於保存金字塔圖像和數據的容器,在每次金字塔構建前都要進行判斷,不為空則釋放掉容器中所有的數據和QImage*指向的內存空間,再把容器清空,然後用容器裝新的金字塔數據和圖像。