影像显示原理

       显示遥感影像在业界做得比较牛逼的有ENVI,Erdas,以及ArcGIS软件。其实我并不想列举ArcGIS软件,但是ArcGIS毕竟是行业的大佬,所以。。

       遥感影像一般小到几百兆大到几个G,像这个么大的数据ENVI以及Erdas等软件是如何将它们显示出来呢!其实我一开始也比较好奇,同时也比较纳闷。这么大的数据,加载进来,软件居然一点都不卡,响应效率非常高,他们是怎么做到的。

       于是我去查看杜会建老师等团队写的idlviewer_useenvi源码,里面居然调用了IDL写好的接口,我表示很难受。居然他们把这条路堵死了,那只好我自己另寻它路。一开始我使用MFC来作为显示,GDAL读取影像,但这样的方式使得我花费了很长时间将读取出来的数据构建成图片,并将它在MFC的视图View中显示出来,于是我就寻思这样显示是不是有点问题,但是就感觉不到问题出现在哪里。知道后来我接触到了Qt,并使用了里面的QGraphicsView,才发现原来显示图像有这么好的“工具”,因为QGraphicsView自带缩放,而且平移事件只需要写一点点代码就可以完成,于是我将自己原来写的代码推翻,重新在Qt下面进行重构,最后发现原来显示图像可以这么简单。这时候,我感觉我将影像显示的部分做得很完美,因为我测试的时候仅仅使用的是ENVI里面的一个小数据进行测试,发现显示起来贼快,而且显示的效果和ENVI里面的效果一模一样,当时可把自己兴奋坏了。但是当我使用大影像去跑的时候,发现显示速度很慢,一个600M的资源卫星数据,显示出来居然要15秒,我顿时感觉自己的“成就”就是一坨屎。

       为了解决这个问题,于是我去调试分析,结果才发现我是一次性将数据全部读到内存当中,然后再显示出来。现在想想,这样不卡我名字倒着写。既然发现了问题所在,我又找解决方法,找着找着,突然灵光一闪,能不能显示多大就读取多大的数据进行初始化显示,但是这样的话又会存在一个难题,也就是平移缩放等事件都要自己去处理,而不能使用QGraphicsView原来的方法。现在也就是方法已经找到了,但是实现起来可能会有点难度,但是为了将影像显示出来,再复杂也要把它干掉。

       于是我将QGraphicsView的缩放以及平移事件都进行了重写,并利用高分数据进行测试,发现效果还可以哈!居然顺畅多了,无论是打开平移还是缩放的速度都很快,几乎感觉不到有什么卡顿的情况。但是当我加载多个数据之后(因为我想测试一下多个数据会不会有什么问题)问题又有了。那就是利用任务管理器查看程序占用的内存,发现每次打开一个数据,内存都会往上跳一个,按理来说,上升的内存不应该有这么大,于是我还是去找问题所在,找啊找,找啊找,可惜的是还是没有找到原因。

       于是去找以前MFC编写的程序,两个进行了一个对比,诶,发现了问题,我用MFC写的程序,加载数据内存增加与Qt增加的内存明显少了很多,于是我自己new了一个QGraphicsItem出来,发现原来这个东西居然耗费的内存也不小。我也真是想骂人了。没办法了,只能使用最后一招了,读取显示都用自己来写了。也不能用QGraphicsView显示图像,更不能用QGraphicsItem来作为影像显示的载体了。

        经过自己不断努力,最终写出了一个自己还比较满意的显示影像的软件。后期就会往里面添加各种功能。在此,展示一下显示的效果:

关于遥感影像显示的心得

 

 

 

相关文章: