01摄影测量中的图像平面坐标系和图像方向以及C代码
摘要:在摄影测量学中引入基本坐标系“图像平面坐标系”的基础上,本文详细介绍了已知框架坐标时内部方向参数的计算方法,并给出了C语言伪代码实施版本。
通过图像测量三维世界是摄影测量学的基本目的之一。为了描述三维世界的几何结构,人们使用三维世界坐标系。为了描述对象在图像上的位置,还必须在图像上定义一个坐标系,即图像平面坐标系。那么如何在图像平面坐标系中计算像素在图像上的坐标,这就是图像的方向。
为了让每个人都清楚地了解内部定向的起源和计算过程,我们需要从数字摄影测量学的发展过程入手。
在数字摄影测量学发展的开始,著名的可测量数码相机(DMC,UCD,SWDC等)和具有测量功能的家用数码相机(索尼,尼康等)并未出现在摄影测量学中。当时,人们将用于摄影测量的航拍相机称为航拍相机。 RC30摄像机是当时使用最广泛的航空摄像机之一。
RC30航拍摄像机
这种类型的航拍相机价格昂贵,并且具有严格的机械和光学结构。成像膜是膜。经过一系列显影和定影处理后,获得照相底片,然后通过印刷获得摄影测量所需的正片。为了对计算机中的摄影测量过程进行数字化处理,人们还需要使用数字扫描仪对正片进行数字化处理,而内部方向正是从此开始的。
我相信每个人都在上面扫描了自己的照片,对吗?同样,将正片放在数字扫描仪上时,尽管照片将水平和垂直放置,但不可能将其严格水平放置。建立数字图像的行数和列数与图像平面坐标系之间的关系是数字摄影测量的先决条件。航拍相机在设计上已做好充分准备。下图是RC30相机拍摄的经过数字处理的图像。
RC30数字航空影像
从图中可以看出,航空摄像机拍摄的图像的四个角都有一个标记,称为框标记。四个角的框架称为角框架,两个角框架之间的线称为框架。基于框标记定义图像平面坐标系。一种定义方法是将对角线框标记线的交点作为坐标系的原点,将指向飞行方向的等分线作为正x轴,并将y轴向上。另一种定义方法是将边界和角的算术平均值作为坐标系的原点,并且两个坐标轴的方向与方法1中的相同。
经过以上分析,我们可以看到传统航空摄像机图像的内部方向包括两个主要步骤。第一步是测量框架在数字图像中的位置,并通过框架所在的行数和列数对其进行描述。第二步是使用航拍机验证报告中记录的帧坐标来求解内部方向参数影像测量仪,以获得像素坐标与像平面坐标之间相互转换所需的旋转矩阵。
数字图像中标记的行数和列数可以手动测量或通过模板匹配获得。为了减少文章的长度并保持内容紧凑,下一篇文章将介绍模板匹配的内容。本文假定已测量了框架坐标。下面给出了像素坐标与像面坐标相互转换中使用的旋转矩阵的计算方法,并使用C语言伪代码对其进行描述。
void Ior(double * pFiducalSX,double * pFiducalSY,//帧坐标,从相机验证报告中获取
double * pFiducalIX,double * pFiducalIY,//数字图像中标记的帧的行数
int nFiducalNum,//帧标签数
double fScanSize,//图像的扫描分辨率,单位为毫米
从摄像机验证报告中获得的double fPrincipalOffsetSX,double fPrincipalOffsetSY影像测量仪,//主点偏移,以mm为单位
double * pMatrixItoS,double * pMatrixStoI,//从像素坐标到图像平面坐标的转换矩阵,以及从图像平面坐标到像素坐标的转换矩阵
double * pPrincipalSX,double * pPrincipalSY,//始终为0
double * pPrincipalIX,double * pPrincipalIY,//像主点一样的数字图像的行数
双* pFiducalExpSX,双* pFiducalExpSY,//可以忽略
双* pSDSX,双* pSDSY,//可以忽略
双* pRMS)//可以忽略
{
//计算坐标居中参数
double fMeanSX =0.0,fMeanSY =0.0,fMeanIX =0.0,fMeanIY =0.0;
for(int i = 0; i
{
fMeanSX + = pFiducalSX [i];
fMeanSY + = pFiducalSY [i];
fMeanIX + = pFiducalIX [i];
fMeanIY + = pFiducalIY [i];
}
fMeanSX / = nFiducalNum;
fMeanSY / = nFiducalNum;
fMeanIX / = nFiducalNum;
fMeanIY / = nFiducalNum;
//计算正负内部取向矩阵
双精度SXSX =0.0,SYSY =0.0,SXSY =0.0,SXIX =0.0,SYIX =0.0,SXIY =0.0,SYIY =0.0;
for(i = 0; i
{
double dSX = pFiducalSX [i] -fMeanSX;
double dSY = pFiducalSY [i] -fMeanSY;
double dIX =(pFiducalIX [i] -fMeanIX)* fScanSize;
double dIY =(pFiducalIY [i] -fMeanIY)* fScanSize;
SXSX + = dSX * dSX;
SYSY + = dSY * dSY;
SXSY + = dSX * dSY;
SXIX + = dSX * dIX;
SYIX + = dSY * dIX;
SXIY + = dSX * dIY;
SYIY + = dSY * dIY;
}
双精度d =1.0 /(SXSX * SYSY-SXSY * SXSY);
double a1 =(SXIX * SYSY-SYIX * SXSY)* d;
double a2 =(SYIX * SXSX-SXIX * SXSY)* d;
double b1 =(SXIY * SYSY-SYIY * SXSY)* d;
double b2 =(SYIY * SXSX-SXIY * SXSY)* d;
pMatrixStoI [0] = a1 / fScanSize;
pMatrixStoI [1] = a2 / fScanSize;
pMatrixStoI [2] = b1 / fScanSize;
pMatrixStoI [3] = b2 / fScanSize;
d =1.0 /(a1 * b2-a2 * b1);
pMatrixItoS [0] = b2 * d * fScanSize;
pMatrixItoS [1] =(-a2 * d)* fScanSize;
pMatrixItoS [2] =(-b1 * d)* fScanSize;
pMatrixItoS [3] = a1 * d * fScanSize;
//计算图像的主要点
* pPrincipalSX =0.0; * pPrincipalSY =0.0;
* pPrincipalIX = fMeanIX + pMatrixStoI [0] *(fPrincipalOffsetSX-fMeanSX)+ pMatrixStoI [1] *(fPrincipalOffsetSY-fMeanSY);
* pPrincipalIY = fMeanIY + pMatrixStoI [2] *(fPrincipalOffsetSX-fMeanSX)+ pMatrixStoI [3] *(fPrincipalOffsetSY-fMeanSY);
//统计错误
* pSDSX =0.0;
* pSDSY =0.0;
for(i = 0; i
{
double dIX = pFiducalIX [i]-* pPrincipalIX;
double dIY = pFiducalIY [i]-* pPrincipalIY;
pFiducalExpSX [i] = pMatrixItoS [0] * dIX + pMatrixItoS [1] * dIY + fPrincipalOffsetSX;
pFiducalExpSY [i] = pMatrixItoS [2] * dIX + pMatrixItoS [3] * dIY + fPrincipalOffsetSY;
double dSX = pFiducalExpSX [i] -pFiducalSX [i];
double dSY = pFiducalExpSY [i] -pFiducalSY [i];
* pSDSX + = dSX * dSX;
* pSDSY + = dSY * dSY;
}
* pRMS =(double)sqrt((** pSDSX + * pSDSY)/ nFiducalNum);
* pSDSX =(double)sqrt(* pSDSX / nFiducalNum);
* pSDSY =(double)sqrt(* pSDSY / nFiducalNum);
}
后记:在后续文章中将详细讨论数字图像中帧坐标的自动测量方法,即模板匹配,并且还将介绍数字图像的内部定位方法。