核线影像的坐标转换

核线影像介绍

核线影像(Epipolar image)是摄影测量的概念,可以看到计算机视觉不是这个说法,叫什么对极几何。当然,不管怎么叫法,都是一样的,指同名点在同一条直线上。

记得在摄影测量的课程上是通过左右影像的水平核线采样实现的,可以参考摄影测量的教材,这个方法对于航空影像和卫星影像适用,但是,对于拍摄角度相差较大时,产生的变形太大,目前都是用计算机视觉的方法,可以参考《Multiple_View_Geometry_in_Computer_Vision》。

核线影像坐标到原始影像

通过计算机视觉的方法,计算出homography矩阵对影像进行变换。实际应用上,得到的是影像新的旋转矩阵,在个变换过程中,相当于影像有了新的外方位元素,焦距也是没有变的:核线影像有新的内外方位元素

实际上,外方位元素也只有旋转矩阵发生变化,如果不考虑多视交会,可以直接用新的内外方位元素计算三位坐标。这个地方也是与摄影测量不同的地方,就是用摄影测量的方法,核线影像是一个临时的,没有定位信息,密集匹配结果要转换到原始影像才能计算三维坐标。

如果涉及核线影像的坐标到原始影像的坐标,那就是涉及到一个变换 :

相机的位置不变,只是旋转矩阵变化了

这个问题也设计到全景影像的拼接,实质是一样的,可以参考文档

几何变换

具体几何变换可以参考《Multiple_View_Geometry_in_Computer_Vision》8.4.5和《Computer Vision: Algorithms and Applications》的Mapping from one camera to another

公式为: \begin{align} x_2=K_2 R_2 R_1^{-1} K_1^{-1} x_1 \end{align} 其中$x_1$是在核线影像(相机1)的坐标,$K_1$是核线影像(相机1)的内方位矩阵,$R_1$是核线影像(相机1)的旋转矩阵,$K_2$是原始影像(相机2)的内方位矩阵,$R_2$是原始影像(相机2)的旋转矩阵。

下面是主要的代码,依赖Eigen :

// epi_xx是核线影像对应的参数
// org_xx是原始影像对应的参数
Eigen::Vector2d GlobTransfoEpip(Eigen::Vector2d epixy, CImgCameraIOP * pEpiCameraIop, Eigen::Matrix3d epiExtrinsicRotate, CImgCameraIOP * pOrgCameraIop, Eigen::Matrix3d orgExtrinsicRotate)
{
    double x3 = 0;
    double y3 = 0;
    // K-1 * x
    pEpiCameraIop->Image2World(epixy(0), epixy(1), & x3, & y3);

    Eigen::Vector3d worldxyz;
    worldxyz(0) = x3;
    worldxyz(1) = y3;
    worldxyz(2) = 1.0;

    Eigen::Vector3d aC = epiExtrinsicRotate.inverse() * worldxyz;
    Eigen::Vector3d orgxyz = orgExtrinsicRotate * aC;

    double worldx = orgxyz(0)/orgxyz(2);
    double worldy = orgxyz(1)/orgxyz(2);

    double x = 0;
    double y = 0;

	// K * x
    pOrgCameraIop->World2Image(worldx, worldy, & x, & y);

    Eigen::Vector2d orgxy;
    orgxy(0) = x;
    orgxy(1) = y;

    return orgxy;
}

最后,如有不对的地方,请批评指正。