传统图像拼接的流程已经很成熟了,参考论文
Brown M , Lowe D G . Automatic Panoramic Image Stitching using Invariant Features[J]. International Journal of Computer Vision, 2007, 74(1):59-73。
07年之后图像拼接的发展参看https://www.zhihu.com/question/34535199/answer/135169187
虽然图像拼接方向不断在发展,但是大部分都是建立在单应性矩阵的基础上。Opencv里面实现了完整的传统图像拼接流程。如果要自己实现图像拼接,有两种途径:
1.相机位置不固定,这时候图片之间的外参是不断变化,需要从sift或者orb特征点检测做起。
2.相机位置固定,这时候图片之间的内外参都是不变的。因此在视频图像拼接中,没有必要对没传进来的图像都进行特征点检测和匹配,这样反而浪费了许多时间。可以使用固定内外参的原因也可以参照这篇论文。
Suk J H , Lyuh C G , Yoon S , et al. Fixed Homography-Based Real-Time SW/HW Image Stitching Engine for Motor Vehicles[J]. ETRI journal, 2015, 37(6):1143-1153.
如果相机位置固定,那么事情就变简单多了,只需要进行投影变换和图像融合两部就行了。关于全景图像的生成,opencv是这样实现的:
1.确定基准图像
2.基准图像进行圆柱面正投影确定基准图像在最终全景图上的左上角坐标(其实左下角,因为正投影是倒立成像的,所以全景图左下角坐标即是基准图左上角坐标)和右下角坐标。
3.圆柱面反向投影,生成两张坐标Xmap和Ymap,根据Xmap和Ymap进行双线性插值,得到最终的投影图像。
4.其他图像按照各自的内外参也进行正投影和反投影,得到投影图像、左上角坐标和右下角坐标。
5.根据每幅图像在全景图像不同的坐标,采用合适的方法进行图像融合。
整个过程可以参照下图:
理解原理再来进行FPGA实现。
1.投影变化得到的坐标点、内外参数作为输入;
2.输出是双线性插值所需要的地址表和权重表。
原理参照:https://blog.csdn.net/zhaocj/article/details/78829736
Opencv和Verilog代码:https://github.com/mhhai/ImageStitchBasedOnFPGA
仿真结果表明是一样的。
由于Z的值在0.98~0.99之间,这个除法就没有做。
其他:
1.计算sin和cos函数:最好使用IP核,更灵活一些。
2.需要用到定点数乘法。
3.代码会不断完善。