摄影测量作业3.docx
《摄影测量作业3.docx》由会员分享,可在线阅读,更多相关《摄影测量作业3.docx(12页珍藏版)》请在冰豆网上搜索。
摄影测量作业3
摄影测量作业3
地球科学与环境工程学院
摄影测量实验报告书
课程名:
《摄影测量测量学》
学号:
2014113248
姓名:
黄黎东
指导老师:
陈强
日期:
2016年4月17日
一.实验目的
掌握摄影测量空间后方交会的原理,利用计算机编程语言实现空间后方交会外方位元素的解算。
二.实验数据及实验设备
计算机windows7系统,编程软件VS2015,地面控制点在摄影测量坐标系中的坐标及其像点坐标文件data.txt。
已知条件
摄影机主距f=153.24mm,x0=0.01mm,y0=-0.02mm,像片比例尺为1:
40000,像片上四个像点的框标坐标及其对应的地面坐标如下表。
点号
像点坐标
地面坐标
x(mm)
y(mm)
X(m)
Y(m)
Z(m)
1
-86.15
-68.99
36589.41
25273.32
2195.17
2
-53.40
82.21
37631.08
31324.51
728.69
3
-14.78
-76.63
39100.97
24934.98
2386.50
4
10.46
64.43
40426.54
30319.81
757.31
以单像空间后方交会方法,求解该像片的外方位元素。
三.实验所用到的数学公式及程序计算步骤。
单张影像的空间后方交会:
利用已知地面控制点数据及相应像点坐标根据共线方程反求影像的外方位元素。
数学模型:
共线条件方程式:
求解过程:
(1)获取已知数据。
从航摄资料中查取平均航高与摄影机主距;获取控制点的地面测量坐标并转换为地面摄影测量坐标。
(2)量测控制点的像点坐标并做系统改正。
(3)确定未知数的初始值。
在竖直摄影且地面控制点大致分布均匀的情况下,按如下方法确定初始值,即:
q=w=k=0
式中:
m为摄影比例尺分母;n为控制点个数。
(4)用三个角元素的初始值,计算个方向余弦,组成旋转矩阵R。
(5)逐点计算像点坐标的近似值。
利用未知数的近似值和控制点的地面
坐标代入共线方程式,逐点计算像点坐标的近似值(x)、(y)。
(6)逐点计算误差方程式的系数和常数项,组成误差方程式。
(7)计算法方程的系数矩阵A和常数项L,组成法方程式。
(8)解法方程,求得外方位元素的改正数dXs,dYs,dZs,dq,dw,dk。
(9)用前次迭代取得的近似值,加本次迭代的改正数,计算外方位元素
的新值。
(10)将求得的外方位元素改正数与规定的限差比较,若小于限差则迭代结束。
否则用新的近似值重复(4)~(9),直到满足要求为止。
四.程序流程图。
五.程序的主要源代码如下所示:
#include"stdafx.h"
#include"KongJianHouFangJiaoHui.h"
#include"KongJianHouFangJiaoHuiDlg.h"
#include"afxdialogex.h"
#include"CeHuiLei.h"
#include"Matrix.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
CMatrixxyXYZ;
intButtonClickeOk=1;
voidCKongJianHouFangJiaoHuiDlg:
:
OnBnClickedOk()//导入测量数据按钮代码
{
CFileDialogdlgOpenFile(TRUE,_T("txt"),NULL,
OFN_FILEMUSTEXIST,_T("(文本文件)|*.txt|(所有文件)|*.*)||"));
if(dlgOpenFile.DoModal()==IDCANCEL)
return;//如果选择取消按钮,则退出
CStringstrPathName=dlgOpenFile.GetPathName();//获取选择的文件的完整路径
CStringstrFileTitle=dlgOpenFile.GetFileTitle();//获取文件名
CStringstrExtName=dlgOpenFile.GetFileExt();//获取文件扩展名
CStdioFilesf;//创建文件对象
//以读的形式打开文件,如果打开失败
if(!
sf.Open(strPathName,CFile:
:
modeRead))
{
MessageBox(_T("读取文件出错!
"));
return;
}
CStringstrLine;//存放每一行文本
CStringArraystrSplit;
CeHuiLeiSplitString;
inthang=0;
while(sf.ReadString(strLine))
{
if(hang<=1)
{
hang++;
}
else{
intn=SplitString.SplitStringArray(strLine,',',strSplit);
intindex1=m_list1.GetItemCount();
CStringsno1=_T("");
sno1.Format(_T("%d"),index1+1);
intnR=m_list1.InsertItem(index1,sno1);
for(inti=0;i<5;i++)
{
m_list1.SetItemText(index1,i+1,strSplit[i]);
}
}
}
sf.Close();
intLine=m_list1.GetItemCount();
CMatrixlistXYZ(Line,5);
for(inti=0;ifor(intj=0;j<5;j++)
listXYZ(i,j)=_wtof(m_list1.GetItemText(i,j+1));
xyXYZ=listXYZ;
ButtonClickeOk=0;//表示导入数据按钮已被点击并且已导入数据
}
CMatrixCKongJianHouFangJiaoHuiDlg:
:
GetX(CMatrixA,CMatrixL)//计算外方位元素改正数矩阵
{
CMatrixX,_A,_AA,N_AA;
_A=~A;//A的转置
_AA=_A*A;
N_AA=_AA.Inv();//_AA的逆矩阵
X=N_AA*_A*L;
returnX;
}
CMatrixCKongJianHouFangJiaoHuiDlg:
:
GetA(CMatrixxyXYZ,doublef,CMatrixXX)//计算系数矩阵A
{
intiRow=xyXYZ.Row();
CMatrixA(2*iRow,6);
doubleXS=XX(0,0);
doubleYS=XX(0,1);
doubleZS=XX(0,2);
doublew=XX(0,4);
doublek=XX(0,5);
doubleq=XX(0,3);;
doublea1=cos(q)*cos(k)-sin(q)*sin(w)*sin(k);
doublea2=-cos(q)*sin(k)-sin(q)*sin(w)*cos(k);
doublea3=-sin(q)*cos(w);
doubleb1=cos(w)*sin(k);
doubleb2=cos(w)*cos(k);
doubleb3=-sin(w);
doublec1=sin(q)*cos(k)+cos(q)*sin(w)*sin(k);
doublec2=-sin(q)*sin(k)+cos(q)*sin(w)*cos(k);
doublec3=cos(q)*cos(w);
f=f/1000.0;
for(inti=0;i{
doubleZA=xyXYZ(i,4);
doubleXA=xyXYZ(i,2);
doubleYA=xyXYZ(i,3);
doublex=(xyXYZ(i,0)-_wtof(strx0))/1000.0;
doubley=(xyXYZ(i,1)-_wtof(stry0))/1000.0;
double_Z=a3*(XA-XS)+b3*(YA-YS)+c3*(ZA-ZS);
A(2*i,0)=(a1*f+a3*x)/_Z;
A(2*i,1)=(b1*f+b3*x)/_Z;
A(2*i,2)=(c1*f+c3*x)/_Z;
A(2*i,3)=y*sin(w)-(x*(x*cos(k)-y*sin(k))/f+f*cos(k))*cos(w);
A(2*i,4)=-f*sin(k)-x*(x*sin(k)+y*cos(k))/f;
A(2*i,5)=y;
A(2*i+1,0)=(a2*f+a3*y)/_Z;
A(2*i+1,1)=(b2*f+b3*y)/_Z;
A(2*i+1,2)=(c2*f+c3*y)/_Z;
A(2*i+1,3)=-x*sin(w)-(y*(x*cos(k)-y*sin(k))/f-f*sin(k))*cos(w);
A(2*i+1,4)=-f*cos(k)-y/f*(x*sin(k)+y*cos(k));
A(2*i+1,5)=-x;
}
returnA;
}
CMatrixCKongJianHouFangJiaoHuiDlg:
:
GetL(CMatrixxyXYZ,doublef,CMatrixXX)//计算L矩阵
{
intiRow=xyXYZ.Row();
CMatrixL(2*iRow,1);
doubleXS=XX(0,0);
doubleYS=XX(0,1);
doubleZS=XX(0,2);
doublew=XX(0,4);
doublek=XX(0,5);
doubleq=XX(0,3);;
doublea1=cos(q)*cos(k)-sin(q)*sin(w)*sin(k);
doublea2=-cos(q)*sin(k)-sin(q)*sin(w)*cos(k);
doublea3=-sin(q)*cos(w);
doubleb1=cos(w)*sin(k);
doubleb2=cos(w)*cos(k);
doubleb3=-sin(w);
doublec1=sin(q)*cos(k)+cos(q)*sin(w)*sin(k);
doublec2=-sin(q)*sin(k)+cos(q)*sin(w)*cos(k);
doublec3=cos(q)*cos(w);
f=f/1000.0;
for(inti=0;i{
doubleZA=xyXYZ(i,4);
doubleXA=xyXYZ(i,2);
doubleYA=xyXYZ(i,3);
doublex=(xyXYZ(i,0)-_wtof(strx0))/1000.0;
doubley=(xyXYZ(i,1)-_wtof(stry0))/1000.0;
doublex0=-f*(a1*(XA-XS)+b1*(YA-YS)+c1*(ZA-ZS))/(a3*(XA-XS)+b3*(YA-YS)+c3*(ZA-ZS));
doubley0=-f*(a2*(XA-XS)+b2*(YA-YS)+c2*(ZA-ZS))/(a3*(XA-XS)+b3*(YA-YS)+c3*(ZA-ZS));
L(2*i,0)=x-x0;
L(2*i+1,0)=y-y0;
}
returnL;
}
voidCKongJianHouFangJiaoHuiDlg:
:
OnBnClickedButton1()//计算按钮
{
UpdateData(true);
if(ButtonClickeOk==1)
{
MessageBox(_T("请先点击“导入已知坐标”按钮导入数据!
"),_T("提示"));
return;
}
elseif(strf==_T("")||strm==_T("")||strx0==_T("")||stry0==_T(""))
{
MessageBox(_T("请输入数据!
"),_T("提示"));
return;
}
else
{
intc=strm.GetLength();
doublem=_wtof(strm.Right(c-2));
intiRow=xyXYZ.Row();
doublesumX=0;
doublesumY=0;
doublesumZ=0;
for(inti=0;i{
sumX+=xyXYZ(i,2);
sumY+=xyXYZ(i,3);
sumZ+=xyXYZ(i,4);
}
doubleXS=sumX/iRow;
doubleYS=sumY/iRow;
doubleZS=sumZ/iRow+m*_wtof(strf)/1000;
doublew=0;
doublek=0;
doubleq=0;
CMatrixXX(1,6);
XX(0,0)=XS;
XX(0,1)=YS;
XX(0,2)=ZS;
XX(0,3)=q;
XX(0,4)=w;
XX(0,5)=k;
CMatrixdX(6,1);
//迭代计算:
do{
CMatrixA=GetA(xyXYZ,_wtof(strf),XX);
CMatrixL=GetL(xyXYZ,_wtof(strf),XX);
dX=GetX(A,L);
for(intn=0;n<6;n++)
XX(0,n)=XX(0,n)+dX(n,0);
}while(dX(3,0)>=2.908882087e-5||dX(4,0)>=2.908882087e-5||dX(5,0)>=2.908882087e-5);//各角元素迭代计算至其改正值小于6秒,6s=2.908882087e-5弧度。
CStringstrarray[6];//输出外方位元素计算结果
strarray[0]=_T("XS");
strarray[1]=_T("YS");
strarray[2]=_T("ZS");
strarray[3]=_T("q");
strarray[4]=_T("w");
strarray[5]=_T("k");
CStringstrOutPut=_T("外方位元素为:
\r\n");
CStringstr=_T("");
for(inti=0;i<6;i++)
{
str.Format(_T("%s=%.4f"),strarray[i],XX(0,i));
strOutPut+=str;
if(i==2)
strOutPut+=_T("\r\n");
}
MessageBox(strOutPut,_T("提示"),1);
}
}
六.程序运行的结果为:
(1)导入数据和输入数据
(2)点击计算按钮显示计算结果为:
七.实验总结:
通过这次的实验我学到了很多的东西,通过编程加深了对摄影测量空间后方交会相关知识的理解。
在老师的严格要求下,我翻阅了很多的C++语言的书籍,看了很多的算法,这个程序最难的地方是矩阵的计算及迭代计算,以及如何将文本文档中的数据赋给程序中的矩阵,这些在以前的学习中都没有学到,感谢老师的严格要求。