VTK知识学习(42)-基本的图形操作(三)
1、网格平滑
1)概述
现代扫描技术的发展使得获取点云数据不再困难,通过曲面重建技术可以获取表面网格来表示各种复杂的实体。但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理。
拉普拉斯平滑是一种常用的网格平滑算法。该方法的原理比较简单,如图 所示,将每个点用其邻域点的中心来代替。通过不断地迭代,可以得到较为光滑的网格。
VTK中的 vtkSmoothPolyDataFilter 类实现了网格的拉普拉斯平滑算法。
2)代码
private void TestLasianSmooth()
{vtkPolyDataReader reader = vtkPolyDataReader.New();reader.SetFileName("F:\\code\\VTK\\TestActiViz\\data\\fran_cut.vtk");reader.Update();//拉普拉斯平滑vtkSmoothPolyDataFilter smoothFilter = vtkSmoothPolyDataFilter.New();smoothFilter.SetInputConnection(reader.GetOutputPort());smoothFilter.SetNumberOfIterations(200); //平滑次数 次数越大平滑越厉害smoothFilter.BoundarySmoothingOn(); //控制对边界点平滑开启smoothFilter.Update();vtkWindowedSincPolyDataFilter sincFilter = vtkWindowedSincPolyDataFilter.New();sincFilter.SetInputConnection(reader.GetOutputPort());sincFilter.SetNumberOfIterations(200);sincFilter.Update();ShowImageBy3(reader.GetOutput(), smoothFilter.GetOutput(), sincFilter.GetOutput());
}
3)效果
4)说明
vtkSmoothPolyDataFilter::SetNumberOfterations()控制平滑次数,次数越大平滑越厉害。平滑结果如图所示,左图为原始模型,右图为平滑后的模型。从图中可以看出,在经过200次拉普拉斯平滑后,模型变得非常光滑,但是在平滑的同时也损失了一些细节信息,例如在眼窝处的细节已经平滑掉,在使用该方法时需要注意这点。
该类中还有多个变量来控制平滑过程,利用这些变量在一定程度上可以控制细节的损失。BoundarySmoothing控制是否对边界点平滑。这里需要理解边界点的概念:如果一个网格模型中,一条边只被一个单元包含,那么这条边就是边界边,而边界边上的点则为边界点。如果一个模型中含有边界边,则说明该模型不是封闭的,如本例中的模型。
FeatureEdgeSmoothing控制是否对特征边上的点的平滑。如果一条边被两个邻近的多边形共用,若这两个多边形法向量的夹角(特征角)大于定义的值,则说明该边为一条特征边。因此,FeatureEdgeSmoothing设置开始时,需要调用SetFeatureAngle()函数设置特征角的阈值。
如图所示,特征边e的两个相邻面片的特征角为θ,特征角值越大,说明该边越尖锐。特征边/点往往表示模型的细节,平滑过程中不进行处理,以保持细节。
虽然通过特征边平滑设置可以降低一部分细节损失,但并不能完全避免,且随着拉普拉斯平滑的不断迭代,模型会逐渐向网格的中心收缩。所以,视窗多数据过滤器(详见参考文献[11)是一个更好的选择,该算法使用窗口辛克函数实现网格平滑,能够最小程度地避免收缩,其使用方法与vtkSmooth Polydata Filter相同。
2、封闭性检测
1)概述
由于受原始数据、重建方法的限制,得到的网格模型并不是封闭的。有时为了显示或者处理某些要求,需要网格必须是封闭的。封闭性网格应该比较好理解,比如一个球面网格。上节内容中提到了边界边的概念:如果一条边只被一个多边形包含,那么这条边就是边界边。是否存在边界边是检测一个网格模型是否封闭的重要特征。
vtkFeatureEdges是一个非常重要的类,该类能够提取多边形网格模型中四种类型的边。
- ①边界边。即只被一个多边形或者一条边包含的边。
- ②非流形边。被3个或者3个以上的多边形包含的边即为非流形边。
- ③特征边。上节中也提到,需要设置一个特征角的阈值,当包含同一条边的两个三角形的法向量的夹角大于该阀值时,即为一个特征边。
- ④流形边。只被两个多边形包含的边即为流形边。
可以使用该类来检测是否存在边界边,并依此来判断网格是否封闭。
2)代码
void GenerateData(vtkSmartPointer<vtkPolyData> input)
{vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkIdTypeArray> ids =vtkSmartPointer<vtkIdTypeArray>::New();ids->SetNumberOfComponents(1);ids->InsertNextValue(2);ids->InsertNextValue(10);vtkSmartPointer<vtkSelectionNode> selectionNode =vtkSmartPointer<vtkSelectionNode>::New();selectionNode->SetFieldType(vtkSelectionNode::CELL);selectionNode->SetContentType(vtkSelectionNode::INDICES);selectionNode->SetSelectionList(ids);selectionNode->GetProperties()->Set(vtkSelectionNode::INVERSE(), 1);vtkSmartPointer<vtkSelection> selection =vtkSmartPointer<vtkSelection>::New();selection->AddNode(selectionNode);vtkSmartPointer<vtkExtractSelection> extractSelection =vtkSmartPointer<vtkExtractSelection>::New();extractSelection->SetInputData(0, sphereSource->GetOutput());extractSelection->SetInputData(1, selection);extractSelection->Update();vtkSmartPointer<vtkDataSetSurfaceFilter> surfaceFilter =vtkSmartPointer<vtkDataSetSurfaceFilter>::New();surfaceFilter->SetInputConnection(extractSelection->GetOutputPort());surfaceFilter->Update();input->ShallowCopy(surfaceFilter->GetOutput());
}void TestDataClosed()
{vtkSmartPointer<vtkPolyData> input = vtkSmartPointer<vtkPolyData>::New();GenerateData(input);vtkSmartPointer<vtkFeatureEdges> featureEdges =vtkSmartPointer<vtkFeatureEdges>::New();featureEdges->SetInputData(input);featureEdges->BoundaryEdgesOn();featureEdges->FeatureEdgesOff();featureEdges->ManifoldEdgesOff();featureEdges->NonManifoldEdgesOff();featureEdges->Update();int numberOfOpenEdges = featureEdges->GetOutput()->GetNumberOfCells();if (numberOfOpenEdges){std::cout << "该网格模型不是封闭的..." << std::endl;}else{std::cout << "该网格模型是封闭的..." << std::endl;return;}vtkSmartPointer<vtkFillHolesFilter> fillHolesFilter =vtkSmartPointer<vtkFillHolesFilter>::New();fillHolesFilter->SetInputData(input);fillHolesFilter->Update();vtkSmartPointer<vtkPolyDataNormals> normals =vtkSmartPointer<vtkPolyDataNormals>::New();normals->SetInputConnection(fillHolesFilter->GetOutputPort());normals->ConsistencyOn();normals->SplittingOff();normals->Update();//double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkPolyDataMapper> originalMapper =vtkSmartPointer<vtkPolyDataMapper>::New();originalMapper->SetInputData(input);vtkSmartPointer<vtkProperty> backfaceProp =vtkSmartPointer<vtkProperty>::New();backfaceProp->SetDiffuseColor(0.89, 0.81, 0.34);vtkSmartPointer<vtkActor> originalActor =vtkSmartPointer<vtkActor>::New();originalActor->SetMapper(originalMapper);originalActor->SetBackfaceProperty(backfaceProp);originalActor->GetProperty()->SetDiffuseColor(1.0, 0.3882, 0.2784);vtkSmartPointer<vtkPolyDataMapper> edgeMapper =vtkSmartPointer<vtkPolyDataMapper>::New();edgeMapper->SetInputData(featureEdges->GetOutput());vtkSmartPointer<vtkActor> edgeActor =vtkSmartPointer<vtkActor>::New();edgeActor->SetMapper(edgeMapper);edgeActor->GetProperty()->SetEdgeColor(0., 0., 1.0);edgeActor->GetProperty()->SetEdgeVisibility(1);edgeActor->GetProperty()->SetLineWidth(5);vtkSmartPointer<vtkPolyDataMapper> filledMapper =vtkSmartPointer<vtkPolyDataMapper>::New();filledMapper->SetInputData(normals->GetOutput());vtkSmartPointer<vtkActor> filledActor =vtkSmartPointer<vtkActor>::New();filledActor->SetMapper(filledMapper);filledActor->GetProperty()->SetDiffuseColor(1.0, 0.3882, 0.2784);vtkSmartPointer<vtkRenderer> leftRenderer =vtkSmartPointer<vtkRenderer>::New();leftRenderer->SetViewport(leftViewport);leftRenderer->AddActor(originalActor);leftRenderer->AddActor(edgeActor);leftRenderer->SetBackground(1.0, 1.0, 1.0);vtkSmartPointer<vtkRenderer> rightRenderer =vtkSmartPointer<vtkRenderer>::New();rightRenderer->SetViewport(rightViewport);rightRenderer->AddActor(filledActor);rightRenderer->SetBackground(1.0, 1.0, 1.0);vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(leftRenderer);renderWindow->AddRenderer(rightRenderer);renderWindow->SetSize(640, 320);renderWindow->Render();renderWindow->SetWindowName("PolyDataClosed");vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();renderWindowInteractor->SetRenderWindow(renderWindow);leftRenderer->GetActiveCamera()->SetPosition(0, -1, 0);leftRenderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);leftRenderer->GetActiveCamera()->SetViewUp(0, 0, 1);leftRenderer->GetActiveCamera()->Azimuth(30);leftRenderer->GetActiveCamera()->Elevation(30);leftRenderer->ResetCamera();rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera());renderWindow->Render();renderWindowInteractor->Start();
}
由于没有查找一个AddNode函数 所以这里是c++的代码实现。
3)效果
左图为原始模型,并将检测的边界边用蓝色显示,右图为漏洞填补后的结果。
4)说明
这里建立了一个球面网格,并去除了其中两个三角面片(单元)。将该数据作为 vtkFeatureEdges 的输入,BoundaryEdgesOn()函数设置提取边界边,而其他三种类型的边则不予考虑。执行完毕,其输出 GetOutput()为一个包含边信息的 vkPolyData 数据。可以通过判断边界边的数目来确定网格是否封闭:
int numberOfOpenEdges = featureEdges->GetOutput()->GetNumberOfCellsO;
当网格为非封闭时,可以为检测结果建立相应的vtkPolyDataMapper和 vtkActor 对象,将边界边与原网格同时显示,以观察检测结果是否正确。
仅仅检测出是否封闭是不够的,很多情况下,还需将这些漏洞填补起来。VTK中有现成的类来完成这个功能--vtkFilHolesFilter。其内部执行过程是首先检测出网格中的所有边界边,然后找出这些边界边中的每一个闭合回路,最后将这些闭合回路进行三角化(即生成三角网格)以实现填补的目的。该类的使用非常简单,只需要设置需要填补的网格数据即可:
vtkSmartPointer<vtkFillHolesFilter> fillHolesFilter =vtkSmartPointer<vtkFillHolesFilter>::New();fillHolesFilter->SetInputData(input);fillHolesFilter->Update();vtkSmartPointer<vtkPolyDataNormals> normals =vtkSmartPointer<vtkPolyDataNormals>::New();normals->SetInputConnection(fillHolesFilter->GetOutputPort());normals->ConsistencyOn();normals->SplittingOff();normals->Update();
需要注意的是,有些边界的闭合回路是不需要三角化的,例如一个平面网格,若填补其四周的边界边,则会与原网格产生覆盖。vtkFillHolesFilter 中的 SetHoleSize()函数可用于控制需要修补的漏洞的面积最大值,大于该值的漏洞则不需要填补处理。
vtkPolyDataNormals这个类,主要是用来计算法向量的,而法向量则与光照和阴影计算相关。单元的法向量朝向则与单元的点顺序相关,只有保持所有单元的点顺序一致才能得到正确的法向量,否则在网格模型显示时会得到意外的结果。由于经过漏洞填充,模型的所有单元的点顺序并不一致,因此使用vtkPolyDataNormal::ConsistencyOn()进行调整。
3、连通区域分析
1)概述
许多图形数据中,并非只包含一个对象(连通区域)。而在处理这些图形数据时,有时需要对每一个对象单独处理或者让其单独显示。比如利用MarchingCube 方法提取三维图像中的等值面,得到的结果往往是存在多个连通的对象区域,这时就需要对图形数据做连通区域分析,提取每个连通区域并计算其属性信息,以此来得到需要的连通区域。
2)代码
private void TestCompExtract(){//球面数据vtkSphereSource sphereSource = vtkSphereSource.New();sphereSource.SetRadius(10);sphereSource.SetThetaResolution(10);sphereSource.SetPhiResolution(10);sphereSource.Update();//锥体数据vtkConeSource coneSource = vtkConeSource.New();coneSource.SetRadius(5);coneSource.SetHeight(10);coneSource.SetCenter(25, 0, 0); //锥体中心设置,防止两个数据之间存在覆盖coneSource.Update();//构造一个含有多个连通区域的模型数据vtkAppendPolyData appendFilter = vtkAppendPolyData.New();appendFilter.AddInputData(sphereSource.GetOutput());appendFilter.AddInputData(coneSource.GetOutput());appendFilter.Update();//实现连通区域分析vtkPolyDataConnectivityFilter connectivityFilter = vtkPolyDataConnectivityFilter.New();connectivityFilter.SetInputData(appendFilter.GetOutput());connectivityFilter.SetExtractionModeToLargestRegion(); //提取具有多点的连通区域connectivityFilter.AddSeed(100);connectivityFilter.Update();ShowImageBy2(appendFilter.GetOutput(), connectivityFilter.GetOutput());}
3)效果
4)说明
示例构造一个含有多个连通区域的模型数据。vtkAppendPolyData可以实现vtkPolyData的合并,使用该类可以方便地构造含有多个连通区域的数据,该类接收两个或者多个vtkPolyData 数据输入,合并结果包含输入数据的所有几何和拓扑数据。若输入的两个或者多个数据都含有点属性数据,则将其存储至输出结果中;对于单元属性数据也是如此。
示例先定义了-个球面和一-个锥体数据。为了防止两个数据之间存在覆盖,这里将锥体中心设置到(25,0,0);然后将两个数据设置到 vtkAppendPolyData 的输入,即可生成一个包含两个对象的 vkPolyData 数据,每个输入模型为一个连通区域。VTK 中的 vtkPolyDataConne-ctivityFilter 类可用于实现连通区域分析,该类接受 vtkPolyData数据作为输入,其使用如下:
//实现连通区域分析vtkPolyDataConnectivityFilter connectivityFilter = vtkPolyDataConnectivityFilter.New();connectivityFilter.SetInputData(appendFilter.GetOutput());connectivityFilter.SetExtractionModeToLargestRegion(); //提取具有多点的连通区域connectivityFilter.AddSeed(100);connectivityFilter.Update();
SetExtractionModeToLargestRegion()函数用于提取具有最多点的连通区域,因此在该例中
得到的结果为球面数据。
除了能够提取最大连通区域,vtkPolyDataConnectivityFilter 类还支持以下5种模式
1)SetExtractionModeToAllRegions()。该模式主要用于连通区域标记,配合函数 ColorRegionsOn()使用,在连通区域检测的同时,生成一个名为Regionld 的点属性数据。
2)SetExtractionModeToSpecifiedRegions()。该模式用于提取一个或者多个连通区域。在该模式下,需要通过 AddSpecifiedRegion()来添加需要提取的区域号,区域号从0开始。
3)SetExtractionModeToClosestPointRegion()。该模式下需要使用 SetClosestPoint()函数设置一个空间点坐标,其执行结果为离该点最近的连通区域。
4)SetExtractionModeToPointSeededRegions()。该模式下需要使用 AddSeed()函数添加种子点,提取种子点所在的区域。
5)SetExtractionModeToCellSeededRegions()。该模式下需要使用 AddSeedO函数添加种子单元,提取种子单元所在的区域。
5)其它
许多情况下,事先并不知道整个数据中存在多少个区域,因此需要先获取连通区域的数目。
private void TestConnectedAllCompExtract()
{//球面数据vtkSphereSource sphereSource = vtkSphereSource.New();sphereSource.SetRadius(10);sphereSource.SetThetaResolution(10);sphereSource.SetPhiResolution(10);sphereSource.Update();//锥体数据vtkConeSource coneSource = vtkConeSource.New();coneSource.SetRadius(5);coneSource.SetHeight(10);coneSource.SetCenter(25, 0, 0); //锥体中心设置,防止两个数据之间存在覆盖coneSource.Update();//构造一个含有多个连通区域的模型数据vtkAppendPolyData appendFilter = vtkAppendPolyData.New();appendFilter.AddInputData(sphereSource.GetOutput());appendFilter.AddInputData(coneSource.GetOutput());appendFilter.Update();//实现连通区域分析vtkPolyDataConnectivityFilter connectivityFilter = vtkPolyDataConnectivityFilter.New();connectivityFilter.SetInputData(appendFilter.GetOutput());//该模式用于提取一个或者多个连通区域。//在该模式下,需要通过 AddSpecifiedRegion()来添加需要提取的区域号,区域号从0开始。connectivityFilter.SetExtractionModeToLargestRegion(); connectivityFilter.Update();int regionNum = connectivityFilter.GetNumberOfExtractedRegions();for(int i=0;i<regionNum; i++){vtkPolyDataConnectivityFilter connectivityFilter2 = vtkPolyDataConnectivityFilter.New();connectivityFilter2.SetInputData(appendFilter.GetOutput());connectivityFilter2.InitializeSpecifiedRegionList();connectivityFilter2.SetExtractionModeToSpecifiedRegions();connectivityFilter2.AddSpecifiedRegion(i);connectivityFilter2.Update();vtkPolyDataWriter writer = vtkPolyDataWriter.New();writer.SetFileName($"{i:000}.vtk");writer.SetInputData(connectivityFilter2.GetOutput());writer.Update();}ShowImageBy2(appendFilter.GetOutput(), connectivityFilter.GetOutput());
}
示例在 SetExtractionModeToAllRegions()模式下进行连通区域分析,并通过 GetNumberOfExtractedRegions()函数获取连通区域的数目;然后通过一个循环,在SetExtractionModeToSpecifiedRegions()模式下,每次循环通过 AddSpecifedRegion()函数设置提取的连通区域号并单独保存为一个.vtk 文件。InitializeSpecifiedRegionList()函数用于清空要提取的连通区域号的列表。
相关文章:
VTK知识学习(42)-基本的图形操作(三)
1、网格平滑 1)概述 现代扫描技术的发展使得获取点云数据不再困难,通过曲面重建技术可以获取表面网格来表示各种复杂的实体。但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理。 拉普拉斯平滑是一种常用的网格…...
代码随想录算法训练营day40(补0208)
买卖股票专栏 1.买卖股票最佳时机 贪心法,好想 题目 121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖…...
python基于深度学习实现遮挡人脸识别系统的详细方案
以下是一个基于深度学习实现遮挡人脸识别系统的详细方案,使用Python语言: 一、需求理解 遮挡人脸识别系统旨在准确识别出即使面部部分被遮挡(如口罩、眼镜等)的人的身份。该系统将利用深度学习技术,结合合适的数据集进行训练,以达到较高的识别准确率。 二、系统架构 …...
【Python爬虫(43)】云端探秘:Python分布式爬虫部署攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Java集合框架大师课:从青铜到王者的数据结构指南(一)
🚀 Java集合框架大师课:从青铜到王者的数据结构指南(一) 🌟 系列定位:全网最懂小白的JCF实战教程 | 建议搭配IDE边学边练 🎯 学习路线图 第一章:初识JCF江湖 1.1 什么是JCF…...
Vmware虚拟机Ubantu安装Docker、k8s、kuboard
准备工作: 切换用户:su root关闭防火墙: sudo ufw diasble关闭swap: systemctl stop swap.target systemctl status swap.target systemctl disable swap.target #开机禁用 systemctl stop swap.img.swap systemctl status swap.img.swap关闭虚拟交换分区 vim /…...
Java面试——Tomcat
优质博文:IT_BLOG_CN 一、Tomcat 顶层架构 Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。Service主要包含两个部分:Connector和…...
游戏引擎学习第113天
仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板:优化的基本过程 在游戏编程中,优化是一个非常重要的学习内容,尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度,以及如何提升其性能。在这个阶段,已经…...
【EB-02】TC397 Tresos 最小工程配置
TC397 Tresos 最小工程配置 1. 新建demo 工程2. 配置消除错误2.1 ResourceM 设置2.2 McalLib模块配置3. 生成代码3.1 校验工程3.2 生成代码1. 新建demo 工程 新建工程 设置工程名称 选择芯片型号 选择添加模块 得到最小工程需求模块 2. 配置消除错误 2.1 ResourceM 设置 设置芯…...
深入理解WebSocket接口:如何使用C++实现行情接口
在现代网络应用中,实时数据传输变得越来越重要。通过WebSocket,我们可以建立一个持久连接,让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度,还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...
前端面试题
以下是一些前端面试题: 一、HTML/CSS部分 如何实现一个元素的背景颜色渐变效果,并且在不同浏览器中保持兼容性? 答案: 对于现代浏览器,可以使用标准的CSS渐变语法。 线性渐变示例(从左到右,红色到蓝色):background: linear - gradient(to right, red, blue);径向渐变…...
Win11 24h2 不能正常使用ensp的问题(已解决)
因为Win11 24h2的内核大小更改,目前virtualbox在7.1.4中更新解决了。所以Win11 24H2系统版本无法使用 5.x.xx的virtualbox版本,virtualbox对于这个5.x.xx版本早已停止维护,所以这个以后不会有调整。 对应的报错代码是 virtualbox错误代码&…...
Hyper-V初探
听说window自带虚拟机,小窃喜了一下,这样就不用下载第三方虚拟机软件了:VMware或者Oracle VirtualBox,但是本地搜索一看,发现没有安装,百度了一下说家庭中文版是个阉割版的系统,只有教育版&…...
IP协议
IP协议介绍 IP地址=目标网络+目标主机 IP协议是网络层协议 IP报头格式 [IP报头图片] IP报头解析 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 length 4…...
Django Admin: 实现基于数据库实际值的动态过滤器
在 Django Admin 中,我们经常需要使用 list_filter 来为管理界面添加过滤功能。然而,有时我们希望过滤器能够动态地反映数据库中的实际值,而不是依赖于预定义的选项。本文将介绍如何实现一个基于数据库实际值的动态过滤器,以 ECR 仓库的区域过滤为例。 问题背景 在管理 E…...
overflow-x: auto 使用鼠标实现横向滚动,区分触摸板和鼠标滚动事件的方法
假设一个 div 的滚动只设置了 overflow-x: auto 我们发现使用鼠标的滚轮是无法左右滚动的,但是使用笔记本电脑的触摸板,或者在移动设备上是可以滚动的。所以我们需要兼容一下鼠标的横向滚动功能。 我们可以监控 wheel 事件,然后根据位置来计…...
DPVS-2:单臂负载均衡测试
上一篇编译安装了DPVS,这一篇开启DPVS的负载均衡测试 : 单臂 FULL NAT模式 拓扑-单臂 单臂模式 DPVS 单独物理机 CLINET,和两个RS都是另一个物理机的虚拟机,它们网卡都绑定在一个桥上br0 , 二层互通。 启动DPVS …...
宇树科技13家核心零部件供应商梳理!
2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 Humanoid 100清单清单中…...
sqli-labs之Kali搭建靶场环境
背景: SQL注入是一种常见的Web安全漏洞,攻击者可以通过该漏洞在应用程序中执行任意的SQL命令。为了帮助开发者和安全研究人员更好地理解和防范SQL注入攻击,sqli-labs应运而生。它是一个开源项目,提供了一系列的SQL注入练习环境&a…...
Kafka在Windows系统使用delete命令删除Topic时出现的问题
在使用Windows的Kafka时,想要删除某一个主题,发现使用了delete之后会一直报警告。下面是我发现错误之后重新实测的Bug 先创建2个topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test1 --createkafka-topics.bat --bootstrap-serve…...
JVM 面试题相关总结
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
动态记忆网络 DeepMind的MEMO架构允许在推理时动态读写记忆矩阵,记忆容量提升40倍
为了更深入地理解 MEMO 架构的意义,我来详细解读一下,并探讨它在实际应用中的潜力: MEMO 架构的核心思想 MEMO (Memorizing over Memorized) 架构的核心思想是 “层叠记忆”。 传统的记忆网络通常只有一个外部记忆模块,而 MEMO …...
go 并发 gorouting chan channel select Mutex sync.One
goroutine // head: 前缀 index:是一个int的指针 func print(head string, index *int) {for i : 0; i < 5; i {// 指针对应的int *indexfmt.Println(*index, head, i)// 暂停1stime.Sleep(1 * time.Second)} }/* Go 允许使用 go 语句开启一个新的运…...
【STM32 基于PID的闭环电机控制系统】
STM32 基于PID的闭环电机控制系统 目录 STM32 基于PID的闭环电机控制系统一、PID算法在STM32F103C8T6中的实现思路二、代码实现与解释三、PID算法的调试与优化四、总结 一、PID算法在STM32F103C8T6中的实现思路 基本概念 • 目标 :通过PID算法调节电机的转速&#…...
Linux命令后双减号符(--)的含义
个人博客地址:Linux命令后双减号符(--)的含义 | 一张假钞的真实世界 Unix/Linux下各种命令的参数,都是以减号符(-)后面跟单字符参数,比如-r)或者双减号符(--)…...
QT闲记-工具栏
工具栏通常用来放置常用的操作按钮,如QPushButton,QAction等。可以放置在顶部,底部,左侧,右侧,并且支持拖曳,浮动。 1、创建工具栏 通常通过QMainWindow 提供的addToolBar()来创建,它跟菜单栏一样,如果需要工具栏,一般情况下,我们设置这个类的基类为QMainWindow。 …...
Linux中ps -ef命令详解
ps -ef 是一个常用的 Unix/Linux 命令,用于显示当前系统中所有进程的详细信息。具体来说,ps 是 "process status" 的缩写,用于查看进程的状态。-ef 是 ps 命令的选项组合,用于指定输出的格式和内容。 选项解释…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter20-JavaScript API
二十、JavaScript API JavaScript API 随着 Web 浏览器能力的增加,其复杂性也在迅速增加。从很多方面看,现代 Web 浏览器已经成为构建于诸多规范之上、集不同 API 于一身的“瑞士军刀”。浏览器规范的生态在某种程度上是混乱而无序的。一些规范如 HTML5&…...
详解分布式ID实践
引言 分布式ID,所谓的分布式ID,就是针对整个系统而言,任何时刻获取一个ID,无论系统处于何种情况,该值不会与之前产生的值重复,之后获取分布式ID时,也不会再获取到与其相同的值,它是…...
Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复
一、日志管理 (1)基本介绍 日志文件是重要的系统信息文件,记录了如用户登录、系统启动、系统安全、邮件及各种服务等相关重要系统事件在安全方面,日志也至关重要,它能记录系统日常发生的各类事情,可用于检…...
uniapp中@input输入事件在修改值只有第一次有效的问题解决
在uniapp中使用输入框,要求输入不超过7个字,所以需要监听输入事件,当每次输入文字的时候,就把输入的值截断,取前7个值。但是在input事件中,重新赋值的值发生了变化,但是页面上的还是没有变&…...
单片机 code RO-data RW-data ZI-data以及OTA学习
带着问题去学习:这些数据是什么?分别放在哪里, 是什么:我个人的理解 code 和RO-data 分别是代码和只读数据,RW-data以及ZI-data分别是读写数据和初始化数据。 codeRO-data的大小正好是所占用ROM的大小,RO…...
Jenkins 视图(View)
Jenkins 视图(View) 一、视图是什么 Jenkins 视图(View) 如下图中 All、Apps 都是 Jenkisn 中的 View 左侧如果有 New View 或者 点击 All 这一行最右侧的 号,都可以创建视图 二、视图(View)的作用 点击最左侧的 All 可以看到所有的任务 随着项目不断发展&am…...
【Deepseek+Dify】wsl2+docker+Deepseek+Dify部署本地大模型知识库问题总结
wsl2dockerDeepseekDify部署本地大模型知识库问题总结 基于ollama部署本地文本模型和嵌入模型 部署教程 DeepSeekdify 本地知识库:真的太香了 问题贴:启动wsl中docker中的dify相关的容器 发现postgre服务和daemon服务一直在重启,导致前端加…...
实战解析传统发电站智能化改造-第二期(带图带教程)
传统发电站的智能化改造,如同为老工匠配备高科技工具,提升效率与精准度。改造后的发电站兼具传统与智能,更高效、环保,适应现代能源需求。智慧系统搭建平台是连接感知层和应用层的桥梁,将原始数据转化为有价值的信息&a…...
鸿蒙5.0实战案例:基于自定义注解和代码生成实现路由框架
往期推文全新看点(文中附带全新鸿蒙5.0全栈学习笔录) ✏️ 鸿蒙(HarmonyOS)北向开发知识点记录~ ✏️ 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…...
项目设置内网 IP 访问实现方案
在我们平常的开发工作中,项目开发、测试完成后进行部署上线。比如电商网站、新闻网站、社交网站等,通常对访问不会进行限制。但是像企业内部网站、内部管理系统等,这种系统一般都需要限制访问,比如内网才能访问等。那么一个网站应…...
单片机 Bootloade与二进制文件的生成
单片机的 Bootloader 是一种特殊的程序,负责在单片机上电后初始化硬件、更新用户应用程序(固件),并将控制权移交给用户程序。以下是其运行机制和关键流程的详细说明: 1、单片机 Bootloader 的核心作用 固件更新&…...
open webui 部署 以及解决,首屏加载缓慢,nginx反向代理访问404,WebSocket后端服务器链接失败等问题
项目地址:GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 选择了docker部署 如果 Ollama 在您的计算机上,请使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…...
深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )
🍨 本文为🔗365天深度学习训练营 中的学习记录博客Y1中的内容 🍖 原作者:K同学啊 | 接辅导、项目定制 ** 注意该训练营出现故意不退押金,恶意揣测偷懒用假的结果冒充真实打卡记录,在提出能够拿到视频录像…...
HTML项目一键打包工具:HTML2EXE 最新版
HTML2EXE 工具可以一键打包生成EXE可执行文件。可以打包任意HTML项目或者是一个网址为单个EXE文件,直接打开即可运行。支持KRPano全景VR项目、WebGL游戏项目、视频播放、,课件打包、网址打包等。 一、功能特点 类别序号功能标题1支持程序图标自定义(支持…...
网络工程师 (43)IP数据报
前言 IP数据报是互联网传输控制协议(Internet Protocol,IP)的数据报格式,由首部和数据两部分组成。 一、首部 IP数据报的首部是控制部分,包含了数据报传输和处理所需的各种信息。首部可以分为固定部分和可变部分。 固定…...
springboot-自定义注解
1.注解的概念 注解是一种能被添加到java代码中的【元数据,类、方法、变量、参数和包】都可以用注解来修饰。用来定义一个类、属性或一些方法,以便程序能被捕译处理。 相当于一个说明文件,告诉应用程序某个被注解的类或属性是什么,…...
Pytorch实现之特征损失与残差结构稳定GAN训练,并训练自己的数据集
简介 简介:生成器和鉴别器分别采用了4个新颖设计的残差结构实现,同时在损失中结合了鉴别器层的特征损失来提高模型性能。 论文题目:Image Generation by Residual Block Based Generative Adversarial Networks(基于残留块的生成对抗网络产生图像) 会议:2022 IEEE Int…...
微信小程序模仿快播标签云滚动特效
说到快播,故事肯定就不少。用过的人都知道快播首页有个标签云的特效效果,就是渐隐渐显外加上下滚动,其实还挺好看的。至于其他故事嘛,因为没有酒,所以,还是来说说代码吧~ 一开始不是做这个特效需求…...
XUnity.AutoTranslator-deepseek——调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译
XUnity.AutoTranslator-deepseek 本项目通过调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译。 准备工作 1. 获取API密钥 访问腾讯云API控制台申请DeepSeek的API密钥(限时免费)。也可以使用其他平台提供的DeepSeek API。 …...
对比机器学习揭示了跨物种共享与特异性的脑功能结构|文献速递-医学影像人工智能进展
Title 题目 Contrastive machine learning reveals species -shared and -specific brainfunctional architecture 对比机器学习揭示了跨物种共享与特异性的脑功能结构 01 文献速递介绍 猕猴作为人类的动物模型,广泛用于研究大脑和行为的关键方面(G…...
Vue 和 React 响应式的区别
React 和 Vue 在响应式机制上的核心区别主要体现在数据变化侦测方式、更新触发逻辑和设计理念上,具体如下: 一、数据变化侦测方式 Vue 的响应式 原理:通过 Proxy(Vue3)或 Object.defineProperty(Vue2&#…...
MySQL主从架构
MySQL主从架构 MySQL REPLICATION 在实际生产环境中,如果对数据库的读和写都在一个数据库服务器中操作。无论是在安全性、高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(…...
基于ros2与gazebo的导航仿真案例
文章目录 前言操作1、创建docker容器2、安装ROS23、Gazebo安装4、Nav2安装5、测试 前言 导航的入门小案例 参考: Ubuntu24.04 ROS2 Jazzy Gazebo Harmonic安装教程Docs / Gazebo Harmonic 注意选择版本 ROS 2 documentation 操作 1、创建docker容器 sudo docke…...