【SFS线性化方法】Tsai方法在侧扫声呐中的应用(二)

本篇主要阐述图像预处理部分和像素到高度的转换,以及DV软件和XTF文件的分析与使用

一、XTF文件解析

\quad\quad 首先是xtf文件格式的定义,是在 https://www.ecagroup.com/上有官方定义,目前(2022)最新的版本是Rev.42,我们首先先研究一下该文档,从而为xtf文件解码做准备。需要提一下的是,在解析的过程中,需要方便查看xtf文件,推荐使用ultraedit软件,其他软件解码时出现部分错误,会产生一定的误导。
\quad\quad 在分析之前,需要了解一个概念,就是字节序的问题。在文档中有如下阐述:Except for some bathymetry data (which is logged “raw”), all data is written with Intel 80x86 byte ordering (LSB to MSB). 这种字节序实际上就是Little-Endian,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端.这里举个例子来仔细说明。
\quad\quad 例如在文档中有如下阐述在这里插入图片描述 \quad\quad 需要MagicNumber这个属性值必须是0xFACE,但是由于字节序的缘故,两个十六进制数为一个字节,应当是CE FA这样存放,我们在ultraedit中进行验证,结果如下图

\quad\quad 需要注意的是,文档里给这个MagicNumber的格式描述是WORD,也就是两个Byte,因此我们在每一个独立的变量(存储器)中只需要倒序这两个Byte即可,而不需要将不相关的数据统统倒序。有了以上了解后,下面我们开始对XTF整体结构进行一个阐述,所选用的例子是美国纽约哈德孙河klein 3000侧扫声呐的xtf文件,下载地址可以参见https://blog.csdn.net/SuperiorEE/article/details/122748739
\quad\quad 首先是整体文件的结构,也就是最顶层的结构,分为数据包,头的数据结构是XTFFILEHEADER,数据包的数据结构是XTF PACK,这两个结构内又有细分的结构,我们在下面会进行解读。

XTF文件的顶层划分,一个Header和一系列Packet

\quad\quad 在上图中我们注意到,会有additional CHANINFO,这个我们暂时不必关心,因为一般是不会超过6通道的,一般的XTFFILEHEADER就是1024Bytes,地址从0x0000-0x03FF.下面我们分别详细介绍二级划分,即XTFFILEHEADER和XTF PACKET的内部结构。
\quad\quad 下图就是XTFHEADER的内部结构,其中前256Bytes(0x0000-0x00FF)是格式信息和软硬件使用信息,例如开头第一个字节是7B的,即为XTF格式。

\quad\quad 之后我们来到0x0100、0x0180、0x0200这三个CHANINFO。在此之前需要说明,CHANINFO的排列顺序是普通声呐在前,深度测量声呐在后。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

\quad\quad 我们把这三个通道对比来看,第一个字节代表了该通道声呐种类,1通道是左舷(PORT),2通道是右舷(STBD),3通道是海底探查器(SUBBOTTOM)。接下来一个Byte是通道序号数。然后Offset为6的一个WORD(三个通道都是02 00)我们将其逆转为00 02,查表可知,每个通道的声呐都是16位数据
\quad\quad 继续往下阅读,我们发现CHANINFO中有float类型的成员变量,例如下面这个

\quad\quad 我们需要了解标准float数据存放格式。浮点型变量在计算机内存中占用4字节(Byte),即32-bit。遵循IEEE-754格式标准。一个浮点数由2部分组成:底数m 和 指数e。
± m a n t i s s a × 2 e x p o n e n t ±mantissa × 2exponent ±mantissa×2exponent
\quad\quad 例如,Contents: SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
\quad\quad S: 表示浮点数正负,1为负数,0为正数
\quad\quad E: 指数加上127后的值的二进制数
\quad\quad M: 24-bit的底数(只存储23-bit)

\quad\quad 如图可以发现,第一个通道(CHANINFO)的VoltScale存储的是00 00 A0 40,因为是小端顺序存放,应当倒序为40 A0 00 00,由于算法比较繁琐,这里直接采用转换网站http://www.binaryconvert.com/进行转换,结果是5.0,即给出的默认值。
\quad\quad 到下一个通道前,本通道的其他数据都未给出(为0),头部分析完毕,接下来我们对XTF PACKET结构进行分析。
\quad\quad 一个典型的XTF PACKET的结构如下图

\quad\quad 其中,XTFPINGHEADER中的NumChansToFollow成员变量决定了后面跟随的通道数。

\quad\quad 如果是测深数据,则XTF PACKET形式如下

