前方交会与后方交会

2023-10-27

1.前方交会

1.1 前方交会的概念

利用立体像对两张像片的内方位元素、同名像点坐标和像对的相对方位元素(或外方位元素)解算模型点坐标(或地面点坐标)的工作,称为空间前方交会。在摄影测量中主要有两种:
1.利用立体像对两张像片的相对方位元素,计算模型点的三位坐标;
2.利用立体像对两张像片的外方位元素,计算地面点的地面坐标。

1.2 前方交会基本关系式

要确定像点与其对应的模型点(地面点)的数学表达式,如上图所示,D-XYZ为地面摄影测量坐标系,S~1~ - U~1~V~1~W~1~及S~2~ - U~2~V~2~W~2~分别为左右像片的像空间辅助坐标系,且两个像空间辅助坐标系的三个轴分别与D-XYZ三轴平行。

设地面点A在D-XYZ坐标系中的坐标为(X,Y,Z),地面点A在S1 - U1V1W1及S2 - U2V2W2的坐标分别为(U1,V1,W1)及(U2,V2,W2),A点相应的像点坐标a1、a2的像空间坐标为(x1,y1,-f)、(x2,y2,-f),像点的像空间辅助坐标为(u1,v1,w1)、(u2、v2、w2),则有:

式中的R1,R2为已知的外方位元素计算的左右像片的旋转矩阵。右摄影站点S2在S1 - U1V1W1中的坐标,即摄影基线B的三个分量Bu,Bv,Bw,可由外方位线元素计算:

因左、右像空间辅助坐标系及D-XYZ相互平行,且摄影站点、像点、地面点三点共线,由此可得出:

式中的N1、N2分别称为左、右像点的投影系数。U1、V1、W1为地面点A在S1 - U1V1W1中的坐标,U2、V2、W2为地面点A在S2 - U2V2W2中的坐标,且

最后得出地面点坐标的公式为:

一般地,在计算地面点Y坐标时,应取均值,即

考虑到(2)式,(5)式又可变为:

由上式的一、三式联立求解,得投影系数的计算式为:

1.3 前方交会代码

//利用像片外方位元素进行前方交会
#include<iostream>
#include<fstream>
#include <iomanip>
#include "opencv2/opencv2.hpp"

using namespace std;
using namespace cv;

int main()
{
	//从文件中读取同名像点坐标到数组
	double T_Z_B[2][2] = {0.0 };
	ifstream infile1;//定义文件流对象
	infile1.open("E:\\space_intersection\\1.txt");//打开文档
	double *ptr1 = &T_Z_B[0][0];
	while (!infile1.eof())
	{
		infile1 >> *ptr1;//这是把文档里面的数对应放在ptr位置上的数值上
		ptr1++;
	}
	infile1.close();
	double x1 = T_Z_B[0][0];
	double y1 = T_Z_B[0][1];
	double x2 = T_Z_B[1][0];
	double y2 = T_Z_B[1][1];
	//定义内方位元素
	double x0 = -0.00000;//mm
	double y0 = 0.00000;//mm
	double f = 70.50;//mm
	//从文件中读取外方位元素到数组
	/*int i, j;*/
	double data[2][6] = { 0.0 };
	ifstream infile2;//定义文件流对象
	infile2.open("E:\\space_intersection\\2.txt");//打开文档
	double *ptr2 = &data[0][0];
	while (!infile2.eof())
	{
		infile2 >> *ptr2;//这是把文档里面的数对应放在ptr位置上的数值上
		ptr2++;
	}
	infile2.close();
	
	//左右像片的外方位元素
	double Xs1 = data[0][0];
	double Ys1 = data[0][1];
	double Zs1 = data[0][2];
	double phi1 = data[0][3];
	double omig1 = data[0][4];
	double kappa1 = data[0][5];
	double Xs2 = data[1][0];
	double Ys2 = data[1][1];
	double Zs2 = data[1][2];
	double phi2 = data[1][3];
	double omig2 = data[1][4];
	double kappa2 = data[1][5];
	//cout.precision(12);//控制输出的小数点位数
	//计算摄影基线的三个分量
	double Bx = Xs2 - Xs1;
	double By = Ys2 - Ys1;
	double Bz = Zs2 - Zs1;
	//利用外方位角元素计算左右像片的旋转矩阵R1和R2,用OpenCV矩阵,方便
	double a1 = cos(phi1)*cos(kappa1) - sin(phi1)*sin(omig1)*sin(kappa1);
	double a2 = -cos(phi1)*sin(kappa1) - sin(phi1)*sin(omig1)*cos(kappa1);
	double a3 = -sin(phi1)*cos(omig1);
	double b1 = cos(omig1)*sin(kappa1);
	double b2 = cos(omig1)*cos(kappa1);
	double b3 = -sin(omig1);
	double c1 = sin(phi1)*cos(kappa1) + cos(phi1)*sin(omig1)*sin(kappa1);
	double c2 = -sin(phi1)*sin(kappa1) + cos(phi1)*sin(omig1)*cos(kappa1);
	double c3 = cos(phi1)*cos(omig1);
	Mat R1 = Mat::ones(3, 3, CV_64F);
	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 a11 = cos(phi2)*cos(kappa2) - sin(phi2)*sin(omig2)*sin(kappa2);
	double a22 = -cos(phi2)*sin(kappa2) - sin(phi2)*sin(omig2)*cos(kappa2);
	double a33 = -sin(phi2)*cos(omig2);
	double b11 = cos(omig2)*sin(kappa2);
	double b22 = cos(omig2)*cos(kappa2);
	double b33 = -sin(omig2);
	double c11 = sin(phi2)*cos(kappa2) + cos(phi2)*sin(omig2)*sin(kappa2);
	double c22 = -sin(phi2)*sin(kappa2) + cos(phi2)*sin(omig2)*cos(kappa2);
	double c33 = cos(phi2)*cos(omig2);
	Mat R2 = Mat::ones(3, 3, CV_64F);
	R2.at<double>(0, 0) = a11;
	R2.at<double>(0, 1) = a22;
	R2.at<double>(0, 2) = a33;
	R2.at<double>(1, 0) = b11;
	R2.at<double>(1, 1) = b22;
	R2.at<double>(1, 2) = b33;
	R2.at<double>(2, 0) = c11;
	R2.at<double>(2, 1) = c22;
	R2.at<double>(2, 2) = c33;
	
	//计算同名像点的像空间辅助坐标系(X1,Y1,Z1)与(X2,Y2,Z2)
	Mat RR1, RR2;
	Mat R3 = Mat::ones(3, 1, CV_64F);
	R3.at<double>(0, 0) = x1;
	R3.at<double>(1, 0) = y1;
	R3.at<double>(2, 0) = -f;
	Mat R33 = Mat::ones(3, 1, CV_64F);
	R33.at<double>(0, 0) = x2;
	R33.at<double>(1, 0) = y2;
	R33.at<double>(2, 0) = -f;
	RR1 = R1 * R3;
	double X1 = RR1.at<double>(0, 0);
	double Y1 = RR1.at<double>(1, 0);
	double Z1 = RR1.at<double>(2, 0);
	
	RR2 = R2 * R33;
	double X2 = RR2.at<double>(0, 0);
	double Y2 = RR2.at<double>(1, 0);
	double Z2 = RR2.at<double>(2, 0);
	
	//计算投影系数N1,N2
	double N1 = (Bx*Z2 - Bz * X2) / (X1*Z2 - X2 * Z1);
	double N2 = (Bx*Z1 - Bz * X1) / (X1*Z2 - X2 * Z1);

	//计算地面点的左像辅系坐标(deteX,deteY,deteZ)
	double deteX = N1 * X1;
	double deteY = 0.5*(N1*Y1 + N2 * Y2 + By);
	double deteZ = N1 * Z1;
	//计算地面点的地面坐标(X,Y,Z)
	double X = Xs1 + deteX;
	double Y = Ys1 + deteY;
	double Z = Zs1 + deteZ;
	cout.precision(11);
	cout << "计算得出地面点的地面坐标分别是:" << endl
	  	<< "X=" << X<< endl
		<< "Y=" << Y << endl
		<< "Z=" << Z<< endl;
	cout << "You have finished the work  !" << endl;
	system("pause");
	return 0;
}

2.后方交会

2.1 后方交会的概念

