一、研究的原因
1 视频拼接的时候需要在经度上矫正
2 维度尽量保持
具体看以下图,下图是两幅图片的拼接图像,为了看清楚,留了有一条明显的接缝
当然依然没有拼接好,如果使用纯粹的摄像机参数 k,d 14或者15个参数来做矫正,会发现相当难以拼接,再进行 使用了倒抛物线 考虑使用非线性变换来拉伸经度线,维度保持弯曲,以下先说明以前的做法:使用相机参数来矫正,相机参数说明
1.1 K D 参数说明
K = [ fx 0 cx ]
[ 0 fy cy ]
[ 0 0 1 ]
fx 和 fy:焦距参数(像素单位)
表示相机在水平(x)和垂直(y)方向上的焦距,反映了相机对光线的汇聚能力。
物理意义:若相机传感器像素尺寸为 dx、dy(单位:mm / 像素),实际焦距为 f(单位:mm),则:
cx 和 cy:主点坐标(像素单位)
表示相机光轴与图像平面的交点(主点)在图像坐标系中的位置,通常位于图像中心附近。
物理意义:若图像分辨率为 W×H(像素),理想情况下 cx≈W/2,cy≈H/2,但实际标定中可能因安装误差略有偏移。
畸变系数 d : k1、k2、k3:径向畸变系数
切向畸变 p1,p2
普通镜头,常用d = [k1, k2, p1, p2]
鱼眼镜头, 常用 d = [k1, k2, k3, p1, p2]
使用标定法进行参数标定后,就可以对图像进行矫正,目标是将图像在经度和纬度上完全拉直,没有问题,可以做到,但是对于不同的相机而言,就算是同一型号,也未必参数一致,问题倒也不是这个 ,无论从数学上和解决问题的繁琐上来说,都是需要创新的,我思考和实验了良久,应该使用一种统一的数学模型一次解决矫正问题,而不是需要准备多次,争取拿到一个相机,拿到一副图像就可以进行矫正来进行:
- 可以做更加符合人眼视觉的播放
- 可以图像拼接
- 可以做三维融合
再进行kd 参数的复杂标定以后,还要进行算法测试,问题是:
- 可能会像素缺失,肯定要裁剪
- 对于不熟悉标定的程序员不友好
- 纬度上同时矫正以后拼接需要再次投影
于是我们使用倒抛物线进行创新的图像和视频矫正,不用标注,不用进行多次测试,直接达到一副图像就可以进行矫正,直接可以进行拼接,无需再进行投影算法,效率提升,节省了时间
1.2 数学原理
依图看,cx,cy为图像的中心,目标是离开图像中心(cx,cy)越远,改变越大,
以下是基本算法代码,假定是沿着一个圆,离中心越来越远的地方需要矫正的强度越强,离中心越近的地方接近于不矫正,可以依据以下算法开发出各种的图像矫正方法。
std::tuple<Mat, Mat> Longitude_correction(int R)
{
Mat mapx = Mat::zeros(2 * R, 2 * R, CV_32F);
Mat mapy = Mat::zeros(2 * R, 2 * R, CV_32F);
for (int i = 0; i < mapx.rows; ++i) {
for (int j = 0