VTK9.2.0+QT5.14.0绘制三维显示背景

news2024/11/25 14:55:43

背景

上一篇绘制点云的博文中,使用的vtkCameraOrientationWidget来绘制的坐标轴,最近又学习到两种新的坐标轴绘制形式。

vtkOrientationMarkerWidget + vtkAxesActor

单独使用vtkAxesActor能够绘制出坐标轴,但是会随着鼠标操作旋转和平移时,在三维窗口中移动。搭配vtkOrientationMarkerWidget 的话能够在三维窗口的widget中,再放置一个小的widget,专门放置vtkAxesActor,可以达到停留在窗口左下角,只随着鼠标旋转的目的。

在头文件中定义vtkOrientationMarkerWidget 的对象

	vtkSmartPointer<vtkOrientationMarkerWidget> markerOrientationWidget;
void QVtkDemo2::testVtk3D()
{
	//创建着色器对象
	vtkSmartPointer<vtkRenderer> g_vtkRenderer = vtkSmartPointer<vtkRenderer>::New();
	//设置背景颜色
	g_vtkRenderer->SetBackground(.1, .2, .4);
	//创建point对象
	vtkSmartPointer<vtkPoints> g_vtkPoints = vtkSmartPointer<vtkPoints>::New();
	g_vtkPoints->SetNumberOfPoints(200);
	//创建cell对象
	vtkSmartPointer<vtkCellArray> g_vtkVertices = vtkSmartPointer<vtkCellArray>::New();
	vtkIdType id[1];
	//随机生成200个点
	float minz = VTK_FLOAT_MAX, maxz = VTK_FLOAT_MIN;
	for (int i = 0; i < 200; i++)
	{
		float x = rand() % 10;
		float y = rand() % 10;
		float z = rand() % 10;
		//提前申请了points的数量,使用set比insert速度更快
		g_vtkPoints->SetPoint(i, x, y, z);
		id[0] = i;
		g_vtkVertices->InsertNextCell(1, id);
		if (z > maxz)
		{
			maxz = z;
		}
		if (z < minz)
		{
			minz = z;
		}
	}
	//创建poly对象
	vtkSmartPointer<vtkPolyData> g_vtkpolyData = vtkSmartPointer<vtkPolyData>::New();
	g_vtkpolyData->SetPoints(g_vtkPoints);
	g_vtkpolyData->SetVerts(g_vtkVertices);

	vtkSmartPointer<vtkVertexGlyphFilter> g_glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
	g_glyphFilter->SetInputData(g_vtkpolyData);
	g_glyphFilter->Update();

	vtkSmartPointer<vtkElevationFilter> g_elevationFilter = vtkSmartPointer<vtkElevationFilter>::New();
	g_elevationFilter->SetInputConnection(g_glyphFilter->GetOutputPort());
	g_elevationFilter->SetLowPoint(0, 0, minz);
	g_elevationFilter->SetHighPoint(0, 0, maxz);

	//创建polyMapper
	vtkSmartPointer<vtkPolyDataMapper> g_vtkpointsMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	g_vtkpointsMapper->SetInputConnection(g_elevationFilter->GetOutputPort());

	//创建Actor
	vtkSmartPointer<vtkActor> g_vtkpointsActor = vtkSmartPointer<vtkActor>::New();
	g_vtkpointsActor->SetMapper(g_vtkpointsMapper);
	g_vtkpointsActor->GetProperty()->SetPointSize(3);//设置点的大小
	g_vtkRenderer->AddActor(g_vtkpointsActor);

	vtkNew<vtkLookupTable> lut = vtkNew<vtkLookupTable>::vtkNew();
	lut->SetNumberOfTableValues(7);
	lut->SetHueRange(0.0, 0.67);
	lut->SetTableRange(minz, maxz);
	lut->Build();

	vtkNew<vtkScalarBarActor> colorBar = vtkNew<vtkScalarBarActor>::vtkNew();
	colorBar->SetLookupTable(lut);
	colorBar->SetNumberOfLabels(7);
	colorBar->SetBarRatio(0.10);
	colorBar->SetUnconstrainedFontSize(0.05);
	colorBar->SetMaximumHeightInPixels(100);
	colorBar->SetDisplayPosition(500, 80);
	g_vtkRenderer->AddActor2D(colorBar);

	//根据点云的包围盒,寻找最佳的显示视点位置
	g_vtkRenderer->ResetCamera();
	//ui中的绘制窗口添加定义的着色器
	ui.openGLWidget->renderWindow()->AddRenderer(g_vtkRenderer);
	//开始三维渲染
	ui.openGLWidget->renderWindow()->Render();

	//绘制坐标轴
	vtkSmartPointer<vtkAxesActor> axes_actor = vtkSmartPointer<vtkAxesActor>::New();
	axes_actor->SetPosition(0, 0, 0);
	axes_actor->SetTotalLength(50, 50, 50);
	//axes_actor->SetScale(5.0);
	//axes_actor->SetShaftType(0);
	//axes_actor->SetCylinderRadius(0.1);
	//axes_actor->SetConeRadius(0.3);
	//axes_actor->SetAxisLabels(1);
	//axes_actor->SetTipType(0); //坐标轴顶部为圆锥体
	axes_actor->GetXAxisShaftProperty()->SetColor(1, 0, 1);
	axes_actor->GetXAxisTipProperty()->SetColor(1, 0, 1);

	axes_actor->GetZAxisShaftProperty()->SetColor(1, 1, 0);
	axes_actor->GetZAxisTipProperty()->SetColor(1, 1, 0);

	markerOrientationWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
	markerOrientationWidget->SetOrientationMarker(axes_actor);
	markerOrientationWidget->SetInteractor(ui.openGLWidget->interactor());
	markerOrientationWidget->SetCurrentRenderer(g_vtkRenderer);
	markerOrientationWidget->SetDefaultRenderer(g_vtkRenderer);
	markerOrientationWidget->SetViewport(0.0, 0.0, 0.2, 0.2);
	markerOrientationWidget->SetEnabled(1);
	markerOrientationWidget->SetZoom(1.2);
	markerOrientationWidget->SetInteractive(false);

	return;
}

在这里插入图片描述
可以为三维空间添加一个网格底面,如图所示
在这里插入图片描述
只需要在上述代码中,创建一个新的Actor以及对应的Mapper和PlaneSource,然后向renderer中添加一个额外的Actor,并通过vtkCamera来设定我们当前的视角,提升观感

void QVtkDemo2::testVtk3D()
{
	//创建着色器对象
	vtkSmartPointer<vtkRenderer> g_vtkRenderer = vtkSmartPointer<vtkRenderer>::New();
	//设置背景颜色
	g_vtkRenderer->SetBackground(.1, .2, .4);
	//创建point对象
	vtkSmartPointer<vtkPoints> g_vtkPoints = vtkSmartPointer<vtkPoints>::New();
	g_vtkPoints->SetNumberOfPoints(200);
	//创建cell对象
	vtkSmartPointer<vtkCellArray> g_vtkVertices = vtkSmartPointer<vtkCellArray>::New();
	vtkIdType id[1];
	//随机生成200个点
	float minz = VTK_FLOAT_MAX, maxz = VTK_FLOAT_MIN;
	for (int i = 0; i < 200; i++)
	{
		float x = rand() % 10;
		float y = rand() % 10;
		float z = rand() % 10;
		//提前申请了points的数量,使用set比insert速度更快
		g_vtkPoints->SetPoint(i, x, y, z);
		id[0] = i;
		g_vtkVertices->InsertNextCell(1, id);
		if (z > maxz)
		{
			maxz = z;
		}
		if (z < minz)
		{
			minz = z;
		}
	}
	//创建poly对象
	vtkSmartPointer<vtkPolyData> g_vtkpolyData = vtkSmartPointer<vtkPolyData>::New();
	g_vtkpolyData->SetPoints(g_vtkPoints);
	g_vtkpolyData->SetVerts(g_vtkVertices);

	vtkSmartPointer<vtkVertexGlyphFilter> g_glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
	g_glyphFilter->SetInputData(g_vtkpolyData);
	g_glyphFilter->Update();

	vtkSmartPointer<vtkElevationFilter> g_elevationFilter = vtkSmartPointer<vtkElevationFilter>::New();
	g_elevationFilter->SetInputConnection(g_glyphFilter->GetOutputPort());
	g_elevationFilter->SetLowPoint(0, 0, minz);
	g_elevationFilter->SetHighPoint(0, 0, maxz);

	//创建polyMapper
	vtkSmartPointer<vtkPolyDataMapper> g_vtkpointsMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	g_vtkpointsMapper->SetInputConnection(g_elevationFilter->GetOutputPort());

	//创建Actor
	vtkSmartPointer<vtkActor> g_vtkpointsActor = vtkSmartPointer<vtkActor>::New();
	g_vtkpointsActor->SetMapper(g_vtkpointsMapper);
	g_vtkpointsActor->GetProperty()->SetPointSize(3);//设置点的大小
	g_vtkRenderer->AddActor(g_vtkpointsActor);

	vtkNew<vtkLookupTable> lut = vtkNew<vtkLookupTable>::vtkNew();
	lut->SetNumberOfTableValues(7);
	lut->SetHueRange(0.0, 0.67);
	lut->SetTableRange(minz, maxz);
	lut->Build();

	vtkNew<vtkScalarBarActor> colorBar = vtkNew<vtkScalarBarActor>::vtkNew();
	colorBar->SetLookupTable(lut);
	colorBar->SetNumberOfLabels(7);
	colorBar->SetBarRatio(0.10);
	colorBar->SetUnconstrainedFontSize(0.05);
	colorBar->SetMaximumHeightInPixels(100);
	colorBar->SetDisplayPosition(500, 80);
	g_vtkRenderer->AddActor2D(colorBar);

	//定义一个平面
	vtkSmartPointer<vtkPlaneSource> mReferencePlaneSource;
	vtkSmartPointer<vtkPolyDataMapper> mReferencePlaneMapper;
	vtkSmartPointer<vtkActor>  mReferencePlaneActor;

	//添加平面
	mReferencePlaneSource = vtkSmartPointer<vtkPlaneSource>::New();
	mReferencePlaneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mReferencePlaneActor = vtkSmartPointer<vtkActor>::New();
	mReferencePlaneSource->SetXResolution(20);
	mReferencePlaneSource->SetYResolution(20);
	mReferencePlaneSource->SetOrigin(-10.0, -10.0, -6.0); //根据视野范围来调整
	mReferencePlaneSource->SetPoint1(10.0, -10.0, -6.0);
	mReferencePlaneSource->SetPoint2(-10.0, 10.0, -6.0);
	mReferencePlaneMapper->SetInputConnection(mReferencePlaneSource->GetOutputPort());
	mReferencePlaneActor->SetMapper(mReferencePlaneMapper);
	mReferencePlaneActor->GetProperty()->SetRepresentationToWireframe();
	mReferencePlaneActor->GetProperty()->SetColor(0.5, 1.0, 1.0);
	mReferencePlaneActor->SetVisibility(true);
	g_vtkRenderer->AddActor(mReferencePlaneActor);
	vtkSmartPointer<vtkCamera> _vtk_icamera = vtkSmartPointer<vtkCamera>::New();
	_vtk_icamera->SetPosition(50.0, 50.0, 30.0);
	_vtk_icamera->SetFocalPoint(0.0, 0.0, 0.0);
	_vtk_icamera->SetViewUp(0.0, 0.0, 1.0);
	_vtk_icamera->ComputeViewPlaneNormal();
	if (_vtk_icamera)
	{
		g_vtkRenderer->SetActiveCamera(_vtk_icamera);
		g_vtkRenderer->ResetCamera();
	}

	//根据点云的包围盒,寻找最佳的显示视点位置
	//g_vtkRenderer->ResetCamera();
	//ui中的绘制窗口添加定义的着色器
	ui.openGLWidget->renderWindow()->AddRenderer(g_vtkRenderer);
	//开始三维渲染
	ui.openGLWidget->renderWindow()->Render();

	//绘制坐标轴
	vtkSmartPointer<vtkAxesActor> axes_actor = vtkSmartPointer<vtkAxesActor>::New();
	axes_actor->SetPosition(0, 0, 0);
	axes_actor->SetTotalLength(50, 50, 50);
	//axes_actor->SetScale(5.0);
	//axes_actor->SetShaftType(0);
	//axes_actor->SetCylinderRadius(0.1);
	//axes_actor->SetConeRadius(0.3);
	//axes_actor->SetAxisLabels(1);
	//axes_actor->SetTipType(0); //坐标轴顶部为圆锥体
	axes_actor->GetXAxisShaftProperty()->SetColor(1, 0, 1);
	axes_actor->GetXAxisTipProperty()->SetColor(1, 0, 1);

	axes_actor->GetZAxisShaftProperty()->SetColor(1, 1, 0);
	axes_actor->GetZAxisTipProperty()->SetColor(1, 1, 0);

	markerOrientationWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
	markerOrientationWidget->SetOrientationMarker(axes_actor);
	markerOrientationWidget->SetInteractor(ui.openGLWidget->interactor());
	markerOrientationWidget->SetCurrentRenderer(g_vtkRenderer);
	markerOrientationWidget->SetDefaultRenderer(g_vtkRenderer);
	markerOrientationWidget->SetViewport(0.0, 0.0, 0.2, 0.2);
	markerOrientationWidget->SetEnabled(1);
	markerOrientationWidget->SetZoom(1.2);
	markerOrientationWidget->SetInteractive(false);

	return;
}

