01攝影測量中的圖像平面坐標(biāo)系和圖像方向以及C代碼
摘要:在攝影測量學(xué)中引入基本坐標(biāo)系“圖像平面坐標(biāo)系”的基礎(chǔ)上,本文詳細(xì)介紹了已知框架坐標(biāo)時內(nèi)部方向參數(shù)的計算方法,并給出了C語言偽代碼實施版本。
通過圖像測量三維世界是攝影測量學(xué)的基本目的之一。為了描述三維世界的幾何結(jié)構(gòu),人們使用三維世界坐標(biāo)系。為了描述對象在圖像上的位置,還必須在圖像上定義一個坐標(biāo)系,即圖像平面坐標(biāo)系。那么如何在圖像平面坐標(biāo)系中計算像素在圖像上的坐標(biāo),這就是圖像的方向。
為了讓每個人都清楚地了解內(nèi)部定向的起源和計算過程,我們需要從數(shù)字?jǐn)z影測量學(xué)的發(fā)展過程入手。
在數(shù)字?jǐn)z影測量學(xué)發(fā)展的開始,著名的可測量數(shù)碼相機(DMC,UCD,SWDC等)和具有測量功能的家用數(shù)碼相機(索尼,尼康等)并未出現(xiàn)在攝影測量學(xué)中。當(dāng)時,人們將用于攝影測量的航拍相機稱為航拍相機。 RC30攝像機是當(dāng)時使用最廣泛的航空攝像機之一。
RC30航拍攝像機
這種類型的航拍相機價格昂貴,并且具有嚴(yán)格的機械和光學(xué)結(jié)構(gòu)。成像膜是膜。經(jīng)過一系列顯影和定影處理后,獲得照相底片,然后通過印刷獲得攝影測量所需的正片。為了對計算機中的攝影測量過程進行數(shù)字化處理,人們還需要使用數(shù)字掃描儀對正片進行數(shù)字化處理,而內(nèi)部方向正是從此開始的。
我相信每個人都在上面掃描了自己的照片,對嗎?同樣,將正片放在數(shù)字掃描儀上時,盡管照片將水平和垂直放置,但不可能將其嚴(yán)格水平放置。建立數(shù)字圖像的行數(shù)和列數(shù)與圖像平面坐標(biāo)系之間的關(guān)系是數(shù)字?jǐn)z影測量的先決條件。航拍相機在設(shè)計上已做好充分準(zhǔn)備。下圖是RC30相機拍攝的經(jīng)過數(shù)字處理的圖像。
RC30數(shù)字航空影像
從圖中可以看出,航空攝像機拍攝的圖像的四個角都有一個標(biāo)記,稱為框標(biāo)記。四個角的框架稱為角框架,兩個角框架之間的線稱為框架?;诳驑?biāo)記定義圖像平面坐標(biāo)系。一種定義方法是將對角線框標(biāo)記線的交點作為坐標(biāo)系的原點,將指向飛行方向的等分線作為正x軸,并將y軸向上。另一種定義方法是將邊界和角的算術(shù)平均值作為坐標(biāo)系的原點,并且兩個坐標(biāo)軸的方向與方法1中的相同。
經(jīng)過以上分析,我們可以看到傳統(tǒng)航空攝像機圖像的內(nèi)部方向包括兩個主要步驟。第一步是測量框架在數(shù)字圖像中的位置,并通過框架所在的行數(shù)和列數(shù)對其進行描述。第二步是使用航拍機驗證報告中記錄的幀坐標(biāo)來求解內(nèi)部方向參數(shù)影像測量儀,以獲得像素坐標(biāo)與像平面坐標(biāo)之間相互轉(zhuǎn)換所需的旋轉(zhuǎn)矩陣。
數(shù)字圖像中標(biāo)記的行數(shù)和列數(shù)可以手動測量或通過模板匹配獲得。為了減少文章的長度并保持內(nèi)容緊湊,下一篇文章將介紹模板匹配的內(nèi)容。本文假定已測量了框架坐標(biāo)。下面給出了像素坐標(biāo)與像面坐標(biāo)相互轉(zhuǎn)換中使用的旋轉(zhuǎn)矩陣的計算方法,并使用C語言偽代碼對其進行描述。
void Ior(double * pFiducalSX,double * pFiducalSY,//幀坐標(biāo),從相機驗證報告中獲取
double * pFiducalIX,double * pFiducalIY,//數(shù)字圖像中標(biāo)記的幀的行數(shù)

int nFiducalNum,//幀標(biāo)簽數(shù)
double fScanSize,//圖像的掃描分辨率,單位為毫米
從攝像機驗證報告中獲得的double fPrincipalOffsetSX,double fPrincipalOffsetSY影像測量儀,//主點偏移,以mm為單位
double * pMatrixItoS,double * pMatrixStoI,//從像素坐標(biāo)到圖像平面坐標(biāo)的轉(zhuǎn)換矩陣,以及從圖像平面坐標(biāo)到像素坐標(biāo)的轉(zhuǎn)換矩陣
double * pPrincipalSX,double * pPrincipalSY,//始終為0
double * pPrincipalIX,double * pPrincipalIY,//像主點一樣的數(shù)字圖像的行數(shù)
雙* pFiducalExpSX,雙* pFiducalExpSY,//可以忽略
雙* pSDSX,雙* pSDSY,//可以忽略
雙* pRMS)//可以忽略
{
//計算坐標(biāo)居中參數(shù)
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;
//計算正負(fù)內(nèi)部取向矩陣
雙精度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);
//統(tǒng)計錯誤
* 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);
}
后記:在后續(xù)文章中將詳細(xì)討論數(shù)字圖像中幀坐標(biāo)的自動測量方法,即模板匹配,并且還將介紹數(shù)字圖像的內(nèi)部定位方法。