空间后方交会的定义是利用地面控制点及其在像片上的像点,确定单幅影像外方位元素的方法。如果已知每张像片的6个外方位元素,就能确定被摄物体与航摄像片的关系,因此,如何获取像片的外方位元素,一直是摄影测量工作者所探讨的问题。目前,采用的测定方法有:利用雷达、全球定位系统(GPS)、惯性导航系统(WS)以及星相摄影机来获取像片的外方位元素;也可利用摄影测量空间后方交会,如下图所示,该方法的基本思想是利用至少三个已知地面控制点的坐标A(XA,YA,ZA)、B(XB,YB,ZB),C(XC,YC,ZC),与其影像上对应的三个像点坐标a(xa,ya)、b(xb,yb)、c(xc,yc),根据共线方程,反求该像片的外方位元素XS、YS、ZS ϕ \phi ϕ ω \omega ω κ \kappa κ。这种解算方法是以单张像片为基础,亦称单像空间后方交会。

2.2 后方交会基本关系式

空间后方交会采用的基本关系式为下面的共线条件方程式:

由于共线条件方程是非线性函数模型,为了便于计算,需把非线性函数表达式用泰勒公式展开为线性形式,人们常把这一数学处理过程称为“线性化”。

将共线式线性化并取一次小值项得:

式中,(x)、(y)为函数的近似值,是将外方位元素初始值XS0、YS0、ZS0 ϕ \phi ϕ0 ω \omega ω0 κ \kappa κ0带入共线条件式所取得的数值。dXS、dYS、dZS、d ϕ \phi ϕ、d ω \omega ω、d κ \kappa κ为外方位元素近似值的改正数。那些偏导数是外方位元素改正数的系数。对于每一个控制点,把像点坐标x、y和相应地面点摄影测量坐标X、Y、Z代入(2)式,就能列出两个方程式。若像片内有三个已知地面控制点,就能列出六个方程式,求出六个外方位元素的改正值。由于(2)式中系数仅取泰勒级数展开式的一次项,未知数的近似值改正是粗略的,所以计算必须采用逐渐趋近法,解求过程需要反复趋近,直至改正数小于某一限值为止。

2.3 后方交会的误差方程式与法方程式

2.4 后方交会流程

①获取已知数据:
  从摄影资料中查取像片比例尺1/m,平均航高,内方位元素x0,y0,f;
  从外业测量成果中,获取控制点的地面测量点坐标Xt,Yt,Zt,并转化为地面摄影测量坐标X、Y、Z。
②量测控制点的像点坐标:
  将控制点标刺在像片上,利用立体坐标量测仪量测控制点的像框标坐标,并经像点坐标改正,得到像点坐标x、y。
③确定参数初值:
  参数的初值即XS0,YS0,ZS0, ϕ \phi ϕ0, ω \omega ω0, κ \kappa κ0。在竖直航空摄影且地面控制点大体对称分布的情况下,可按如下方法确定初值:
  
④计算旋转矩阵:
  利用角元素的近似值计算方向余弦值,组成R矩阵。
⑤计算像点坐标近似值:
  利用参数的近似值,按共线方程计算各个控制点对应像点的像平面坐标近似值xi0,yi0(i=1,2,…n)。
⑥组成误差方程式:
  一个控制点对应的误差方程为
  
  写成矩阵形式为 Vi = Ai X – Li ,其中系数矩阵A中的元素均为偏导数。
  
  为了计算这些偏导数,引入以下记号:
  
  推导过程就是各种求偏导数,这里不再描述,直接给出A矩阵中的系数结果
  
  对每一个控制点,计算其对应的方程的系数矩阵Ai、常数项Li,然后联立起来,得:
  
  记为
  
⑦组成法方程式:计算法方程式的系数矩阵和常数项
  按最小二乘原理,取权阵为单位阵,则法方程为:
  
  这一步骤需要计算出ATA和ATL。
⑧解求外方位元素:
  根据法方程,按下式解求外方位元素改正数,并与相应的近似值求和,得到外方位元素新的近似值。
  
⑨检查计算是否收敛:
  将求得的外方位元素的改正数与规定的限差比较,小于限差则计算终止,否则用新的近似值重复进行第④至第⑧步的计算,直到满足要求为止。

2.5 后方交会评价精度

按照上述方法求得的外方位元素,其精度可以通过法方程的系数矩阵的逆矩阵来求得,即
  
协因数阵Q的对角线Qii就是第i个未知数的权倒数。若单位权中误差为m0,则第i个微指数的中误差为:
  
当参加空间后方交会的控制点有n个时,单位权中误差可按下式计算:
  

