- 文件输入精度(比较了好几种方法,终于找到可以完整输入小数部分的方法)
方法一:C++文件流定义读取文件,但发现没有读到小数(我也不知道为什么)
fstream infile1;//定义文件流对象
infile1.open("image_elements.txt", ios::in);//打开外方位元素的文档
double *ptr1 = &data1[0][0];
while (!infile1.eof())
{
infile1 >> *ptr1;//这是把文档里面的数对应放在ptr位置上的数值上
ptr1++;
}
infile1.close();
方法二:C语言定义文件读取,可以读到小数部位
ifstream file1("image_elements.txt");
if (!file1.is_open()) {
cout << "can not open this file" << endl;
system("pause");
return 0;
}
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
file1 >> data1[i][j];
}
}
- 上网查了有关以一定精度输出小数点问题
//setiosflags(ios::fixed):设置浮点数以固定的小数位数显示
//setprecision(2):是设置浮点数的精度为2位。
cout << setiosflags(ios::fixed) << setprecision(2) << "XP=" << XP << endl;
cout << setiosflags(ios::fixed) << setprecision(2) << "YP=" << YP << endl;
cout << setiosflags(ios::fixed) << setprecision(2) << "ZP=" << ZP << endl;
注意:前提是不要忘了加预编译头#include<iomanip>,用cout以一定精度输出。
- 前方交会改正
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<opencv2/opencv.hpp>
#include<iomanip>
using namespace std;
using namespace cv;
int main()
{
double f = 70.5 / 1000.0;//mm
double data1[6][6] = { 0 };
double data2[42][2] = { 0 };
//打开外方位元素文件
ifstream file1("image_elements.txt");
if (!file1.is_open()) {
cout << "can not open this file" << endl;
system("pause");
return 0;
}
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
file1 >> data1[i][j];
}
}
//左右像片的外方位元素
double XS1 = data1[0][0];
double YS1 = data1[0][1];
double ZS1 = data1[0][2];
double phi1 = data1[0][3];
double omig1 = data1[0][4];
double kappa1 = data1[0][5];
double XS2 = data1[1][0];
double YS2 = data1[1][1];
double ZS2 = data1[1][2];
double phi2 = data1[1][3];
double omig2 = data1[1][4];
double kappa2 = data1[1][5];
//打开像平面文件
FILE *fp2;
ifstream file2("data_point.txt");
if (!file2.is_open()) {
cout << "can not open this file" << endl;
system("pause");
return 0;
}
for (int i = 0; i < 42; i++)
{
for (int j = 0; j < 2; j++)
{
file2 >> data2[i][j];
}
}
//同名像点的坐标
double x1 = data2[0][0] / 1000.0;
double y1 = data2[0][1] / 1000.0;
double x2 = data2[1][0] / 1000.0;
double y2 = data2[1][1] / 1000.0;
cout << "ZS2=" << ZS2 << endl;
cout << "y2=" << y2 << endl;
//定义基线分量
double Bx = XS2 - XS1, By = YS2 - YS1, Bz = ZS2 - ZS1;
//两张像片上的旋转矩阵
double a1 = cos(phi1)*cos(kappa1) - sin(phi1)*sin(omig1)*sin(kappa1);
double a2 = -1.0*cos(phi1)*sin(kappa1) - sin(phi1)*sin(omig1)*cos(kappa1);
double a3 = -1.0*sin(phi1)*cos(omig1);
double b1 = cos(omig1)*sin(kappa1);
double b2 = cos(omig1)*cos(kappa1);
double b3 = -1.0*sin(omig1);
double c1 = sin(phi1)*cos(kappa1) + cos(phi1)*sin(omig1)*sin(kappa1);
double c2 = -1.0*sin(phi1)*sin(kappa1) + cos(phi1)*sin(omig1)*cos(kappa1);
double c3 = cos(phi1)*cos(omig1);
//定义旋转矩阵R1
Mat R1(3, 3, CV_64F, 0.0);
R1.at<double>(0, 0) = a1;
R1.at<double>(0, 1) = a2;
R1.at<double>(0, 2) = a3;
R1.at<double>(1, 0) = b1;
R1.at<double>(1, 1) = b2;
R1.at<double>(1, 2) = b3;
R1.at<double>(2, 0) = c1;
R1.at<double>(2, 1) = c2;
R1.at<double>(2, 2) = c3;
double aa1 = cos(phi2)*cos(kappa2) - sin(phi2)*sin(omig2)*sin(kappa2);
double aa2 = -1.0*cos(phi2)*sin(kappa2) - sin(phi2)*sin(omig2)*cos(kappa2);
double aa3 = -1.0*sin(phi2)*cos(omig2);
double bb1 = cos(omig2)*sin(kappa2);
double bb2 = cos(omig2)*cos(kappa2);
double bb3 = -1.0*sin(omig2);
double cc1 = sin(phi2)*cos(kappa2) + cos(phi2)*sin(omig2)*sin(kappa2);
double cc2 = -1.0*sin(phi2)*sin(kappa2) + cos(phi2)*sin(omig2)*cos(kappa2);
double cc3 = cos(phi2)*cos(omig2);
//定义旋转矩阵R2
Mat R2(3, 3, CV_64F, 0.0);
R2.at<double>(0, 0) = aa1;
R2.at<double>(0, 1) = aa2;
R2.at<double>(0, 2) = aa3;
R2.at<double>(1, 0) = bb1;
R2.at<double>(1, 1) = bb2;
R2.at<double>(1, 2) = bb3;
R2.at<double>(2, 0) = cc1;
R2.at<double>(2, 1) = cc2;
R2.at<double>(2, 2) = cc3;
//定义同名像点的像空间辅助坐标系RR1(X1,Y1,Z1)和RR2(X2,Y2,Z)
Mat RR1(3, 1, CV_64F, 0.0);
Mat RR2(3, 1, CV_64F, 0.0);
Mat RR11(3, 1, CV_64F, 0.0);
RR11.at<double>(0, 0) = x1;
RR11.at<double>(1, 0) = y1;
RR11.at<double>(2, 0) = -1 * f;
Mat RR22(3, 1, CV_64F, 0.0);
RR22.at<double>(0, 0) = x2;
RR22.at<double>(1, 0) = y2;
RR22.at<double>(2, 0) = -1 * f;
RR1 = R1*RR11;
double X1 = RR1.at<double>(0, 0);
double Y1 = RR1.at<double>(1, 0);
double Z1 = RR1.at<double>(2, 0);
RR2 = R2*RR22;
double X2 = RR2.at<double>(0, 0);
double Y2 = RR2.at<double>(1, 0);
double Z2 = RR2.at<double>(2, 0);
//计算左右点投影系数
double N1 = (Bx*Z2 - Bz*X2) / (X1*Z2 - Z1*X2);
double N2 = (Bx*Z1 - Bz*X1) / (X1*Z2 - Z1*X2);
//计算模型点坐标
double deteX = N1*X1;
double deteY = 0.5*(N1*Y1 + N2*Y2 + By);
double deteZ = N1*Z1;
//计算地面点的地面坐标(X,Y,Z)
double XP = XS1 + deteX;
double YP = YS1 + deteY;
double ZP = ZS1 + deteZ;
cout << "地面点坐标是:" << endl;
//setiosflags(ios::fixed):设置浮点数以固定的小数位数显示
//setprecision(2):是设置浮点数的精度为2位。
cout << setiosflags(ios::fixed) << setprecision(2) << "XP=" << XP << endl;
cout << setiosflags(ios::fixed) << setprecision(2) << "YP=" << YP << endl;
cout << setiosflags(ios::fixed) << setprecision(2) << "ZP=" << ZP << endl;
//std::cout << RR1 << std::
getchar();
system("pause");
return 0;
}