//计算点的摄影测量坐标 public List <MyPoint> GetPhotogrammetryCoords() { List <MyPoint> photogrammtryCoords = new List <MyPoint>(); int num = leftMCoords.Count(); float deno, N1, N2; float s = (float)(scale / 1000.0); float f = -leftPCoords[0].Z; MyPoint temp; for (int i = 0; i < num; i++) { //计算第i+1个点在右片中的像空间辅助坐标 temp = RightEE.Photo2Model(rightPCoords[i]); //计算点投影系数 deno = leftMCoords[i].X * temp.Z - temp.X * leftMCoords[i].Z; N1 = (bx * temp.Z - bz * temp.X) / deno; N2 = (bx * leftMCoords[i].Z - bz * leftMCoords[i].X) / deno; //计算点的模型坐标 temp.X = N1 * leftMCoords[i].X * s; temp.Y = (N1 * leftMCoords[i].Y + N2 * temp.Y + by) / 2 * s; temp.Z = N1 * leftMCoords[i].Z * s + s * f; photogrammtryCoords.Add(temp); } return(photogrammtryCoords); }
//计算点的模型坐标 public List <MyPoint> GetModelCoords() { List <MyPoint> modelCoords = new List <MyPoint>(); int num = leftMCoords.Count(); float deno, N1, N2; float f = -leftPCoords[0].Z; MyPoint temp; for (int i = 0; i < num; i++) { //计算第i+1个点在右片中的像空间辅助坐标 temp = RightEE.Photo2Model(rightPCoords[i]); //计算点投影系数 deno = leftMCoords[i].X * temp.Z - temp.X * leftMCoords[i].Z; N1 = (bx * temp.Z - bz * temp.X) / deno; N2 = (bx * leftMCoords[i].Z - bz * leftMCoords[i].X) / deno; //计算点的模型坐标 temp.X = N1 * leftMCoords[i].X; temp.Y = (N1 * leftMCoords[i].Y + N2 * temp.Y + by) / 2; temp.Z = N1 * leftMCoords[i].Z; modelCoords.Add(temp); } return(modelCoords); }
//计算误差方程的系数矩阵和常数项 private void CalFactor() { int num = leftPCoords.Count(); float deno, N1, N2; MyPoint temp2; for (int i = 0; i < num; i++) { //求解第i+1个点的像空间辅助坐标 temp2 = RightEE.Photo2Model(rightPCoords[i]);//右片 //计算点投影系数 deno = leftMCoords[i].X * temp2.Z - temp2.X * leftMCoords[i].Z; N1 = (bx * temp2.Z - bz * temp2.X) / deno; N2 = (bx * leftMCoords[i].Z - bz * leftMCoords[i].X) / deno; //为系数矩阵赋值 A[i, 0] = bx; A[i, 1] = -temp2.Y / temp2.Z * bx; A[i, 2] = -temp2.X * temp2.Y / temp2.Z * N2; A[i, 3] = -(temp2.Z + temp2.Y * temp2.Y / temp2.Z) * N2; A[i, 4] = temp2.X * N2; L[i, 0] = N1 * leftMCoords[i].Y - N2 * temp2.Y - by; } }