⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 备份.cpp

📁 通过使用两张以上照片以及 至少六个控制点的物方坐标和像点坐标
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<iostream.h>
#include<math.h>
#include<fstream.h>
class photo_mesure
{
public:
	
	double **space;//存放相片上6个点的空间坐标(XYZ)
	double **zuobiaoyi;//存放相片上6个点的坐标仪坐标(xy)
	double **L;//L系数矩阵
	double **XY,**xy;//存放中间变换矩阵   P151————7-3-2
	
	photo_mesure()
	{
	
		space=new double* [6];		
			for(int i=0;i<6;i++)
				space[i]=new double [3];

		zuobiaoyi=new double* [6];		
			for( i=0;i<6;i++)
				zuobiaoyi[i]=new double [2];

		XY=new double* [11];		
			for( i=0;i<11;i++)
				XY[i]=new double [11];

		xy=new double* [11];		
			for( i=0;i<11;i++)
				xy[i]=new double [1];

		L=new double* [11];		
			for( i=0;i<11;i++)
				L[i]=new double [1];
	}

	void getdata(double **space,double **zuobiaoyi,double **XY,double **xy)//确定起始坐标并求出中间变量矩阵
	{
	
		for(int i=0;i<=4;i++)//         /////////////////////////前10行
		{
			for(int j=0;j<=2;j++)//1,2,3列
			{
				XY[2*i][j]=space[i][j];
				XY[2*i+1][j]=0;
			}
			XY[2*i][3]=1;//      4列
			XY[2*i+1][3]=0;
			for(j=4;j<=6;j++)//5,6,7列
			{
				XY[2*i][j]=0;
				XY[2*i+1][j]=space[i][j-4];
			}
			XY[2*i][7]=0;//    8列
			XY[2*i+1][7]=1;
			for(j=8;j<=10;j++)//9,10,11列
			{
				XY[2*i][j]  =zuobiaoyi[i][0]*space[i][j-8];
				XY[2*i+1][j]=zuobiaoyi[i][1]*space[i][j-8];
			}
			//以下确定xy[][]
			xy[2*i][0]  =zuobiaoyi[i][0];
			xy[2*i+1][0]=zuobiaoyi[i][1];
		}
		//////////////////////////////// ////////////第11行
		for(int j=0;j<=2;j++)
			XY[10][j]=space[5][j];
		XY[10][3]=1;
		XY[10][4]=0;
		XY[10][5]=0;
		XY[10][6]=0;
		XY[10][7]=0;
		for(j=8;j<=10;j++)
			XY[10][j]=zuobiaoyi[5][0]*space[5][j-8];
		xy[10][0]=zuobiaoyi[5][0];

	}


	void time(double **e,double **f,double **g,int m,int n,int k)//矩阵乘积
		{
		int i,j;
		for (i=0; i<=m-1; i++)
		  for (j=0; j<=k-1; j++)
		  { 
			g[i][j]=0;

			for(int l=0;l<n;l++)

			g[i][j]+=e[i][l]*f[l][j];
			}
		  
		}

	void zhuanzhi(double **w,double **ww,int m,int n)//矩阵转置
	{
		int i,j;
		for(i=0;i<m;i++)
			for(j=0;j<n;j++)
				ww[j][i]=w[i][j];
			
	}


	void qiuni(double **pp,double **mm,int ss)//求逆函数
	{

	  double d,p;
	  int *is,*js,i,j,k,l,u;
		is=new int[ss] ;  
		js=new int[ss] ;
    
		
	for (k=0; k<=ss-1; k++)
		{ d=0.0;
			for (i=k; i<=ss-1; i++)
			for (j=k; j<=ss-1; j++)
			  { p=fabs(pp[i][j]);
				if (p>d) { d=p; is[k]=i; js[k]=j;}
			  }//a[i][j] 最大,d=该最大值


			if (d+1.0==1.0)
			  { delete []is;
				delete []js;
			cout<<"该矩阵无法求逆:"<<endl;
			  }



			if (is[k]!=k)
			  for (j=0; j<=ss-1; j++)
				{
				  p=pp[k][j]; pp[k][j]=pp[is[k]][j]; pp[is[k]][j]=p;
				}
			if (js[k]!=k)
			  for (i=0; i<=ss-1; i++)
				{ 
				  p=pp[i][k]; pp[i][k]=pp[i][js[k]]; pp[i][js[k]]=p;
				}
			l=k*ss+k;
			pp[k][k]=1.0/pp[k][k];
			for (j=0; j<=ss-1; j++)
			  if (j!=k)
				{ u=k*ss+j; pp[k][j]=pp[k][j]*pp[k][k];}
			for (i=0; i<=ss-1; i++)
			  if (i!=k)
				for (j=0; j<=ss-1; j++)
				  if (j!=k)
					{ u=i*ss+j;
					  pp[i][j]=pp[i][j]-pp[i][k]*pp[k][j];
					}
			for (i=0; i<=ss-1; i++)
			  if (i!=k)
				{  pp[i][k]=-pp[i][k]*pp[k][k];}
		  }


	for (k=ss-1; k>=0; k--)
		  { if (js[k]!=k)
			  for (j=0; j<=ss-1; j++)
				{ 
				  p=pp[k][j]; pp[k][j]=pp[js[k]][j]; pp[js[k]][j]=p;
				}
			if (is[k]!=k)
			  for (i=0; i<=ss-1; i++)
				{ 
				  p=pp[i][k]; pp[i][k]=pp[i][is[k]]; pp[i][is[k]]=p;
				}
			  

		  }
		for(i=0;i<ss;i++)
			for(j=0;j<ss;j++)
				mm[i][j]=pp[i][j];

		}