2.6 后方交会代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<iostream>
#include <opencv2\opencv.hpp>

#define GCPNUMBER 4		//设置初始值控制点数量
#define N 6
using namespace cv;

int main()
{
	int i, j;
	int repeatNumber = 0;	//迭代次数
	int m = 40000;	//比例尺
	double x0 = 0, y0 = 0, f = 0.15324;	//内方位元素
	double outerElement[6] = { 0.0 };	//要求的参数:Xs,Ys,Zs,fai,omiga,kaba;
										//输入控制点空间坐标和像坐标xy和XYZ
	double GCPLocationxy[GCPNUMBER][2] = {		//控制点像坐标
		{ -0.08615, -0.06899 },
		{ -0.05340, 0.08221 },
		{ -0.01478, -0.07663 },
		{ 0.01046, 0.06443 } };
	double GCPLocationXYZ[GCPNUMBER][3] = {	//控制点物空间坐标
		{ 36589.41, 25273.32, 2195.17 },
		{ 37631.08, 31324.51, 728.69 },
		{ 39100.97, 24934.98, 2386.50 },
		{ 40426.54, 30319.81, 757.31 } };
	printf("单像空间后方交会:\n\n");
	printf("已知条件:\n\n");
	printf("  比例尺:\n      m = %d\n\n", m);
	printf("  内方位元素:\n     x0 = %lf   y0 = %lf   f = %lf\n\n", x0, y0, f);
	printf("  控制点像坐标:\n");
	for (i = 0; i < GCPNUMBER; i++)
	{
		printf("     ");
		for (j = 0; j < 2; j++)
		{
			printf("%lf   ", GCPLocationxy[i][j]);
		}
		printf("\n");
	}
	printf("\n  控制点物空间坐标:\n");
	for (i = 0; i < GCPNUMBER; i++)
	{
		printf("     ");
		for (j = 0; j < 3; j++)
		{
			printf("%lf   ", GCPLocationXYZ[i][j]);
		}
		printf("\n");
	}
	printf("\n迭代过程:");
	//给外方位元素赋初值
	double sumXYZ[3] = { 0.0 };
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < GCPNUMBER; j++)
		{
			sumXYZ[i] += GCPLocationXYZ[j][i];
		}
		for (j = 0; j < 2; j++)
			outerElement[i] = sumXYZ[i] / GCPNUMBER;	//XY为四个控制点取平均值
		outerElement[i] = m*f + sumXYZ[i] / GCPNUMBER;		//Z为m*f
	}
	Mat X(4 * 2,1,CV_64FC1);
	//bool GetMatrixInverse(double **src, int n, double des[N][N]);	//求逆矩阵声明
	do	//迭代过程
	{
		double R[3][3] = { 0.0 };	//旋转矩阵R
		R[0][0] = cos(outerElement[3])*cos(outerElement[5]) - sin(outerElement[3])*sin(outerElement[4])*sin(outerElement[5]);
		R[0][1] = -cos(outerElement[3])*sin(outerElement[5]) - sin(outerElement[3]) * sin(outerElement[4])*cos(outerElement[5]);
		R[0][2] = -sin(outerElement[3])*cos(outerElement[4]);
		R[1][0] = cos(outerElement[4])*sin(outerElement[5]);
		R[1][1] = cos(outerElement[4])*cos(outerElement[5]);
		R[1][2] = -sin(outerElement[4]);
		R[2][0] = sin(outerElement[3])*cos(outerElement[5]) + cos(outerElement[3])*sin(outerElement[4])*sin(outerElement[5]);
		R[2][1] = -sin(outerElement[3])*sin(outerElement[5]) + cos(outerElement[3])*sin(outerElement[4])*cos(outerElement[5]);
		R[2][2] = cos(outerElement[3])*cos(outerElement[4]);

		double Xgang[GCPNUMBER];
		for (i = 0; i < GCPNUMBER; i++)
			Xgang[i] = R[0][0] * (GCPLocationXYZ[i][0] - outerElement[0]) + R[1][0] * (GCPLocationXYZ[i][1] - outerElement[1])
			+ R[2][0] * (GCPLocationXYZ[i][2] - outerElement[2]);
		double Ygang[GCPNUMBER];
		for (i = 0; i < GCPNUMBER; i++)
			Ygang[i] = R[0][1] * (GCPLocationXYZ[i][0] - outerElement[0]) + R[1][1] * (GCPLocationXYZ[i][1] - outerElement[1])
			+ R[2][1] * (GCPLocationXYZ[i][2] - outerElement[2]);
		double Zgang[GCPNUMBER];
		for (i = 0; i < GCPNUMBER; i++)
			Zgang[i] = R[0][2] * (GCPLocationXYZ[i][0] - outerElement[0]) + R[1][2] * (GCPLocationXYZ[i][1] - outerElement[1])
			+ R[2][2] * (GCPLocationXYZ[i][2] - outerElement[2]);

		//xy作为初始值,由共线方程式子求得
		double approxxy[GCPNUMBER][2] = { 0.0 };
		for (i = 0; i < GCPNUMBER; i++)
		{
			approxxy[i][0] = -f*Xgang[i] / Zgang[i];
			approxxy[i][1] = -f*Ygang[i] / Zgang[i];
		}

		//误差方程式元素A
		Mat A(GCPNUMBER * 2, 6, CV_64FC1);
		for (i = 0; i < GCPNUMBER; i++)
		{
			A.at<double>(i * 2, 0) = (R[0][0] * f + R[0][2] * approxxy[i][0]) / Zgang[i];
			A.at<double>(i * 2, 1) = (R[1][0] * f + R[1][2] * approxxy[i][0]) / Zgang[i];
			A.at<double>(i * 2, 2) = (R[2][0] * f + R[2][2] * approxxy[i][0]) / Zgang[i];
			A.at<double>(i * 2, 3) = (approxxy[i][0] * approxxy[i][1])*R[1][0] / f - (f + pow(approxxy[i][0], 2) / f)*R[1][1] - approxxy[i][1] * R[1][2];
			A.at<double>(i * 2, 4) = -pow(approxxy[i][0], 2)*sin(outerElement[5]) / f - (approxxy[i][0] * approxxy[i][1]) / f*cos(outerElement[5]) - f*sin(outerElement[5]);
			A.at<double>(i * 2, 5) = approxxy[i][1];
			A.at<double>(i * 2 + 1, 0) = (R[0][1] * f + R[0][2] * approxxy[i][1]) / Zgang[i];
			A.at<double>(i * 2 + 1, 1) = (R[1][1] * f + R[1][2] * approxxy[i][1]) / Zgang[i];
			A.at<double>(i * 2 + 1, 2) = (R[2][1] * f + R[2][2] * approxxy[i][1]) / Zgang[i];
			A.at<double>(i * 2 + 1, 3) = -(approxxy[i][0] * approxxy[i][1])*R[1][1] / f + (f + pow(approxxy[i][1], 2) / f)*R[1][0] - approxxy[i][0] * R[1][2];
			A.at<double>(i * 2 + 1, 4) = -pow(approxxy[i][1], 2)*cos(outerElement[5]) / f - (approxxy[i][0] * approxxy[i][1]) / f*cos(outerElement[5]) - f*sin(outerElement[5]);
			A.at<double>(i * 2 + 1, 5) = -approxxy[i][0];
		}
		std::cout << A << std::endl;
		//误差方程式元素L
		Mat L(GCPNUMBER * 2, 1, CV_64FC1);
		for (i = 0; i < GCPNUMBER * 2; i++)
		{
			if (i % 2 == 0)	//x
				L.at<double>(i) = GCPLocationxy[i / 2][0] - approxxy[i / 2][0];
			else
				L.at<double>(i) = GCPLocationxy[i / 2][1] - approxxy[i / 2][1];
		}

		X = (A.t() * A).inv() * A.t() * L;
		//求得迭代后的改正值及迭代后的外方位元素
		printf("\n\n  第%d次迭代改正值:\n     ", ++repeatNumber);
		for (i = 0; i < 6; i++)
		{
			printf("%lf     ",X.at<double>(i));
			outerElement[i] = outerElement[i] + X.at<double>(i);
		}
		printf("\n  迭代后外方位元素值:\n     ");
		for (i = 0; i < 6; i++)
		{
			printf("%lf     ", outerElement[i]);
		}
	} while (X.at<double>(3) >= 2.908882087e-5 || X.at<double>(4) >= 2.908882087e-5 || X.at<double>(5) >= 2.908882087e-5);//各角元素迭代计算至其改正值小于6秒,6s=2.908882087e-5 弧度。

																													//精度评价
	printf("\n\n\n精度评价矩阵:\n");
	double outElemAccuracy[6][6] = { 0.0 };
	for (j = 0; j < 6; j++)
	{
		printf("     ");
		for (i = 0; i < 6; i++)
		{
			outElemAccuracy[j][i] = sqrt(fabs(X.at<double>(j) * X.at<double>(i)) / double(2 * GCPNUMBER - 6));
			printf("%lf   ", outElemAccuracy[j][i]);
		}
		printf("\n");
	}
	system("pause");
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前方交会与后方交会 的相关文章

  • 【Chips】跨时钟域的亚稳态处理、为什么要打两拍不是打一拍、为什么打两拍能有效?

    Title 跨时钟域的亚稳态处理 为什么要打两拍不是打一拍 为什么打两拍能有效 前言 个人颜色习惯 黑色加粗 突出显示 红色 重要 洋红色 产生的疑问 question 蓝色 个人思考 或 针对问题的Solution 1 个人疑惑 在学习
  • Spring中原型prototype的准确使用

    实际问题 项目中 报表导出涉及到了在同一个类的两个不同方法中 都有相同的查询数据库的操作 一个方法是用于获取内容 一个是用于获取条数的 大概类似于这样 code class language java hljs has numbering
  • CVPR 2022

    论文 https arxiv org abs 2112 10003 代码 https github com timojl clipseg 语雀文档 https www yuque com lart papers ma3gkwbb5ud1ew
  • 苹果手机如何打开开发者模式

    下载爱思助手 数据线连接苹果手机 点击虚拟定位 修改虚拟定位 打开开发者模式 6 根据提示前往 iPhone 设置 隐私与安全性 可发现 开发者模式 现在已经显示出来 请打开开关并重启设备 7 设备完成重启后 屏幕上会出现询问是否打开 开发
  • cpm(派系过滤算法)实现社区发现

    注意 1 派系过滤CPM方法 clique percolation method 用于发现重叠社区 派系 clique 是任意两点都相连的顶点的集合 即完全子图 2 所有彼此连通的k 派系构成的集合就是一个k 派系社区 其中一个k 派系与另
  • Java高级——内存分配机制

    内存分配 概述 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 概述 对象都是在堆上分配 但实际上也有可能经过即时编译后被拆散为标量类型并间接地在栈上分配 分代设计下 新生对象通常会
  • 极简入门 2022 docker 部署skywalking9.2.0

    安装skywalking服务 官方地址 官网 安装文档 文档地址 拉取镜像 docker pull apache skywalking oap server 9 2 0 docker pull apache skywalking ui 9
  • 树表的查找

    目录 一 基本概念 二 二叉排序树 插入 建立二叉排序树 查找 查找父结点 三 二叉排序树的删除结点 演示 删除 用直接后继替代 删除 用直接前驱替代 完整代码 四 平衡二叉树 4种调整情况 1 LL型调整 右单旋演示 代码 2 RR型调整
  • ArrayList扩容机制(基于jdk1.8)

    一 ArrayList继承了AbstractList 实现了List接口 底层实现基于数组 因此可以认为是一个可变长度的数组 二 在讲扩容机制之前 我们需要了解一下ArrayList中最主要的几个变量 定义一个空数组以供使用 private
  • GSEA软件基因富集分析

    快速目录链接 GSEA分析简介 分析步骤 1 准备数据 1 表达数据文件 2 表型标签文件 2 数据导入 3 参数设置及运行 4 结果分析 GSEA分析简介 基因集富集分析 GSEA 是一种计算方法 用于确定一组定义好的基因是否在两种生物状
  • vue项目 上传文件以 file: (binary)形式上传

    vue项目 上传文件以 file binary 形式上传 如下图片所示 关于解决这个问题 有两个步骤 1 修改Content Type属性值 小编写的如下 在headers里面封装 headers Content Type multipar
  • 【线程】线程中断详解

    文章目录 1 什么是中断线程 2 判断线程是否被中断 2 1 中断原理和中断线程用法的模板 2 2 底层中断异常处理方式 3 中断应用最佳实践 3 1 使用中断信号量中断 非阻塞 状态的线程 3 2 使用thread interrupt 中
  • 力扣算法:两数之和、整数反转、回文数、罗马数字转整数

    力扣算法 两数之和 整数反转 回文数 罗马数字转整数 一 两数之和 1 问题 2 提示 3 解题思路 4 代码 二 整数反转 1 问题 2 提示 3 解题思路 4 代码 三 回文数 1 问题 2 提示 3 解题思路 4 代码 四 罗马数字转
  • MATLAB中SVM的特征重要性排序

    MATLAB中可以通过支持向量机递归特征消除 Support Vector Machine Recursive Feature Elimination SVM RFE 来获得SVM的特征重要性排序 SVM RFE算法是根据SVM在训练时生成
  • 网络可视化工具netron安装流程

    1 在线版本 浏览器中输入链接 https lutzroeder github io netron 点击Open Model 打开相应的网络模型文件 2 window系统 打开官方Github链接 点击Download处下载 exe应用程序
  • git 远程上分支已删除,该分支在自己的版本库中仍然一直存在

    背景 最近公司项目从svn迁移到了git 在使用过程中我发现 别人创建的远程分支 代码合并完已经删除了 但是我本地的版本库中还存在他的那些分支的快照 我已经pull过远程分支的代码了 但是还是不能删除我的仓库里快照 问题 远程仓库上分支已删
  • SQL注入基础--判断闭合形式

    这里写自定义目录标题 SQL注入基础 判断闭合形式 1 整形闭合 2 单引号闭合 3 双引号闭合 总结 SQL注入基础 判断闭合形式 SQL语句的闭合形式大概如下几种 SELECT FROM users WHERE id 1 整形闭合 SE
  • 服务器文件备份拓扑图,云服务器拓扑图

    云服务器拓扑图 内容精选 换一换 精简视图提供了云服务器资源概况和状态的可视化统计结果 帮助您直观的了解云服务器资源 在精简视图中 您可以快速获取弹性云服务器基本信息 登录信息 配置信息 监控信息 精简视图提供了云服务器资源概况和状态的可视
  • 英文字符串处理

    题目描述 编写一个字符串处理程序 根据输入的不同值 进行不同的处理 可接受的输入 待处理字符串 i 字符串中所有英文字母都转成大写 5 字符串中每5个字符中间插入一个中横线 x 字符串长度不足5的倍数用x补齐 第一个输入的值必须是待处理的字

