摘要:本文在介紹攝影測量中的基礎坐標系“像平面坐標系”的基礎上,詳細說明瞭在已知框標坐標的情況下,內定向參數的計算方法,給出瞭C語言實現版的偽代碼。
通過影像測量三維世界是攝影測量學科的基本目的之一。為瞭描述三維世界的幾何結構,人們采用瞭三維世界坐標系,為瞭描述地物在影像上的位置,同樣需要在影像上定義一個坐標系,這就是像平面坐標系。那麼如何計算影像上某個像素在像平面坐標系上的坐標呢,這就是影像內定向。
為瞭讓大傢清楚地瞭解內定向的由來以及計算過程,我們需要從數字攝影測量的發展過程講起。
在數字攝影測量發展之初,大傢目前所熟知的可量測數碼相機(DMC、UCD、SWDC等)和具備量測功能的傢用數碼相機(Sony、Nikon等)並未出現在攝影測量領域,那時人們將用作攝影測量的航空相機稱作航攝儀,RC30相機是當時使用范圍最廣的航攝儀之一。
RC30航攝儀
這類航攝儀價格昂貴,機械和光學結構嚴謹,成像底片是膠片,經顯影、定影等一系列處理,得到攝影負片,再經曬印得到攝影測量所需的正片。為瞭在計算機中對攝影測量過程進行數字化,人們還需要采用數字掃描儀將正片做數字化處理,內定向正是由此開始的。
相信大傢都在掃描以上掃描過自己的照片吧?同樣地,在把正片放置到數字掃描儀上時,雖然會很小地將照片放置得橫平豎直,但是不可能放置的嚴格水平。建立數字化影像行列數和像平面坐標系之間的關系,是實現數字攝影測量的先決條件,航攝儀在設計上做瞭充分準備。下圖是一張由RC30相機拍攝得到的經數字化處理的影像。
RC30數字化航空影像
從圖中可以看出,航攝儀拍攝的影像四角分別有一個標記,稱作框標。位於四角的框標叫做角框標,兩角框標連線之間的叫做邊框標。像平面坐標系就是在框標的基礎上定義的。一種定義方法是取對角框標連線的交點作為坐標系原點,以指向飛行方向的角平分線為x軸正方向,y軸向上。另一種定義方法則是取邊、角框標的算術平均值對應處為坐標系原點,兩坐標軸方向與方法一相同。
經過上面的分析,我們可以看出,傳統航攝儀影像的內定向由兩大步驟組成,第一步是在數字影像中測量框的位置,用框標所在的行列數描述;第二步是利用航攝儀檢定報告中記錄的框標坐標,解求內定向參數,得到像素坐標和像平面坐標之間的相互轉換時所需的旋轉矩陣。
框標在數字化影像中的行列數,既可以手工測量,也可以采用模板匹配的方法獲得。為瞭減小文章篇幅,保持內容的緊湊性,關於模板匹配的內容將在下一篇文章的介紹。本文假定框標坐標已經量測得到,下面給出像素坐標和像平面坐標之間的相互轉換時所用的旋轉矩陣的計算方法,並采用C語言偽代碼予以描述。
void Ior(double *pFiducalSX, double *pFiducalSY, //框標坐標,從相機檢定報告中獲得
double *pFiducalIX, double *pFiducalIY, //框標在數字化影像中的列數和行數
int nFiducalNum, //框標數量
double fScanSize, //影像的掃描分辨率,單位mm
double fPrincipalOffsetSX, double fPrincipalOffsetSY,//主點偏移量,單位mm,從相機檢定報告中獲得
double* pMatrixItoS, double* pMatrixStoI,//像素坐標到像平面坐標的轉換矩陣,像平面坐標到像素坐標的轉換矩陣
double* pPrincipalSX, double* pPrincipalSY, //恒為0
double* pPrincipalIX, double* pPrincipalIY, //像主點在數字化影像中的列數和行數
double *pFiducalExpSX, double *pFiducalExpSY, //可忽略
double *pSDSX, double *pSDSY, //可忽略
double *pRMS)//可忽略
{
//計算坐標重心化參數
double fMeanSX=0.0,fMeanSY=0.0,fMeanIX=0.0,fMeanIY=0.0;
for(int i=0;i<nFiducalNum;i++)
{
fMeanSX+=pFiducalSX[i];
fMeanSY+=pFiducalSY[i];
fMeanIX+=pFiducalIX[i];
fMeanIY+=pFiducalIY[i];
}
fMeanSX/=nFiducalNum;
fMeanSY/=nFiducalNum;
fMeanIX/=nFiducalNum;
fMeanIY/=nFiducalNum;
//計算正反內定向矩陣
double 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<nFiducalNum;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;
}
double 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<nFiducalNum;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);
}
後記:數字化影像中框標坐標的自動測量方法,即模板匹配,將在後續文章中詳細論述,數碼影像的內定向方法也將一並予以介紹。
上一篇