vtkCubeAxesActor

下图是matlab的三维显示,想要绘制网格状的坐标轴,并标注坐标,VTK提供了vtkCubeAxesActor
在这里插入图片描述
vtkCubeAxesActor作为一类Actor, 因此,我们只需要定义好vtkCubeAxesActor的参数,然后添加到Renderer中即可

void QVtkDemo2::testVtk3D()
{
	//创建着色器对象
	vtkSmartPointer<vtkRenderer> g_vtkRenderer = vtkSmartPointer<vtkRenderer>::New();
	//设置背景颜色
	g_vtkRenderer->SetBackground(.1, .2, .4);
	//创建point对象
	vtkSmartPointer<vtkPoints> g_vtkPoints = vtkSmartPointer<vtkPoints>::New();
	g_vtkPoints->SetNumberOfPoints(200);
	//创建cell对象
	vtkSmartPointer<vtkCellArray> g_vtkVertices = vtkSmartPointer<vtkCellArray>::New();
	vtkIdType id[1];
	//随机生成200个点
	float minz = VTK_FLOAT_MAX, maxz = VTK_FLOAT_MIN;
	for (int i = 0; i < 200; i++)
	{
		float x = rand() % 10;
		float y = rand() % 10;
		float z = rand() % 10;
		//提前申请了points的数量,使用set比insert速度更快
		g_vtkPoints->SetPoint(i, x, y, z);
		id[0] = i;
		g_vtkVertices->InsertNextCell(1, id);
		if (z > maxz)
		{
			maxz = z;
		}
		if (z < minz)
		{
			minz = z;
		}
	}
	//创建poly对象
	vtkSmartPointer<vtkPolyData> g_vtkpolyData = vtkSmartPointer<vtkPolyData>::New();
	g_vtkpolyData->SetPoints(g_vtkPoints);
	g_vtkpolyData->SetVerts(g_vtkVertices);

	vtkSmartPointer<vtkVertexGlyphFilter> g_glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
	g_glyphFilter->SetInputData(g_vtkpolyData);
	g_glyphFilter->Update();

	vtkSmartPointer<vtkElevationFilter> g_elevationFilter = vtkSmartPointer<vtkElevationFilter>::New();
	g_elevationFilter->SetInputConnection(g_glyphFilter->GetOutputPort());
	g_elevationFilter->SetLowPoint(0, 0, minz);
	g_elevationFilter->SetHighPoint(0, 0, maxz);

	//创建polyMapper
	vtkSmartPointer<vtkPolyDataMapper> g_vtkpointsMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	g_vtkpointsMapper->SetInputConnection(g_elevationFilter->GetOutputPort());

	//创建Actor
	vtkSmartPointer<vtkActor> g_vtkpointsActor = vtkSmartPointer<vtkActor>::New();
	g_vtkpointsActor->SetMapper(g_vtkpointsMapper);
	g_vtkpointsActor->GetProperty()->SetPointSize(3);//设置点的大小
	g_vtkRenderer->AddActor(g_vtkpointsActor);

	vtkNew<vtkLookupTable> lut = vtkNew<vtkLookupTable>::vtkNew();
	lut->SetNumberOfTableValues(7);
	lut->SetHueRange(0.0, 0.67);
	lut->SetTableRange(minz, maxz);
	lut->Build();

	vtkNew<vtkScalarBarActor> colorBar = vtkNew<vtkScalarBarActor>::vtkNew();
	colorBar->SetLookupTable(lut);
	colorBar->SetNumberOfLabels(7);
	colorBar->SetBarRatio(0.10);
	colorBar->SetUnconstrainedFontSize(0.05);
	colorBar->SetMaximumHeightInPixels(100);
	colorBar->SetDisplayPosition(500, 80);
	g_vtkRenderer->AddActor2D(colorBar);

	//vtkCubeAxes
	vtkSmartPointer<vtkCubeAxesActor> cubeAxes = vtkSmartPointer<vtkCubeAxesActor>::New();
	auto activeCamera = g_vtkRenderer->GetActiveCamera();
	cubeAxes->SetCamera(activeCamera);

	double bounds[6] = { 0.0, 10.0, 0.0, 10.0, 0.0, 10.0 };
	cubeAxes->SetBounds(bounds);

	cubeAxes->SetXTitle("X-Axis");
	cubeAxes->SetYTitle("Y-Axis");
	cubeAxes->SetZTitle("Z-Axis");

	cubeAxes->GetTitleTextProperty(0)->SetColor(1.0, 0.0, 1.0);
	cubeAxes->GetLabelTextProperty(0)->SetColor(1.0, 0.0, 1.0);

	cubeAxes->GetTitleTextProperty(1)->SetColor(0.0, 1.0, 0.0);
	cubeAxes->GetLabelTextProperty(1)->SetColor(0.0, 1.0, 0.0);

	cubeAxes->GetTitleTextProperty(2)->SetColor(1.0, 1.0, 0.0);
	cubeAxes->GetLabelTextProperty(2)->SetColor(1.0, 1.0, 0.0);

	cubeAxes->SetVisibility(1);

	cubeAxes->SetXAxisRange(0, 10.0);
	cubeAxes->SetYAxisRange(0.0, 10.0);
	cubeAxes->SetZAxisRange(0.0, 10.0);

	cubeAxes->DrawXGridlinesOn();
	cubeAxes->DrawYGridlinesOn();
	cubeAxes->DrawZGridlinesOn();
	cubeAxes->SetDrawXInnerGridlines(0);
	cubeAxes->SetDrawYInnerGridlines(0);
	cubeAxes->SetDrawZInnerGridlines(0);

	cubeAxes->XAxisMinorTickVisibilityOff();
	cubeAxes->YAxisMinorTickVisibilityOff();
	cubeAxes->ZAxisMinorTickVisibilityOff();

	cubeAxes->SetScreenSize(30.0);
	cubeAxes->SetLabelOffset(20.0);

	cubeAxes->SetGridLineLocation(2);
	cubeAxes->SetTickLocation(1);
	cubeAxes->SetFlyMode(0);
	g_vtkRenderer->AddActor(cubeAxes);


	vtkSmartPointer<vtkCamera> _vtk_icamera = vtkSmartPointer<vtkCamera>::New();
	_vtk_icamera->SetPosition(50.0, 50.0, 30.0);
	_vtk_icamera->SetFocalPoint(0.0, 0.0, 0.0);
	_vtk_icamera->SetViewUp(0.0, 0.0, 1.0);
	_vtk_icamera->ComputeViewPlaneNormal();
	if (_vtk_icamera)
	{
		g_vtkRenderer->SetActiveCamera(_vtk_icamera);
		g_vtkRenderer->ResetCamera();
	}

	//根据点云的包围盒,寻找最佳的显示视点位置
	//g_vtkRenderer->ResetCamera();
	//ui中的绘制窗口添加定义的着色器
	ui.openGLWidget->renderWindow()->AddRenderer(g_vtkRenderer);
	//开始三维渲染
	ui.openGLWidget->renderWindow()->Render();

	//绘制坐标轴
	vtkSmartPointer<vtkAxesActor> axes_actor = vtkSmartPointer<vtkAxesActor>::New();
	axes_actor->SetPosition(0, 0, 0);
	axes_actor->SetTotalLength(50, 50, 50);
	//axes_actor->SetScale(5.0);
	//axes_actor->SetShaftType(0);
	//axes_actor->SetCylinderRadius(0.1);
	//axes_actor->SetConeRadius(0.3);
	//axes_actor->SetAxisLabels(1);
	//axes_actor->SetTipType(0); //坐标轴顶部为圆锥体
	axes_actor->GetXAxisShaftProperty()->SetColor(1, 0, 1);
	axes_actor->GetXAxisTipProperty()->SetColor(1, 0, 1);

	axes_actor->GetZAxisShaftProperty()->SetColor(1, 1, 0);
	axes_actor->GetZAxisTipProperty()->SetColor(1, 1, 0);

	markerOrientationWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
	markerOrientationWidget->SetOrientationMarker(axes_actor);
	markerOrientationWidget->SetInteractor(ui.openGLWidget->interactor());
	markerOrientationWidget->SetCurrentRenderer(g_vtkRenderer);
	markerOrientationWidget->SetDefaultRenderer(g_vtkRenderer);
	markerOrientationWidget->SetViewport(0.0, 0.0, 0.2, 0.2);
	markerOrientationWidget->SetEnabled(1);
	markerOrientationWidget->SetZoom(1.2);
	markerOrientationWidget->SetInteractive(false);

	
	return;
}

在这里插入图片描述

带灰度纹理点云的三维显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式 _行为型模式_迭代器模式

一、迭代器模式 1、迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于顺序访问集合对象的元素&#xff0c;不需要关心集合对象的底层表示。如&#xff1a;java中的Iterator接口就是这个工作原理。 2、实现思路 &#xff0…

linux 中 fd 申请和释放管理(两级 bitmap)

linux 中 fd 的几点理解_linux fd-CSDN博客 通过上边的文章&#xff0c;我们可以知道&#xff0c;在 linux 中&#xff0c;fd 有以下几点需要了解&#xff1a; &#xff08;1&#xff09;fd 表示进程打开的文件&#xff0c;是进程级别的资源&#xff0c;不是系统级别的资源 …

Rhinoceros v7.5 解锁版安装教程 (3D三维造型软件)

前言 Rhinoceros 中文名称犀牛是一款超强的三维建模工具&#xff0c;全称Rhinoceros&#xff0c;Rhino是美国Robert McNeel & Assoc开发的PC上强大的专业3D造型软件&#xff0c;它可以广泛地应用于三维动画制作、工业制造、科学研究以及机械设计等领域。它能轻易整合3DS M…

Nodejs及stfshow相关例题

Nodejs及stfshow相关例题 Node.js 是一个基于 Chrome V8 引擎的 Javascript 运行环境。可以说nodejs是一个运行环境&#xff0c;或者说是一个 JS 语言解释器而不是某种库。 Node.js可以生成动态页面内容Node.js 可以在服务器上创建、打开、读取、写入、删除和关闭文件Node.js…