随机推荐

  • IDEA中Maven项目打包方式

    方式一 直接打包 不打包依赖包 仅打包出项目中的代码到JAR包中 可称为架包 在其他应用中运行时 必须保证其上面有相应的依赖包 才能运行 maven Lifecyle Clean Package 打包成功后就会出现target文件夹 方式二
  • 全局注册组件

    1 首先在 main js 项目入口文件中 导入要全局注册的组件 import 2 其次要创建Vue实例 createApp 3 使用 实例名 component 方法全局注册组件 两个参数 4 在其他组件中 直接以标签的形式 使用注册的全
  • End of startup status:LOW

    End of startup status LOW 解决方案 加一条约束 set property BITSTREAM CONFIG UNUSEDPIN Pullup current design
  • 【Nginx系列】- 初识Nginx

    目录 第一印象 一 提供HTTP服务 二 提供反向代理 三 提供邮件代理 总结 第一印象 Ngxin是由俄罗斯人 戈尔 赛索耶夫使用C语言编写的高性能Web服务器 它可以做什么 1 提供HTTP服务 2 反向代理服务 3 邮件代理服务 PO
  • linux xfs和ext4的区别

    centos7 0开始默认文件系统是xfs centos6是ext4 centos5是ext3 ext3和ext4的最大区别在于 ext3在fsck时需要耗费大量时间 文件越多 时间越长 而ext4在fsck时用的时间会少非常多 ext4是
  • 区域和检索 - 数组不可变——前缀和法的实践

    一 题目 给定一个整数数组 nums 求出数组从索引 i 到 j i j 范围内元素的总和 包含 i j 两点 二 解析 题目很简单 如果直接暴力法 即存储数组 nums的值 每次调用 sumRange 时 通过循环的方法计算数组 nums
  • 01预习-软件缺陷基础 窗体顶端  1单选(1分)  编码阶段产生的错误由()检查出来的。  A集成测试 B有效性测试 C单元测试 D系统测试  2单选(1分)  修复软件缺陷费用最

    01预习 软件缺陷基础 窗体顶端 1单选 1分 编码阶段产生的错误由 检查出来的 A集成测试 B有效性测试 C单元测试 D系统测试 2单选 1分 修复软件缺陷费用最高的是 阶段 A发布 B编写代码 C设计 D编制说明书 3单选 1分 经验表
  • k8s解析--Pod、Deployment、Service

    一 概念介绍 原文地址 1 Pod Kubernetes 使用 Pod 来管理容器 每个 Pod 可以包含一个或多个紧密关联的容器 Pod 是一组紧密关联的容器集合 它们共享 PID IPC Network 和 UTS namespace
  • 助理电子工程师第二个月的实习总结,问题很多的一个月

    年后因为疫情博主等到3月6号才去上班实习 到现在算第二个月吧 这一个月感觉做了很多事情 不像是第一个月一样只是打打杂 画画大佬项目的PCB 了解公司的产品 这个月实际去做项目 出了不少的问题 心情很复杂 甚至想过被炒鱿鱼什么的 还好调节过来
  • SpringBoot自动配置原理

    文章目录 一 SpringBoot自动配置简介 二 SpringBoot自动配置实现原理 一 SpringBoot自动配置简介 SpringBoot相对于Spring新增了自动配置 也就是对一些常用组件进行一些默认的配置 省略了WebMvc
  • 程序框架-输入控制模块

    输入控制模块 用到之前的事件中心模块和公共Mono模块 核心利用观察者设计模式进行事件的分发与注册 InputMgr脚本 输入控制功能模块通过MonoMgr脚本创建Update方法 在通过EventCenter触发事件
  • 泛微E-Mobile 6.0存在命令执行漏洞

    一 漏洞简介 泛微E Mobile 6 0爆出存在命令执行漏洞的问题 现在已经确认了这个漏洞可以被攻击者利用 在某些情况下 用户的输入可能被直接传递给底层操作系统的命令执行函数 攻击者可以通过在输入中插入特殊字符或命令序列来欺骗应用程序将其
  • 关于后台列表,跳转详情和编辑页面

    后台管理系统 从列表跳转详情页面的常规操作 一般新增 编辑和详情页面是共用的 但是可能详情是禁止编辑的 点击编辑按钮之后页面又要可以编辑 一般情况下 页面初始化 是否能够编辑 是通过路径上的pageType来判断 如 xxxxx xxxxx
  • RealityCapture照片扫描建模流程

    RealityCapture照片扫描建模大概有这么几步 拍摄照片 调整照片 导入照片进软件 然后根据照片生成点云 然后对点云范围进行调整 然后根据最终点云效果生成模型 然后对模型修整并进行简化 毕竟他生成的模型面数过大 也回有一些破面之类的
  • STM32F103+NRF24L01通道配置之多发一收

    STM32F103 NRF24L01通道配置之多发一收 准备材料 让我们开始吧 准备材料 1 NRF24L01模块 3 2 STM32F103C8T6单片机的最小系统模块 3 3 正点原子的例程 实验33 无线通信实验 让我们开始吧 下面只
  • 从封装变化的角度看设计模式——组件协作

    什么是设计模式 要了解设计模式 首先得清楚什么是模式 什么是模式 模式即解决一类问题的方法论 简单得来说 就是将解决某类问题的方法归纳总结到理论高度 就形成了模式 设计模式就是将代码设计经验归纳总结到理论高度而形成的 其目的就在于 1 可重
  • 网页打开时都发生了什么?我被吓着了

    内容参考自网页打开时都发生了什么 我被吓着了 在浏览器里输入网址或者点击链接 网页打开了 这是我们上网时再普通不过的一幕 但是如此简单的表象背后 却隐藏着无比复杂的技术流程 想涨涨知识吗 往下看吧 一个HTTP请求的过程 为了简化我们先从一
  • 图片博客

    在这里插入图片描述
  • Shell输入输出重定向

    一 文件描述符 英文是file descriptor简称fd 文件描述符是一个非负整数 它是一个索引值 指向进程打开的文件 Linux程序在执行任何形式的 I O 操作时 都是在读取或者写入一个文件描述符 每个文件描述符会与一个打开的文件相
  • 前方交会与后方交会

    1 前方交会 1 1 前方交会的概念 利用立体像对两张像片的内方位元素 同名像点坐标和像对的相对方位元素 或外方位元素 解算模型点坐标 或地面点坐标 的工作 称为空间前方交会 在摄影测量中主要有两种 1 利用立体像对两张像片的相对方位元素