参考资料:
1.武大版《工业测量技术与数据处理》P100-P106
2.转载博文——MATLAB实现DLT(Direct Linear Transform)算法
编程使用微软的Visual Studio 2015中的WinForm环境下编写,编写语言为C#。
计算所得待定点物方坐标 | |||
点号 | X | Y | Z |
1707 | 9.02889589578903 | 18.59576617145 | 10.7734065818369 |
3204 | 8.56662784077059 | 16.9495742408647 | 9.28675243972944 |
4204 | 7.74577543635323 | 16.1927805136872 | 9.29030273423021 |
3304 | 6.96298396130135 | 16.9611644191554 | 9.30017945488335 |
已知待定点物方坐标 | |||
点号 | X | Y | Z |
1707 | 9.0332 | 18.6024 | 10.7738 |
3204 | 8.5615 | 16.9463 | 9.2898 |
4204 | 7.7391 | 16.1831 | 9.2921 |
3304 | 6.9585 | 16.9551 | 9.3016 |
因为选取了少量数据,且只选择了两张像片计算系数L,所以精度在毫米范围内。
1.leftimage.txt和rightimage.txt文件为选择的像方和物方的同名控制点。其中1004号点对应测试数据里的1D04。
格式为:点号 x y X Y Z
2.unknownpoint.txt为待求点已知像方坐标。
格式为:点号 左片坐标x y 右片坐标x y
3.待求点物方坐标.txt文件为计算得到的待求点物方坐标。
格式为:点号 物方X Y Z
4.DLT计算报告.txt文件为计算过程中的中间量。
using System;
using System.IO;
using System.Windows.Forms;namespace DLT直接线性变换
{public partial class Form1 : Form{public Form1(){InitializeComponent();}变量string readleftimagefilename;string readrightimagefilename;string readunknownfilename;string[] line1 = new string[6];//把左像TXT中数据读入数组//leftimagedouble[,] leftimage = new double[6, 6];string[] line2 = new string[6];//把右像TXT中数据读入数组//rightimagedouble[,] rightimage = new double[6, 6];string[] line3 = new string[4];//把未知点TXT中数据读入数组//unknownpointdouble[,] unknownpoint = new double[4, 5];//左像double[,] leftL = new double[12, 1];double[,] leftx0 = new double[1, 1];double[,] lefty0 = new double[1, 1];//右像double[,] rightL = new double[12, 1];double[,] rightx0 = new double[1, 1];double[,] righty0 = new double[1, 1];//待求点private void 打开左像控制点文件ToolStripMenuItem_Click(object sender, EventArgs e){OpenFileDialog openleftfile = new OpenFileDialog();openleftfile.Filter = "文本文件(*.txt)|*.txt";if (openleftfile.ShowDialog() == DialogResult.OK){StreamReader readfile = new StreamReader(openleftfile.FileName);readleftimagefilename = openleftfile.FileName;int m, p;richTextBox1.Text = "点号 x(m) y(m) X(m) Y(m) Z(m)\n";for (m = 0; m < 6; m++){line1[m] = readfile.ReadLine();string[] data10 = line1[m].Split(' ');for (p = 0; p < data10.Length; p++){leftimage[m, p] = Convert.ToDouble(data10[p]);//将数据读入具体变量richTextBox1.Text += leftimage[m, p] + " ";}richTextBox1.Text += "\n";}} }private void 打开右像控制点文件ToolStripMenuItem_Click(object sender, EventArgs e){OpenFileDialog openrightfile = new OpenFileDialog();openrightfile.Filter = "文本文件(*.txt)|*.txt";if (openrightfile.ShowDialog() == DialogResult.OK){StreamReader readfile = new StreamReader(openrightfile.FileName);readrightimagefilename = openrightfile.FileName;int m, p;richTextBox2.Text = "点号 x(m) y(m) X(m) Y(m) Z(m)\n"; for (m = 0; m < 6; m++){line2[m] = readfile.ReadLine();string[] data20 = line2[m].Split(' ');for (p = 0; p < data20.Length; p++){rightimage [m, p] =Convert.ToDouble( data20[p]);richTextBox2.Text += rightimage[m, p] + ",";}richTextBox2.Text += "\n";}}}private void 打开待定点像方坐标ToolStripMenuItem_Click(object sender, EventArgs e){OpenFileDialog openunknownfile = new OpenFileDialog();openunknownfile.Filter = "文本文件(*.txt)|*.txt";if (openunknownfile.ShowDialog() == DialogResult.OK){StreamReader readfile = new StreamReader(openunknownfile.FileName);readunknownfilename = openunknownfile.FileName;int i, j;richTextBox3.Text = "点号 左像x(m) y(m) 右像x(m) y(m)\n"; for (i = 0; i < 4; i++){line3[i] = readfile.ReadLine();string[] data30 = line3[i].Split(' ');for (j = 0; j < data30.Length; j++){unknownpoint[i, j] =Convert.ToDouble( data30[j]);richTextBox3.Text += unknownpoint[i, j] + " "; }richTextBox3.Text += "\n";} } }private void groupBox2_Enter(object sender, EventArgs e){}private void 计算左像系数L与畸变系数ToolStripMenuItem_Click(object sender, EventArgs e){//功能:计算L系数的近似值和精确值//计算L系数近似值double[,] X = new double[12, 11];double[,] X0 = new double[11, 11];double[,] B = new double[12, 1];double[,] L = new double[12, 1];double[,] x0 = new double[1, 1];double[,] y0 = new double[1, 1];int i, j;for (i = 0; i < 6; i++){X[2 * i, 0] = leftimage[i, 3];X[2 * i, 1] = leftimage[i, 4];X[2 * i, 2] = leftimage[i, 5];X[2 * i, 3] = 1;X[2 * i + 1, 0] = 0;X[2 * i + 1, 1] = 0;X[2 * i + 1, 2] = 0;X[2 * i + 1, 3] = 0;X[2 * i, 4] = 0;X[2 * i, 5] = 0;X[2 * i, 6] = 0;X[2 * i, 7] = 0;X[2 * i + 1, 0] = leftimage[i, 3];X[2 * i + 1, 1] = leftimage[i, 4];X[2 * i + 1, 2] = leftimage[i, 5];X[2 * i + 1, 7] = 1;X[2 * i, 8] = leftimage[i, 1] * leftimage[i, 3];X[2 * i, 9] = leftimage[i, 1] * leftimage[i, 4];X[2 * i, 10] = leftimage[i, 1] * leftimage[i, 5];X[2 * i + 1, 8] = leftimage[i, 2] * leftimage[i, 3];X[2 * i + 1, 9] = leftimage[i, 2] * leftimage[i, 4];X[2 * i + 1, 10] = leftimage[i, 2] * leftimage[i, 5];B[2 * i, 0] = leftimage[i, 1];B[2 * i + 1, 0] = leftimage[i, 2];}for (i = 0; i < 12; i++){B[i, 0] = -B[i, 0];}for (i = 0; i < 11; i++){for (j = 0; j < 11; j++){X0[i, j] = X[i, j];}}X0 = Matrix.Athwart(X0);L = Matrix.MultiplyMatrix(X0, B);//计算像主点近似值x0[0, 0] = -(L[0, 0] * L[8, 0] + L[1, 0] * L[9, 0] + L[2, 0] * L[10, 0])/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);y0[0, 0] = -(L[4, 0] * L[8, 0] + L[5, 0] * L[9, 0] + L[6, 0] * L[10, 0])/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);//计算L系数精确值double[,] M = new double[12, 12];double[,] W = new double[12, 1];double[] A = new double[6];double[] r2 = new double[6];//r的平方 int n = 0;//迭代计算do{for (i = 0; i < 6; i++){A[i] = L[8, 0] * leftimage[i, 3] + L[9, 0] * leftimage[i, 4] + L[10, 0] * leftimage[i, 5] + 1;M[2 * i, 0] = leftimage[i, 3] / A[i];M[2 * i, 1] = leftimage[i, 4] / A[i];M[2 * i, 2] = leftimage[i, 5] / A[i];M[2 * i, 3] = 1 / A[i];M[2 * i, 4] = 0;M[2 * i, 5] = 0;M[2 * i, 6] = 0;M[2 * i, 7] = 0;M[2 * i, 8] = leftimage[i, 1] * leftimage[i, 3] / A[i];M[2 * i, 9] = leftimage[i, 1] * leftimage[i, 4] / A[i];M[2 * i, 10] = leftimage[i, 1] * leftimage[i, 5] / A[i];M[2 * i + 1, 0] = 0;M[2 * i + 1, 1] = 0;M[2 * i + 1, 2] = 0;M[2 * i + 1, 3] = 0;M[2 * i + 1, 4] = leftimage[i, 3] / A[i];M[2 * i + 1, 5] = leftimage[i, 4] / A[i];M[2 * i + 1, 6] = leftimage[i, 5] / A[i];M[2 * i + 1, 7] = 1 / A[i];M[2 * i + 1, 8] = leftimage[i, 2] * leftimage[i, 3] / A[i];M[2 * i + 1, 9] = leftimage[i, 2] * leftimage[i, 4] / A[i];M[2 * i + 1, 10] = leftimage[i, 2] * leftimage[i, 5] / A[i];r2[i] = (leftimage[i, 1] - x0[0, 0]) * (leftimage[i, 1] - x0[0, 0])+ (leftimage[i, 2] - y0[0, 0]) * (leftimage[i, 2] - y0[0, 0]);M[2 * i, 11] = (leftimage[i, 1] - x0[0, 0]) * r2[i];M[2 * i + 1, 11] = (leftimage[i, 2] - y0[0, 0]) * r2[i];W[2 * i, 0] = leftimage[i, 1] / A[i];W[2 * i + 1, 0] = leftimage[i, 2] / A[i];}for(i=0;i<12;i++){for(j=0;j<12;j++){M[i, j] = -M[i, j];}}L = Matrix.MultiplyMatrix(Matrix.Athwart(Matrix.MultiplyMatrix(Matrix.Transpose(M), M)),Matrix.MultiplyMatrix(Matrix.Transpose(M), W));x0[0, 0] = -(L[0, 0] * L[8, 0] + L[1, 0] * L[9, 0] + L[2, 0] * L[10, 0])/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);y0[0, 0] = -(L[4, 0] * L[8, 0] + L[5, 0] * L[9, 0] + L[6, 0] * L[10, 0])/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);n = n + 1; }while (n < 20);richTextBox4.Text += "计算左像L精确值循环次数:" + n + "\n";leftL = L;leftx0 = x0;lefty0 = y0;//输出到文本框中richTextBox4.Text += "左像L系数值:\n";for (i = 0; i < 12; i++){richTextBox4.Text += Convert.ToString(L[i, 0]) + "\n";} richTextBox4.Text += "左像内方位元素:\n";richTextBox4.Text += Convert.ToString(x0[0, 0]) + "\n";richTextBox4.Text += Convert.ToString(y0[0, 0]) + "\n";richTextBox4.Text += "\n";}private void 计算右像系数L与畸变系数ToolStripMenuItem_Click(object sender, EventArgs e){//功能:计算L系数的近似值和精确值//计算L系数近似值double[,] X = new double[12, 11];double[,] X0 = new double[11, 11];double[,] B = new double[12, 1];double[,] L = new double[12, 1];double[,] x0 = new double[1, 1];double[,] y0 = new double[1, 1];int i, j;for (i = 0; i < 6; i++){X[2 * i, 0] = rightimage[i, 3];X[2 * i, 1] = rightimage[i, 4];X[2 * i, 2] = rightimage[i, 5];X[2 * i, 3] = 1;X[2 * i + 1, 0] = 0;X[2 * i + 1, 1] = 0;X[2 * i + 1, 2] = 0;X[2 * i + 1, 3] = 0;X[2 * i, 4] = 0;X[2 * i, 5] = 0;X[2 * i, 6] = 0;X[2 * i, 7] = 0;X[2 * i + 1, 0] = rightimage[i, 3];X[2 * i + 1, 1] = rightimage[i, 4];X[2 * i + 1, 2] = rightimage[i, 5];X[2 * i + 1, 7] = 1;X[2 * i, 8] = rightimage[i, 1] * rightimage[i, 3];X[2 * i, 9] = rightimage[i, 1] * rightimage[i, 4];X[2 * i, 10] = rightimage[i, 1] * rightimage[i, 5];X[2 * i + 1, 8] = rightimage[i, 2] * rightimage[i, 3];X[2 * i + 1, 9] = rightimage[i, 2] * rightimage[i, 4];X[2 * i + 1, 10] = rightimage[i, 2] * rightimage[i, 5];B[2 * i, 0] = rightimage[i, 1];B[2 * i + 1, 0] = rightimage[i, 2];}for (i = 0; i < 12; i++){B[i, 0] = -B[i, 0];}for (i = 0; i < 11; i++){for (j = 0; j < 11; j++){X0[i, j] = X[i, j];}}X0 = Matrix.Athwart(X0);L = Matrix.MultiplyMatrix(X0, B);//计算像主点近似值x0[0, 0] = -(L[0, 0] * L[8, 0] + L[1, 0] * L[9, 0] + L[2, 0] * L[10, 0])/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);y0[0, 0] = -(L[4, 0] * L[8, 0] + L[5, 0] * L[9, 0] + L[6, 0] * L[10, 0])/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);//计算L系数精确值double[,] M = new double[12, 12];double[,] W = new double[12, 1];double[] A = new double[6];double[] r2 = new double[6];//r的平方 int n = 0;//迭代计算do{for (i = 0; i < 6; i++){A[i] = L[8, 0] * rightimage[i, 3] + L[9, 0] * rightimage[i, 4] + L[10, 0] * rightimage[i, 5] + 1;M[2 * i, 0] = rightimage[i, 3] / A[i];M[2 * i, 1] = rightimage[i, 4] / A[i];M[2 * i, 2] = rightimage[i, 5] / A[i];M[2 * i, 3] = 1 / A[i];M[2 * i, 4] = 0;M[2 * i, 5] = 0;M[2 * i, 6] = 0;M[2 * i, 7] = 0;M[2 * i, 8] = rightimage[i, 1] * rightimage[i, 3] / A[i];M[2 * i, 9] = rightimage[i, 1] * rightimage[i, 4] / A[i];M[2 * i, 10] = rightimage[i, 1] * rightimage[i, 5] / A[i];M[2 * i + 1, 0] = 0;M[2 * i + 1, 1] = 0;M[2 * i + 1, 2] = 0;M[2 * i + 1, 3] = 0;M[2 * i + 1, 4] = rightimage[i, 3] / A[i];M[2 * i + 1, 5] = rightimage[i, 4] / A[i];M[2 * i + 1, 6] = rightimage[i, 5] / A[i];M[2 * i + 1, 7] = 1 / A[i];M[2 * i + 1, 8] = rightimage[i, 2] * rightimage[i, 3] / A[i];M[2 * i + 1, 9] = rightimage[i, 2] * rightimage[i, 4] / A[i];M[2 * i + 1, 10] = rightimage[i, 2] * rightimage[i, 5] / A[i];r2[i] = (rightimage[i, 1] - x0[0, 0]) * (rightimage[i, 1] - x0[0, 0])+ (rightimage[i, 2] - y0[0, 0]) * (rightimage[i, 2] - y0[0, 0]);M[2 * i, 11] = (rightimage[i, 1] - x0[0, 0]) * r2[i];M[2 * i + 1, 11] = (rightimage[i, 2] - y0[0, 0]) * r2[i];W[2 * i, 0] = rightimage[i, 1] / A[i];W[2 * i + 1, 0] = rightimage[i, 2] / A[i];}for (i = 0; i < 12; i++){for (j = 0; j < 12; j++){M[i, j] = -M[i, j];}}L = Matrix.MultiplyMatrix(Matrix.Athwart(Matrix.MultiplyMatrix(Matrix.Transpose(M), M)),Matrix.MultiplyMatrix(Matrix.Transpose(M), W));x0[0, 0] = -(L[0, 0] * L[8, 0] + L[1, 0] * L[9, 0] + L[2, 0] * L[10, 0])/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);y0[0, 0] = -(L[4, 0] * L[8, 0] + L[5, 0] * L[9, 0] + L[6, 0] * L[10, 0])/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);n = n + 1;}while (n < 20);richTextBox4.Text += "计算右像L精确值循环次数:" + n + "\n";rightL = L;rightx0 = x0;righty0 = y0;//输出到文本框中richTextBox4.Text += "右像L系数值:\n";for (i = 0; i < 12; i++){richTextBox4.Text += Convert.ToString(L[i, 0]) + "\n";}richTextBox4.Text += "右像内方位元素:\n";richTextBox4.Text += Convert.ToString(x0[0, 0]) + "\n";richTextBox4.Text += Convert.ToString(y0[0, 0]) + "\n";richTextBox4.Text += "\n";}private void 计算待定点物方坐标ToolStripMenuItem_Click(object sender, EventArgs e){//对待求点相片坐标进行畸变改正double[] leftR2 = new double[4];double[] leftxx = new double[4];double[] leftyy = new double[4];double[] rightR2 = new double[4];double[] rightxx = new double[4];double[] rightyy = new double[4];int i, j, k;for(i=0;i<4;i++){leftR2[i] = (unknownpoint[i, 1] - leftx0[0, 0]) * (unknownpoint[i, 1] - leftx0[0, 0])+ (unknownpoint[i, 2] - leftx0[0, 0]) * (unknownpoint[i, 2] - leftx0[0, 0]);leftxx[i] = unknownpoint[i, 1] + (unknownpoint[i, 1] - leftx0[0, 0]) * leftR2[i] * leftL[11, 0];leftyy[i] = unknownpoint[i, 2] + (unknownpoint[i, 2] - lefty0[0, 0]) * leftR2[i] * leftL[11, 0];rightR2[i] = (unknownpoint[i, 3] - rightx0[0, 0]) * (unknownpoint[i, 3] - rightx0[0, 0])+ (unknownpoint[i, 4] - rightx0[0, 0]) * (unknownpoint[i, 4] - rightx0[0, 0]);rightxx[i] = unknownpoint[i, 3] + (unknownpoint[i, 3] - rightx0[0, 0]) * rightR2[i] * rightL[11, 0];rightyy[i] = unknownpoint[i, 4] + (unknownpoint[i, 4] - righty0[0, 0]) * rightR2[i] * rightL[11, 0];}//计算待定点物方坐标近似值double[,] XYZ = new double[4, 3];double[,] singleXYZ = new double[3, 1];double[,] B = new double[3, 3];double[,] C = new double[3, 1];for (i=0;i<4; i++){B[0, 0] = leftL[0, 0] + leftxx[i] * leftL[8, 0];B[0, 1] = leftL[1, 0] + leftxx[i] * leftL[9, 0];B[0, 2] = leftL[2, 0] + leftxx[i] * leftL[10, 0];B[1, 0] = leftL[4, 0] + leftyy[i] * leftL[8, 0];B[1, 1] = leftL[5, 0] + leftyy[i] * leftL[9, 0];B[1, 2] = leftL[6, 0] + leftyy[i] * leftL[10, 0];B[2, 0] = rightL[0, 0] + rightxx[i] * rightL[8, 0];B[2, 1] = rightL[1, 0] + rightxx[i] * rightL[9, 0];B[2, 2] = rightL[2, 0] + rightxx[i] * rightL[10, 0];C[0, 0] = leftL[3, 0] + leftxx[i];C[1, 0] = leftL[7, 0] + leftxx[i];C[2, 0] = rightL[3, 0] + rightxx[i];C[0, 0] = -C[0, 0];C[1, 0] = -C[0, 0];C[2, 0] = -C[0, 0];B = Matrix.Athwart(B);singleXYZ = Matrix.MultiplyMatrix(B, C);for (j = 0; j < 3; j++){XYZ[i, j] = singleXYZ [j,0];} }//计算待定点物方坐标精确值double[,] N = new double[4, 3];double[,] Q = new double[4, 1];double[,] deltaXYZ = new double[1, 3];double[,] newXYZ = new double[1, 3];for (i=0;i<4;i++){j = 0;do{double leftA, rightA;leftA = leftL[8, 0] * XYZ[i, 0] + leftL[9, 0] * XYZ[i, 1] + leftL[10, 0] * XYZ[i, 2] + 1;N[0, 0] = -(leftL[0, 0] + leftxx[i] * leftL[8, 0]) / leftA;N[0, 1] = -(leftL[1, 0] + leftxx[i] * leftL[9, 0]) / leftA;N[0, 2] = -(leftL[2, 0] + leftxx[i] * leftL[10, 0]) / leftA;N[1, 0] = -(leftL[4, 0] + leftyy[i] * leftL[8, 0]) / leftA;N[1, 1] = -(leftL[5, 0] + leftyy[i] * leftL[9, 0]) / leftA;N[1, 2] = -(leftL[6, 0] + leftyy[i] * leftL[10, 0]) / leftA;rightA = rightL[8, 0] * XYZ[i, 0] + rightL[9, 0] * XYZ[i, 1] + rightL[10, 0] * XYZ[i, 2] + 1;N[2, 0] = -(rightL[0, 0] + rightxx[i] * rightL[8, 0]) / rightA;N[2, 1] = -(rightL[1, 0] + rightxx[i] * rightL[9, 0]) / rightA;N[2, 2] = -(rightL[2, 0] + rightxx[i] * rightL[10, 0]) / rightA;N[3, 0] = -(rightL[4, 0] + rightyy[i] * rightL[8, 0]) / rightA;N[3, 1] = -(rightL[5, 0] + rightyy[i] * rightL[9, 0]) / rightA;N[3, 2] = -(rightL[6, 0] + rightyy[i] * rightL[10, 0]) / rightA;Q[0, 0] = (leftL[3, 0] + leftxx[i]) / leftA;Q[1, 0] = (leftL[7, 0] + leftyy[i]) / leftA;Q[2, 0] = (rightL[3, 0] + rightxx[i]) / rightA;Q[3, 0] = (rightL[7, 0] + rightyy[i]) / rightA;newXYZ = Matrix.Transpose(Matrix.MultiplyMatrix(Matrix.Athwart(Matrix.MultiplyMatrix(Matrix.Transpose(N), N)),Matrix.MultiplyMatrix(Matrix.Transpose(N), Q)));for (k = 0; k < 3; k++){deltaXYZ[0, k] = newXYZ[0, k] - XYZ[i, k];XYZ[i, k] = newXYZ[0, k];}j = j + 1;}while (deltaXYZ[0, 0] > 0.000000000001 || deltaXYZ[0, 0] < -0.000000000001);richTextBox4.Text += "计算待求点物方坐标精确值迭代次数:" + j + "\n";}//Coordinate为待定点物方坐标// 格式为:点号 X Y Zdouble[,] Coordinate = new double[4, 4];richTextBox5.Text += "待定点物方坐标:\n";for (i = 0; i < 4; i++){Coordinate[i, 0] = unknownpoint[i, 0];richTextBox5.Text += Convert.ToString(Coordinate[i, 0]) + "\t";for (j = 1; j < 4; j++){Coordinate[i, j] = XYZ[i, j-1];richTextBox5.Text += Convert.ToString(Coordinate[i, j]) + "\t"; }richTextBox5.Text += "\n"; }}private void 导出待定点物方坐标ToolStripMenuItem_Click(object sender, EventArgs e){SaveFileDialog savefile = new SaveFileDialog();savefile.Filter = "文本文件(*.txt)|*.txt";savefile.FileName = "待定点物方坐标.txt";if (savefile.ShowDialog() == DialogResult.OK){richTextBox5.SaveFile(savefile.FileName, RichTextBoxStreamType.PlainText);}MessageBox.Show("文件保存成功!");}private void 导出计算报告ToolStripMenuItem_Click(object sender, EventArgs e){SaveFileDialog savefile = new SaveFileDialog();savefile.Filter = "文本文件(*.txt)|*.txt";savefile.FileName = "DLT计算报告.txt";if (savefile.ShowDialog() == DialogResult.OK){richTextBox4.SaveFile(savefile.FileName, RichTextBoxStreamType.PlainText);}MessageBox.Show("文件保存成功!");}}
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态