设计模式9——适配器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 适配器模式&#xff08;Adapte…

【Linux】Centos7安装JDK

【Linux】Centos7安装JDK 下载 Oracle 官网下载 JDK17 https://www.oracle.com/cn/java/technologies/downloads/#java17 安装 使用rz命令上传 jdk tar 包&#xff0c;上传失败直接用 xftp 上传 在安装图形界面时&#xff0c;有勾选开发工具&#xff0c;会自动安装 JDK 需要先…

【openlayers系统学习】3.4波段数学计算(计算NDVI)

四、波段数学计算&#xff08;计算NDVI&#xff09; 我们已经看到了如何使用 ol/source/GeoTIFF​ 源代码来渲染真彩色和假彩色合成。我们通过将缩放的反射率值直接渲染到红色、绿色或蓝色显示通道中的一个来实现这一点。还可以对来自GeoTIFF&#xff08;或其他数据瓦片源&…

深度学习之基于Pytorch框架手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是数字图像处理领域的一个经典问题&#xff0c;也是深度学习技术的一个常用应用场…

vue期末复习选择题1

1. 下面哪一项描述是错误的&#xff1f;&#xff08;B&#xff09; A.$("ul li:gt(5):not(:last)")选取ul标记里面索引值大于5且不是最后一个的li元素B.$("div").find("span")选取div元素的子元素spanC.$("div.showmore > a")选取…

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务&#xff0c;但我是部署在自己的家庭nas-极空间z4pro里的&#xff0c;属于内网环境。 另外我有一台阿里云服务器&#xff0c;做跳板机。 我有一个阿里的域名…

