核线影像的坐标转换
blog
核线影像的坐标转换
核线影像介绍
核线影像(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;
}
最后,如有不对的地方,请批评指正。