\quad\quad 下面我们从0x0400开始比对结构中的成员变量。首先是XTFPINGHEADER或者XTFBATHHEADER这个子结构,第一个成员变量是MagicNumbr之前有提到,应当是0xFACE,存储器中应当是CE FA,可以在编写程序时用于判断是否为每一帧的包头。
在这里插入图片描述
\quad\quad 发现NumChansToFollow为1,NumBytesThisRecord值为832(这一Ping含本Ping头的总字节数),十六进制为0x0340,我们将0x0400+0x0340得到0x0740,找到0x0740,发现的确是下一个XTFPINGHEADER
在这里插入图片描述
\quad\quad 我们接着根据逆序后的4C 00 偏移地址往后找,得到0x5400,从而验证了其正确性
在这里插入图片描述 \quad\quad 现在我们先回到第一个XTF PACKET,查表可知,XTFPINGHEADER的大小是256Byte,因此第一个XTF PACKET中XTFPINGHEADER的范围是0x0400到0x04FF,因此0x0500就是XTFPINCHANHEADER内容。这里本例给的信息不全,我们先不分析。XTFPINCHANHEADER共64Byte,即偏移地址40.因此我们找到0x0540,就是第一个包第一个通道的数据。
\quad\quad
\quad\quad

二、重要成员变量提取

\quad\quad 此外还有一些重要的成员变量,我们将对其进行罗列。在XTFPINGHEADER中有如下成员变量,SensorDepthSensorPrimaryAttitude

在这里插入图片描述 \quad\quad 由于之前给的klein3000声呐xtf数据中,这几个结构成员变量是缺省的,因此我们给出了上面这个俄罗斯学者探索者侧扫声呐的数据,可以看到SensorDepth(它代表了拖鱼距离海面高度)和SensorPrimaryAttitude(它代表了拖鱼距离海底高度)的存储值分别是A8 C6 A7 40 和B6 F3 1D 3F,我们对其进行倒序并转为float,得到5.24m和0.61m。其实在klein3000声呐xtf数据中,我们发现,在所给的哈德孙河示例中的Packet的类型是kelin头的包和标准侧扫的包交替的,我们来到标准侧扫的XTFPINGHEADER可以看到如下,其实SensorPrimaryAttitude的值还是有的,是27.67m,即我们在上一篇文章中讲到的H,这在我们之后进行斜距校和三维重建初始化中是十分有用的。
在这里插入图片描述 \quad\quad 除此之外,XTFPINGCHANHEADER结构中也有重要的成员变量,如
SlantRange,它代表了声呐斜距范围,也就是DV软件中左舷和右舷的最大标度,本例中如下图可以看出倒序为42 C8 00 00 代表斜距范围为100米。

\quad\quad 而仅仅知道这些还是不够的,在侧扫声呐XTF文件原始图像处理中,除了斜距校正,还有增益补偿拼贴(Mosic)。由于增益补偿不需要依赖更多的额外变量,我们这里来看拼贴。
\quad\quad 拼贴的本质是将侧扫声呐处理过后的图像拼贴在真实地理世界的地图上,因为船航迹不一定是直线,同时我们上文在DV软件中提到横向同样的图上距离和纵向同样的图上距离却代表着不同长度的实际距离。由于我们目前聚焦于小范围的海底重建,可以根据微元思想认定航迹为直线,因此我们需要做的仅仅是保证横向和纵向同样像素长度所代表的实际长度统一,需要对纵向进行伸缩
\quad\quad 横向单位像素实际长度可以简单地用平距/横向像素数目得到,而纵向单位像素实际长度需要用另外的方法计算。
\quad\quad 我们在XTF格式文档中分别在XTFPINGHEADERXTFPINGCHANHEADER结构中可以看到如下成员变量,SensorSpeedSecondsPerPing,我们利用ultraedit找到其值,分别为逆序后的40 89 77 F9 和 3E 08 88 89,合4.30节和0.13秒,我们将速度和时间相乘,得到每Ping的宽度为0.2876m.而由于我们是借助DV软件间接读取的,这里不能保证一个像素宽度就是一PING,除非我们自己处理数据。这里只是这么近似认为,如果需要追求精确度,应当自主编写程序处理所有数据,这将在后面几节进行详细说明。当我们得到纵向像素宽度ym和横向图像宽度xm后,我们只需要对图像进行纵向缩放即可,纵向拉长 y m / x m y_m/x_m ym/xm倍。

\quad\quad 下图演示了拉伸前后对比。

缩 放 前 \quad缩放前

缩 放 后 \quad缩放后

\quad\quad
\quad\quad

三、重要成员变量的提取程序流程

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值