微服务架构-异步消息传递设计模式

微服务架构-异步消息传递设计模式 异步消息允许服务发送消息后立即返回&#xff0c;而不需要等待消息被处理完毕&#xff0c;这种异步方式可以大大提高系统的处理速度、和吞吐量。 微服务架构&#xff0c;通常涉及多个服务之间的相互调用&#xff0c;如果通信只是在少数几个微…

Pandas的基础应用

Pandas 介绍 Pandas 是一个用于数据操作和分析的强大 Python 库&#xff0c;在数据科学和机器学习领域广泛使用。要有效地使用 Pandas&#xff0c;理解一些关键概念非常重要&#xff0c;如坐标轴&#xff08;axis&#xff09;、索引&#xff08;index&#xff09;、行&#xff…

windows平台vcpkg安装

1. 克隆vcpkg仓库 git clone https://github.com/microsoft/vcpkg 2.运行bootstrap-vcpkg.bat下载vcpkg.exe 3.运行验证 4.使用VCPKG安装OPENSSL 5.安装成功

RDDM论文阅读笔记

CVPR2024的残差去噪模型。把diffusion 模型的加噪过程分解为残差diffusion和noise diffusion&#xff0c;其中残差diffusion模拟从target image到degraded image的过程&#xff0c;而noise diffusion则是原来的diffusion过程&#xff0c;即从图片到高斯噪声的加噪过程。前者可以…

