无人机几何校正以及解算稀疏和密集点云的程序完成已经有很长一段时间了,在这一段时间中本来准备将代码进行重构,可是
随着时间的推进代码越来越乱,重构的工作量也变得越来越大,几次想进行重构的工作最后不免有放弃了,最后为了那点洁癖
还是决定对代码进行重构,重构以后代码的结构如下:
<img src=http://blogimage-1251632003.cosgz.myqcloud.com/uav-calss-struct.png>
代码结构并不是多复杂,目前已经完成了主要功能类结构体的编写,主要分为以下几个部分:

  • 1.影像预处理部分,包括影像List,待匹配影像的解算以及特征点解算和影像匹配,影像List接受POS数据解算单元为参数获取POS数据;
  • 2.光束法平差部分,光束法平差部分接受影像Featrue的基类指针作为输入,通过基类的指针分别对各个派生类获取其接口函数进行统一的处理;
  • 3.POS数据解算部分,这个部分单独抽出来主要是因为POS数据解算的过程其实相对来说比较复杂,且对于各个类型的POS数据其解算的方式有所差异因此将其独立为一个部分;
  • 4.影像密集匹配部分;
  • 5.影像几何处理部分,这一部分包括几何校正,拼接等内容。

代码扩展说明:实际上对代码重构的目的就是为了能够更好的进行扩展,获得更好的内聚性和更低的耦合性,因此重构后的代码是很方便进行扩展的;
首先说明一下对于影像特征点解算和匹配的扩展,所有特征点解算的类都是继承至Feature基类,存在一个UAVProcessFeatsProvide的接口,在扩展
的过程中特征点的解算和匹配方法是可以进行扩展的,只需要编写UAVProcessFeatsProvide的接口,则不影响在光束法平差中的使用,将特征点解算
和光束法平差的耦合性降低了。
另外介绍一下POS数据处理的扩展,POS数据处理扩展为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class UAVProcessPOS:public UAV
{
public:
virtual UAVErr UAVPorcessPOSGet(std::string file,bool bGps) = 0;
virtual UAVErr UAVProcessExport(std::string file,bool rLoc) = 0;

virtual UAVErr UAVProcessPOSExtractUTM(double &centerx,double &centery,double &centerz);
virtual UAVErr UAVProcessPOSExtractXYZ(double &centerx,double &centery,double &centerz);
virtual UAVErr UAVProcessPOSExtractLocal(double &centerx,double &centery,double &centerz);
public:
POSPair posList;
};

class UAVProcessPOSSimple:public UAVProcessPOS
{
public:
virtual UAVErr UAVPorcessPOSGet(std::string file,bool bGps);
virtual UAVErr UAVProcessExport(std::string file,bool rLoc);
};

实际上整个POS数据处理系统的工作就是POS数据的读取和解算,POS数据的解算实际上解算过程主要分为三种,第一种是直接将POS数据的经纬度解算为UTM投影下的坐标,第二种为将经纬度解算为地心直角坐标系下的坐标,第三种为解算为局部坐标系下的坐标,实际上在解算过程中第三种情况应该是最好的,因为在解算过程中地心直角坐标系下的坐标能够保持数据数量级的一致性,因此求解精度相对来说会比较高,在计算过程中可以根据需要进行选择,而不同的POS数据所表现出来的差别主要体现在读取数据的过程中的差别,如果有SBET数据需要解算出POS那就另说,实际上无人机的POS应该不会需要根据SBET文件进行解算,所以也就没有什么差别了。如果有其他文件形式的POS数据只需要继承至基础的POS数据解算类就可以了,通过继承和虚函数实现多态。
另外有一点需要提及的就是关于光束法平差的问题,光束法平差类的结构让我纠结了很长时间,对于究竟是把继承至特征点解算还是独立出来这个问题我思考了很长时间,从处理流程上来看,光束法平差应该是在特征点之后的过程,但是从结构上来看,光束法平差应该与特征点解算没有关系,最后还是决定将光束法平差类独立出来,这样将特征点解算作为参数,这里有一个坑就是unique_ptr的指针竟然不支持多态,只能使用共享指针shared_ptr,这个错误纠结了我两天在这里也需要进行记录才行。目前代码就完成到这里,下面就是几何校正的一些处理,包括几何校正,影像拼接等。