开发工具web
VS2008+Qt4.8.0+GDAL1.9算法
要点框架
接口要独立,软件平台与算法模块独立,平台中各接口设计灵活,修改时容易。函数
设计软件时一步步来,每一个功能逐一实现,某个功能当比较独立时能够作一个测试程序,测试无误后将功能添加到工程中。此外,在软件设计过程当中,自身会想到一些功能,为了测试功能方案的可行性,能够单独作一个测试示例,测试方案是否可行,这样主动地学习能够学到不少新的知识。同时也能够加强本身解决问题的能力。工具
软件的主线: 学习
1.打开图像后,将影像及其含有的波段数(微波图像是极化方式)以树形结构显示在界面上,采用QTreeWidget;开发工具
2.双击某个波段或极化方式后,显示出缩略图,这里记录好波段,GDALRasterBand类指针对象。缩略图还需保存缩小的倍数,这在后面ROI区域选择时会用到。须要保存的值设为成员变量。测试
3.选择缩略图的某一块区域(ROI区域),读出该区域原始图像数据,做为金字塔第一层,而后依次向上再构建四层,总共五层,将第五层图像显示在视图中,视图采用QGraphicsView框架。这里有一个重点是如何读出ROI区域表明的源图像数据,须要根据鼠标按下和鼠标释放时的坐标求出,核心就是坐标转换。构建出的金字塔每一层的图像(QImage)和数据(unsigned char*)都保存在容器中,这里容器设为成员变量。spa
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*指向的内存空间,再把容器清空,而后用容器装新的金字塔数据和图像。