python批发模块的调试之旅:从新手到专家的蜕变

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、调试技巧的重要性 二、批发模块调试的实战演练 1. 设置断点 2. 逐行执行代码 3. 观察…

XSS---DOM破坏

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.什么是DOM破坏 DOM破坏总结为一句话就是&#xff1a;利用HTML元素来响应JS代码的执行结果。 举个例子&#xff1a; <body> <img id"x"> <img name"y"…

网络模型-PoE技术

一、PoE简介 以太网供电PoE(Powerover Ethernet)是指通过以太网网络进行供电&#xff0c;也被称为基于局域网的供电系统PoL(PoweroverLAN)或有源以太网(Active Ethernet)。 1、PoE的优势: 可靠: 电源集中供电&#xff0c;备份方便。连接简捷: 网络终端不需外接电源&#xf…

《web应用设计》第八次作业

我的小组长是姚若希&#xff0c;我们组课程设计的题目是&#xff1a;学生管理系统 &#xff0c;我认领的功能模块是&#xff1a;课程管理 2.查询并分页

这所211专硕22408复试线310分,学硕收调剂!辽宁大学计算机考研考情分析!

辽宁大学信息学院下设计算机科学与技术、电子信息科学与技术、通信工程、信息管理与信息系统、软件工程5个本科专业&#xff0c;有计算机软件与理论、计算机应用技术2个硕士学位授权点&#xff0c;软件工程和计算机技术两个专业硕士学位点&#xff0c;1个计算机应用研究所、1个…

信息化项目交付验收流程管理办法

项目交付验收流程制度 管理办法 (执行版) (文件编号: ) 编制: 审核: 批准: 版本: 生效日期: 管理办法概述 制定目的为了保证公司在建项目交付验收工作事项的顺利开展,保证交付验收进度及…