# pano

全景图像拼接

原本是想解决网络遥控车的视角太小，不能有效观察周围情况问题，找到了广角镜头。
后来发现竟然可以用两个超过180°的摄像头拼接全景图片。

但是在网上没有找到效果好的实时全景传输项目，所以自己做一个。

我理解的全景图片生成应该主要是3个步骤
1、把图片摊平，这个步骤的学名未知。可能是将鱼眼原图（等角图片）展开成等距图片。
2、将两个鱼眼镜头的等距图分成3份，并进行水平拼接
3、拼接图按照给定的角度在还原成等角图

为了可以做到即时（30FPS），需要尽可能的提高效率。
目前最大的效率瓶颈是在拼接上。

## 调研拼接3张水平图片效率  

技术上打算采用opencv 的 stitcher，先试试看。

`opencv 用 4.X 吧，尽量用新一点的东西。`

## 2023-05-24 进展

目前的拼接还是完全自己写的，原因是所有第三方提供的方案均不能有效的对我的图片进行拼接。
可能是我的参数有问题，但是我的需求相对简单并且我对拼接效率有要求，所以就自己写了。

写的过程还是挺顺利的，由于我的摄像头是背靠背绑在一起的，所以他们的水平同步和角度偏差是不大的，所以我放弃了拼接时进行旋转和扭曲。
拼接中对图片只有平移，这对图片首尾相连还是很有帮助的。

目前拼接的图片效果还是不错的，拼接效率上没有测试，从代码上看起来，应该是足够高效的。

## 封装思路

为了更加模块化，封装思路如下：
1、贯彻单视频流方案，虽然涉及拼装切分，单比起双倍的编码和解码，还是要好很多的。所以输入的视频流是两个摄像头的拼接视频流。
横向拼接，分辨率一致，帧率一致，编码一致，码率一致。
这里可以简化成输入两张（一张）图片，视频流的处理还是放到视频流的相关模块中。
2、校准主副镜头，由于目前的两个摄像头都是usb摄像头，usb的可插拔等特性导致，每次启动时，主副镜头的顺序都可能不一致，所以需要校准。
3、校准主副镜头的图像，即圆心+半径。这里由于是超级广角，所以图像是一个圆，但是随着镜头的物理位置不稳定，需要进行校准。这里会强制要求两个图片的半径一致，即获得的等距投影图分辨率一致。
4、拼接矫正，尝试用等距投影进行拼接。
以上校准全部保存校准结果至本地文件，当本地文件不存在，强制要求校准，否则不需要校准。如果有必要可以随时进行校准。
5、拼接输入图片，这是一个全流程，输入一张图片（横向拼接原图输入），输出一张图片（等距投影拼接）。

暂时封装成一个类。
