You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
6.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 航拍拼接模块接口说明
本模块用于吊舱的扫描全景图拼接,包含前视、下视以及特征拼接三个模式。前视与下视投影面和效果均不同。二者接口大部分相同。
特征拼接是完全基于特征的图像算法,本身存在较大的累计误差,仅用于测试和对比出图,暂时没有应用价值。
下视拼接是最广泛使用的拼接方式,可以随着载体飞行进行连续长时拼接,并生成含有地理信息
![图 0](./doc/images/e18e82d54c6ca00737f00eb3a67586664ac5b6c4f47b019ceebfdc627be2e17d.png)
前视拼接的效果接近360°全景。
![图 1](./doc/images/b739965a8710a2a6999c2dcee839776d7bdfe99423265288d2cc56b9611ba3e4.png)
## 1. 依赖
本模块依赖ceres优化库(包含gflag、glog)以及cuda支持opencv 455支持。
除cuda库外其余库均以vc14动态库文件形式提供。
使用cuda将极大加速前视极坐标拼接模块。
## 2. 下视接口
```C++
static API_UnderStitch* Create(std::string cachedir = "./cache");
```
模块创建接口其中默认参数为使用cache的路径cache将缓存需要处理的帧原始数据。
```C++
static void Destroy(API_UnderStitch* obj);
```
模块析构接口,使用完毕后释放内存。
```C++
virtual UPanInfo Init(FrameInfo info) = 0;
```
初始化接口,请使用拼接时刻的内外参信息进行初始化。初始化完成后返回全景图的参数
```C++
virtual void SetOutput(std::string name, std::string outdir) = 0;
```
设置输出路径下视模块按照通用谷歌瓦片生成标准256*256瓦片提前设置好输出文件夹。
```C++
virtual void SetConfig(UPanConfig config) = 0;
```
设置运行参数。
```C++
virtual BYTE8 Run(GD_VIDEO_FRAME_S img, FrameInfo para) = 0;
```
运行拼接流程,在该过程中程序自动将当前图像重新投影到全景图上,可以通过访问全景图内存进行实时显示。
```C++
virtual GD_VIDEO_FRAME_S ExportPanAddr() = 0;
```
获取全景图接口其中GD_VIDEO_FRAME_S是高德研发中心通用帧接口内部维护了图像类型和指针等信息。具体参见GD_VIDEO_FRAME_S接口说明
```C++
virtual SINT32 OptAndOutCurrPan() = 0;
```
全景投影完毕后,可以调用该接口进行优化,主要是精细对齐帧以及拼接缝消除等,暂未实现。
## 前视接口
```C++
static API_FrontStitch* Create(std::string cachedir = "./cache");
```
模块创建接口其中默认参数为使用cache路径前视模块不使用cache。
```C++
static void Destroy(API_FrontStitch* obj);
```
模块析构接口,使用完毕后释放内存。
```C++
virtual FPanInfo Init(FrameInfo info, ScanRange stAzRange, ScanRange stPtRange) = 0;
```
初始化接口,使用拼接时刻的内外参信息进行初始化,
```C++
virtual BYTE8 Run(GD_VIDEO_FRAME_S img, FrameInfo para) = 0;
```
运行拼接流程,在该过程中程序自动将当前图像重新投影到全景图上,可以通过访问全景图内存进行实时显示。
```C++
virtual GD_VIDEO_FRAME_S ExportPanAddr() = 0;
```
获取全景图接口其中GD_VIDEO_FRAME_S是高德研发中心通用帧接口内部维护了图像类型和指针等信息。具体参见GD_VIDEO_FRAME_S接口说明
```C++
virtual SINT32 OptAndOutCurrPan() = 0;
```
全景投影完毕后,可以调用该接口进行优化,主要是精细对齐帧以及拼接缝消除等,暂未实现。
# 附 下视拼接的标准地理产品
下视拼接过程目前是功能最为完善的,主要分为粗拼接+优化两个过程。
>**粗拼接** 是指利用外部参数信息直接利用无源定位技术对帧进行地理纠正,纠正后的数据天然具备地理属性,只需要简单的仿射变换即可显示为空间一致的底图。
>**优化** 是指利用帧间同名点匹配关系建立误差方程,迭代优化映射关系的过程。
粗拼接是整个工作流的核心,形成任意场景均有高可用性的拼接实现。而优化过程是可以关闭的,用于对拼接质量要求较高的场景或者外参误差较大的设备。
如API说明所示SDK提供了全景图的显示接口。**但我们不建议使用该全景图**,主要原因是全景显示策略与逻辑是为了便于展示算法效果和内部切瓦片使用的。对图层叠加以及漫游、回溯等高级功能难以支持。
相反的在下视算法执行期间还生成了两种标准地理数据具有通用的行业接口。能够轻松支持各类地理web、桌面端应用。
1. 单帧纠正产品
帧输入后,算法利用外参信息对图像进行地理纠正,简单说就是正北+下视校正。且给出帧的kml信息谷歌地球标准数据层
```xml
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<GroundOverlay>
<name>DJI6830</name>
<Icon>
<href>DJI6830.png</href>
</Icon>
<LatLonBox>
<north>30.267059</north>
<south>30.264926</south>
<east>114.446180</east>
<west>114.443523</west>
</LatLonBox>
</GroundOverlay>
</Document>
</kml>
```
2. 谷歌瓦片
视频输入过程中,算法根据外参变化情况自行判断执行优化时机,优化完成后会将拼接好的信息切成标准谷歌瓦片。
谷歌瓦片按照{Z}-{X}-{Y}.png形式进行命名能够被gis前端正确显示。下图是cesiumjs的可视化效果。
**因此整个执行流程可以概括为实时显示基于kml的帧并周期性的或者触发式的读取瓦片覆盖显示。**
![图 2](./doc/images/4c9281d939781e3be92bc09eda67036271172bad357c4c92863aa79385edd0ab.png)
## 变更说明
### 20250919
1. 修复了长焦初始化崩溃问题限制了全景图分辨率最大水平方向像素个数不多于1万。
2. 增加前视扫描换向判断,内部自动初始化拼接地面起始点,连续拼接不至于畸变。
3. 俯仰方向的零位由竖直向下改为水平为0更符合使用习惯。
4. 新增日志支持日志为可执行程序下“StitchLog”文件夹。
5. 原先使用1080p测试可见光改为720p后除图像宽高不同外像元尺寸应乘以1.5
![图 0](./doc/images/6f54e1028cf86058d0ecd9ebe7ab3011e82e4b35b5b193ab8b88a21817c01d50.png)
### 20250924
1. 按照外场要求,扫描方向切换不进行全景图初始化,改为多扫描几个条带后,根据位移路径大小初始化,这样可以尽可能保留更多的条带。
### 20250925
1. 补充 前视扫描全景图像方<->经纬高<->伺服导引角的关系计算
### 20251015
根据领导指示,前视拼接技术不再进一步研究
### 20251030
近期完成下视算法的改进:
1. 新增了基于se3李代数优化降低了优化参数量优化结果更有物理意义
2. 对工程结构进行重构,前视/纯特征与下视分开,所有测试代码进入./test目录
3. map/Cesium 离线下载js文件现已支持调试网内看瓦片和kml
4. 其他小改动