您當前的位置:首頁 > 攝影

01攝影測量中的像平面座標系與影像內定向及C程式碼

作者:由 張勇 發表于 攝影時間:2018-06-10

摘要:本文在介紹攝影測量中的基礎座標系“像平面座標系”的基礎上,詳細說明了在已知框標座標的情況下,內定向引數的計算方法,給出了C語言實現版的虛擬碼。

透過影像測量三維世界是攝影測量學科的基本目的之一。為了描述三維世界的幾何結構,人們採用了三維世界座標系,為了描述地物在影像上的位置,同樣需要在影像上定義一個座標系,這就是像平面座標系。那麼如何計算影像上某個畫素在像平面座標系上的座標呢,這就是影像內定向。

為了讓大家清楚地瞭解內定向的由來以及計算過程,我們需要從數字攝影測量的發展過程講起。

在數字攝影測量發展之初,大家目前所熟知的可量測數碼相機(DMC、UCD、SWDC等)和具備量測功能的家用數碼相機(Sony、Nikon等)並未出現在攝影測量領域,那時人們將用作攝影測量的航空相機稱作航攝儀,RC30相機是當時使用範圍最廣的航攝儀之一。

01攝影測量中的像平面座標系與影像內定向及C程式碼

RC30航攝儀

這類航攝儀價格昂貴,機械和光學結構嚴謹,成像底片是膠片,經顯影、定影等一系列處理,得到攝影負片,再經曬印得到攝影測量所需的正片。為了在計算機中對攝影測量過程進行數字化,人們還需要採用數字掃描器將正片做數字化處理,內定向正是由此開始的。

相信大家都在掃描以上掃描過自己的照片吧?同樣地,在把正片放置到數字掃描器上時,雖然會很小地將照片放置得橫平豎直,但是不可能放置的嚴格水平。建立數字化影像行列數和像平面座標系之間的關係,是實現數字攝影測量的先決條件,航攝儀在設計上做了充分準備。下圖是一張由RC30相機拍攝得到的經數字化處理的影像。

01攝影測量中的像平面座標系與影像內定向及C程式碼

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

{

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

{

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

{

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);

}

後記:數字化影像中框標座標的自動測量方法,即模板匹配,將在後續文章中詳細論述,數碼影像的內定向方法也將一併予以介紹。