	void qiufu(double **mm,int m,int n)//矩阵的负数形式 -1
	{
		int i,j;
			for(i=0;i<m;i++)
			{for(j=0;j<n;j++)
				mm[i][j]=-mm[i][j];
			}
	}
	void plus(double **a,double **b,double **c,int m,int n)
	{
		int i,j;
		for(i=0;i<m;i++)
			for(j=0;j<n;j++)
				c[i][j]=a[i][j]+b[i][j];
	}
	void dive(double **a,double **b,double **c,int m,int n)
	{
		int i,j;
		for(i=0;i<m;i++)
			for(j=0;j<n;j++)
				c[i][j]=a[i][j]-b[i][j];
	}
	void display(double **mm,int m,int n)//输出矩阵
		{
			int i,j;
			for(i=0;i<m;i++)
			{for(j=0;j<n;j++)
				cout<<mm[i][j]<<"   ";
			cout<<endl;
			}
		}

};


void main()
{
	ifstream  infile("space.txt",ios::in);
	ifstream  infile1("photo1.txt",ios::in);
	ifstream  infile2("photo2.txt",ios::in);
	ofstream outfile("输出数据.txt",ios::out);

	photo_mesure photo1,photo2,photo;
	double kongjian[12][3],pingmian1[12][2],pingmian2[12][2];
	int p1,p2,p3,p4,p5,p6;

	for(int i=0;i<12;i++)
		for(int j=0;j<3;j++)
			infile>>kongjian[i][j];
	for(i=0;i<12;i++)
		for(int j=0;j<2;j++)
		{
			infile1>>pingmian1[i][j];
			infile2>>pingmian2[i][j];
		}
		cout<<"请选择6个点作为控制点:  "<<"1  2  3  4  5  6  7  9  10  12  13  14"<<endl;
		cin>>p1>>p2>>p3>>p4>>p5>>p6;
		outfile<<"您选择的6个控制点是 "<<p1<<" "<<p2<<" "<<p3<<" "<<p4<<" "<<p5<<" "<<p6<<"  号点"<<endl;
	

	photo1.space[0][0]=kongjian[p1-1][0];  photo1.space[0][1]=kongjian[p1-1][1];  photo1.space[0][2]=kongjian[p1-1][2];
	photo1.space[1][0]=kongjian[p2-1][0];  photo1.space[1][1]=kongjian[p2-1][1];  photo1.space[1][2]=kongjian[p2-1][2];
	photo1.space[2][0]=kongjian[p3-1][0];  photo1.space[2][1]=kongjian[p3-1][1];  photo1.space[2][2]=kongjian[p3-1][2];
	photo1.space[3][0]=kongjian[p4-1][0];  photo1.space[3][1]=kongjian[p4-1][1];  photo1.space[3][2]=kongjian[p4-1][2];
	photo1.space[4][0]=kongjian[p5-1][0];  photo1.space[4][1]=kongjian[p5-1][1];  photo1.space[4][2]=kongjian[p5-1][2];
	photo1.space[5][0]=kongjian[p6-1][0];  photo1.space[5][1]=kongjian[p6-1][1];  photo1.space[5][2]=kongjian[p6-1][2];

	photo2.space[0][0]=kongjian[p1-1][0];  photo2.space[0][1]=kongjian[p1-1][1];  photo2.space[0][2]=kongjian[p1-1][2];
	photo2.space[1][0]=kongjian[p2-1][0];  photo2.space[1][1]=kongjian[p2-1][1];  photo2.space[1][2]=kongjian[p2-1][2];
	photo2.space[2][0]=kongjian[p3-1][0];  photo2.space[2][1]=kongjian[p3-1][1];  photo2.space[2][2]=kongjian[p3-1][2];
	photo2.space[3][0]=kongjian[p4-1][0];  photo2.space[3][1]=kongjian[p4-1][1];  photo2.space[3][2]=kongjian[p4-1][2];
	photo2.space[4][0]=kongjian[p5-1][0];  photo2.space[4][1]=kongjian[p5-1][1];  photo2.space[4][2]=kongjian[p5-1][2];
	photo2.space[5][0]=kongjian[p6-1][0];  photo2.space[5][1]=kongjian[p6-1][1];  photo2.space[5][2]=kongjian[p6-1][2];

	photo1.zuobiaoyi[0][0]=pingmian1[p1-1][0];   photo1.zuobiaoyi[0][1]=pingmian1[p1-1][1];
	photo1.zuobiaoyi[1][0]=pingmian1[p2-1][0];   photo1.zuobiaoyi[1][1]=pingmian1[p2-1][1];
	photo1.zuobiaoyi[2][0]=pingmian1[p3-1][0];   photo1.zuobiaoyi[2][1]=pingmian1[p3-1][1];
	photo1.zuobiaoyi[3][0]=pingmian1[p4-1][0];   photo1.zuobiaoyi[3][1]=pingmian1[p4-1][1];
	photo1.zuobiaoyi[4][0]=pingmian1[p5-1][0];   photo1.zuobiaoyi[4][1]=pingmian1[p5-1][1];
	photo1.zuobiaoyi[5][0]=pingmian1[p6-1][0];   photo1.zuobiaoyi[5][1]=pingmian1[p6-1][1];


	photo2.zuobiaoyi[0][0]=pingmian2[p1-1][0];   photo2.zuobiaoyi[0][1]=pingmian2[p1-1][1];
	photo2.zuobiaoyi[1][0]=pingmian2[p2-1][0];   photo2.zuobiaoyi[1][1]=pingmian2[p2-1][1];
	photo2.zuobiaoyi[2][0]=pingmian2[p3-1][0];   photo2.zuobiaoyi[2][1]=pingmian2[p3-1][1];
	photo2.zuobiaoyi[3][0]=pingmian2[p4-1][0];   photo2.zuobiaoyi[3][1]=pingmian2[p4-1][1];
	photo2.zuobiaoyi[4][0]=pingmian2[p5-1][0];   photo2.zuobiaoyi[4][1]=pingmian2[p5-1][1];
	photo2.zuobiaoyi[5][0]=pingmian2[p6-1][0];   photo2.zuobiaoyi[5][1]=pingmian2[p6-1][1];

	


////////////////////////////       1        //////////////////////////
	photo1.getdata(photo1.space,photo1.zuobiaoyi,photo1.XY,photo1.xy);//通过space和zuobiaoyi坐标,计算XY,xy。
	photo1.qiuni(photo1.XY,photo1.XY,11);
	photo1.time(photo1.XY,photo1.xy,photo1.L,11,11,1);
	photo1.qiufu(photo1.L,11,1);//////////////////////////解算出photo1的L[11]矩阵

	cout<<"L1初始值"<<endl;
	photo1.display(photo1.L,11,1);///////////////////////////////测试
	cout<<"*********************************"<<endl;

	photo2.getdata(photo2.space,photo2.zuobiaoyi,photo2.XY,photo2.xy);
	photo2.qiuni(photo2.XY,photo2.XY,11);
	photo2.time(photo2.XY,photo2.xy,photo2.L,11,11,1);
	photo2.qiufu(photo2.L,11,1);//////////////////////////解算出photo2的L[11]矩阵

	cout<<"L2初始值"<<endl;
	photo2.display(photo2.L,11,1);///////////////////////////////测试
	cout<<"*********************************"<<endl;


 ///////////////////////////      2        ////////////////////////////////  见课本151页
	double **coordinate_space;//存放物方空间坐标近似值  3*1
	double **coordinate_zuobiaoyi;//存放坐标仪坐标  2*2

	double  **LXY,**lxy;//存放中间变量矩阵3*3, 3*1
	coordinate_space=new double* [3];		
			for( i=0;i<3;i++)
				coordinate_space[i]=new double [1];
	coordinate_zuobiaoyi=new double* [2];		
			for(i=0;i<2;i++)
				coordinate_zuobiaoyi[i]=new double [2];
	LXY=new double* [3];		
			for( i=0;i<3;i++)
				LXY[i]=new double [3];
	lxy=new double* [3];		
			for( i=0;i<3;i++)
				lxy[i]=new double [1];

 for(int k=0;k<12;k++)///////////////////////////////////////////////大循环,计算每个点
 {
	 outfile<<"第 "<<k+1<<" 点 "<<endl;
	outfile<<"          原始坐标是:"<<endl;
	outfile<<"                                "<<kongjian[k][0]<<"  "<<kongjian[k][1]<<"  "<<kongjian[k][2]<<endl;
	coordinate_zuobiaoyi[0][0]=pingmian1[k][0];//输入相片上某点的坐标仪坐标,用来进而确定其对应的物方空间坐标的近似值 
	coordinate_zuobiaoyi[0][1]=pingmian1[k][1];
	coordinate_zuobiaoyi[1][0]=pingmian2[k][0];
	coordinate_zuobiaoyi[1][1]=pingmian2[k][1];

	for(i=0;i<2;i++)        //确定中间变量矩阵
	{
		lxy[i][0]=photo1.L[4*i+3][0]+coordinate_zuobiaoyi[0][i];
		for(int j=0;j<=2;j++)
			LXY[i][j]=photo1.L[4*i+j][0]+coordinate_zuobiaoyi[0][i]*photo1.L[8+j][0];   
	}
	for(int j=0;j<3;j++)
		LXY[2][j]=photo2.L[j][0]+coordinate_zuobiaoyi[1][0]*photo2.L[j+8][0];
    lxy[2][0]=photo2.L[3][0]+coordinate_zuobiaoyi[1][0];

	photo.qiuni(LXY,LXY,3);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -