WebGPU跨平台应用开发
对于 Web 开发人员来说,WebGPU 是一个 Web 图形 API,可提供对 GPU 的统一和快速访问。WebGPU 公开了现代硬件功能,并允许在 GPU 上进行渲染和计算操作,类似于 Direct3D 12、Metal 和 Vulkan。
虽然这是真的,但这个故事并不完整。WebGPU 是协作努力的结果,包括 Apple、Google、Intel、Mozilla 和 Microsoft 等大公司。其中一些人意识到 WebGPU 可能不仅仅是一个 JavaScript API,而是一个跨平台的图形 API,适用于除 Web 之外的跨生态系统的开发人员。
为了满足主要用例,Chrome 113 中引入了 JavaScript API。然而,与之一起开发的另一个重要项目是:webgpu.hC API。这个 C 头文件列出了 WebGPU 的所有可用过程和数据结构。它充当与平台无关的硬件抽象层,允许您通过在不同平台上提供一致的接口来构建特定于平台的应用程序。
在本文档中,我们将学习如何使用 WebGPU 编写一个可在 Web 和特定平台上运行的小型 C++ 应用。剧透警告:只需对代码库进行少量调整,你就会获得浏览器窗口和桌面窗口中出现的相同红色三角形。
NSDT工具推荐:Three.js AI纹理开发包-YOLO合成数据生成器-GLTF/GLB在线编辑-3D模型格式在线转换-可编程3D场景编辑器-REVIT导出3D模型插件-3D模型语义搜索引擎-AI模型在线查看-Three.js虚拟轴心开发包-3D模型在线减面-STL模型在线切割-3D道路快速建模
1、它是如何工作的?
要查看完整的应用程序,请查看?WebGPU 跨平台应用程序存储库。
该应用程序是一个极简的 C++ 示例,展示了如何使用?WebGPU?从单个代码库构建桌面和 Web 应用程序。在底层,它通过名为webgpu_cpp.h?的 C++ 包装器使用 WebGPU 的 webgpu.h 作为与平台无关的硬件抽象层。
警告:webgpu.h 和 webgpu_cpp.h API 可能会发生变化。
在 Web 上,该应用程序是针对Emscripten?构建的,它在 JavaScript API 之上具有实现 webgpu.h 的绑定。在特定平台(如 macOS 或 Windows)上,可以针对 Chromium 的跨平台 WebGPU 实现 Dawn 构建此项目。值得一提的是,webgpu.h 的 Rust 实现wgpu-native也存在,但在本文档中未使用。
2、开始
首先,你需要一个 C++ 编译器和?CMake,以便以标准方式处理跨平台构建。在专用文件夹中,创建一个main.cpp
源文件和一个CMakeLists.txt
构建文件。
main.cpp 文件目前应包含一个空的main()
函数。
int main() {}
CMakeLists.txt
文件包含项目的基本信息。最后一行指定可执行文件名称为“app”,其源代码为main.cpp
。
cmake_minimum_required(VERSION 3.13) # CMake version check
project(app) # Create project "app"
set(CMAKE_CXX_STANDARD 20) # Enable C++20 standardadd_executable(app "main.cpp")
运行cmake -B build
在“build/”子文件夹中创建构建文件,并运行cmake --build build
实际构建应用程序并生成可执行文件。
# Build the app with CMake.
$ cmake -B build && cmake --build build# Run the app.
$ ./build/app
应用程序运行但尚未输出,因为您需要一种在屏幕上绘制内容的方法。
3、获取 Dawn
要绘制三角形,你可以利用Dawn,这是 Chromium 的跨平台 WebGPU 实现。这包括用于在屏幕上绘图的?GLFWC++ 库。下载 Dawn 的一种方法是将其作为 git 子模块添加到你的存储库。以下命令将其提取到“dawn/”子文件夹中。
$ git init
$ git submodule add https://dawn.googlesource.com/dawn
然后,按如下方式附加到 CMakeLists.txt 文件:
-
CMake
DAWN_FETCH_DEPENDENCIES
选项获取所有 Dawn 依赖项。 -
dawn/
子文件夹包含在目标中。 -
你的应用将依赖于
dawn::webgpu_dawn
、glfw
和webgpu_glfw
目标,以便稍后可以在main.cpp
文件中使用它们。…
set(DAWN_FETCH_DEPENDENCIES ON)
add_subdirectory(“dawn” EXCLUDE_FROM_ALL)
target_link_libraries(app PRIVATE dawn::webgpu_dawn glfw webgpu_glfw)
4、打开窗口
现在 Dawn 已可用,使用 GLFW 在屏幕上绘制内容。为方便起见,此库包含在webgpu_glfw
中,允许你编写与平台无关的窗口管理代码。
要打开名为“WebGPU 窗口”且分辨率为 512x512 的窗口,请按如下方式更新main.cpp
文件。请注意,此处使用glfwWindowHint()
来请求不进行任何特定的图形 API 初始化。
#include <GLFW/glfw3.h>const uint32_t kWidth = 512;
const uint32_t kHeight = 512;void Start() {if (!glfwInit()) {return;}glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);GLFWwindow* window =glfwCreateWindow(kWidth, kHeight, "WebGPU window", nullptr, nullptr);while (!glfwWindowShouldClose(window)) {glfwPollEvents();// TODO: Render a triangle using WebGPU.}
}int main() {Start();
}
重建应用程序并像以前一样运行它现在会显示一个空窗口。我们正在取得进展!
5、获取 GPU 设备
在 JavaScript 中,navigator.gpu
是访问 GPU 的入口点。在 C++ 中,你需要手动创建一个用于相同目的的wgpu::Instance
变量。为方便起见,在main.cpp
文件顶部声明实例,并在main()
中调用wgpu::CreateInstance()
。
…
#include <webgpu/webgpu_cpp.h>wgpu::Instance instance;
…int main() {instance = wgpu::CreateInstance();Start();
}
由于 JavaScript API 的形状,访问 GPU 是异步的。在 C++ 中,创建两个辅助函数,分别称为GetAdapter()
和GetDevice()
,它们分别返回带有wgpu::Adapter
和wgpu::Device
的回调函数。
注意:当 WebAssembly JavaScript Promise Integration API 可用时,此示例会简化。撰写本文时情况并非如此。
#include <iostream>
…void GetAdapter(void (*callback)(wgpu::Adapter)) {instance.RequestAdapter(nullptr,[](WGPURequestAdapterStatus status, WGPUAdapter cAdapter,const char* message, void* userdata) {if (status != WGPURequestAdapterStatus_Success) {exit(0);}wgpu::Adapter adapter = wgpu::Adapter::Acquire(cAdapter);reinterpret_cast<void (*)(wgpu::Adapter)>(userdata)(adapter);}, reinterpret_cast<void*>(callback));
}void GetDevice(void (*callback)(wgpu::Device)) {adapter.RequestDevice(nullptr,[](WGPURequestDeviceStatus status, WGPUDevice cDevice,const char* message, void* userdata) {wgpu::Device device = wgpu::Device::Acquire(cDevice);device.SetUncapturedErrorCallback([](WGPUErrorType type, const char* message, void* userdata) {std::cout << "Error: " << type << " - message: " << message;},nullptr);reinterpret_cast<void (*)(wgpu::Device)>(userdata)(device);}, reinterpret_cast<void*>(callback));
}
为了方便访问,在main.cpp
文件顶部声明两个变量wgpu::Adapter
和wgpu::Device
。更新main()
函数以调用GetAdapter()
并将其结果回调分配给适配器,然后调用GetDevice()
并将其结果回调分配给设备,然后再调用Start()
。
wgpu::Adapter adapter;
wgpu::Device device;
…int main() {instance = wgpu::CreateInstance();GetAdapter([](wgpu::Adapter a) {adapter = a;GetDevice([](wgpu::Device d) {device = d;Start();});});
}
6、绘制三角形
交换链未在 JavaScript API 中公开,因为浏览器会处理它。在 C++ 中,你需要手动创建它。
再次,为了方便起见,在main.cpp
文件的顶部声明一个wgpu::Surface
变量。在Start()
中创建 GLFW 窗口后,立即调用wgpu::glfw::CreateSurfaceForWindow()
函数来创建wgpu::Surface
(类似于 HTML 画布),并通过调用InitGraphics()
中的新辅助程序ConfigureSurface()
函数对其进行配置。你还需要调用surface.Present()
来在 while 循环中呈现下一个纹理。这没有可见的效果,因为尚未发生渲染。
#include <webgpu/webgpu_glfw.h>
…wgpu::Surface surface;
wgpu::TextureFormat format;void ConfigureSurface() {wgpu::SurfaceCapabilities capabilities;surface.GetCapabilities(adapter, &capabilities);format = capabilities.formats[0];wgpu::SurfaceConfiguration config{.device = device,.format = format,.width = kWidth,.height = kHeight};surface.Configure(&config);
}void InitGraphics() {ConfigureSurface();
}void Render() {// TODO: Render a triangle using WebGPU.
}void Start() {…surface = wgpu::glfw::CreateSurfaceForWindow(instance, window);InitGraphics();while (!glfwWindowShouldClose(window)) {glfwPollEvents();Render();surface.Present();instance.ProcessEvents();}
}
现在是使用以下代码创建渲染管道的好时机。为了更方便访问,请在main.cpp
文件顶部声明一个wgpu::RenderPipeline
变量,并在InitGraphics()
中调用辅助函数CreateRenderPipeline()
。
wgpu::RenderPipeline pipeline;
…const char shaderCode[] = R"(@vertex fn vertexMain(@builtin(vertex_index) i : u32) ->@builtin(position) vec4f {const pos = array(vec2f(0, 1), vec2f(-1, -1), vec2f(1, -1));return vec4f(pos[i], 0, 1);}@fragment fn fragmentMain() -> @location(0) vec4f {return vec4f(1, 0, 0, 1);}
)";void CreateRenderPipeline() {wgpu::ShaderModuleWGSLDescriptor wgslDesc{};wgslDesc.code = shaderCode;wgpu::ShaderModuleDescriptor shaderModuleDescriptor{.nextInChain = &wgslDesc};wgpu::ShaderModule shaderModule =device.CreateShaderModule(&shaderModuleDescriptor);wgpu::ColorTargetState colorTargetState{.format = format};wgpu::FragmentState fragmentState{.module = shaderModule,.targetCount = 1,.targets = &colorTargetState};wgpu::RenderPipelineDescriptor descriptor{.vertex = {.module = shaderModule},.fragment = &fragmentState};pipeline = device.CreateRenderPipeline(&descriptor);
}void InitGraphics() {…CreateRenderPipeline();
}
最后,在每帧调用的Render()
函数中向GPU发送渲染命令。
void Render() {wgpu::SurfaceTexture surfaceTexture;surface.GetCurrentTexture(&surfaceTexture);wgpu::RenderPassColorAttachment attachment{.view = surfaceTexture.texture.CreateView(),.loadOp = wgpu::LoadOp::Clear,.storeOp = wgpu::StoreOp::Store};wgpu::RenderPassDescriptor renderpass{.colorAttachmentCount = 1,.colorAttachments = &attachment};wgpu::CommandEncoder encoder = device.CreateCommandEncoder();wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&renderpass);pass.SetPipeline(pipeline);pass.Draw(3);pass.End();wgpu::CommandBuffer commands = encoder.Finish();device.GetQueue().Submit(1, &commands);
}
使用 CMake 重建应用程序并运行它,现在会在窗口中显示期待已久的红色三角形!
7、编译为 WebAssembly
现在让我们看一下调整现有代码库以在浏览器窗口中绘制此红色三角形所需的最小更改。同样,该应用程序是针对 Emscripten 构建的,Emscripten 是一种将 C/C++ 程序编译为 WebAssembly 的工具,它在 JavaScript API 之上具有实现 webgpu.h 的绑定。
7.1 更新 CMake 设置
安装 Emscripten 后,按如下方式更新CMakeLists.txt
构建文件。突出显示的代码是你唯一需要更改的内容。
-
set_target_properties
用于自动将“html”文件扩展名添加到目标文件。换句话说,你将生成一个“app.html”文件。 -
USE_WEBGPU
应用程序链接选项是启用 Emscripten 中的 WebGPU 支持所必需的。没有它,你的main.cpp
文件就无法访问webgpu/webgpu_cpp.h
文件。 -
此处还需要
USE_GLFW
应用程序链接选项,以便可以重用 GLFW 代码。cmake_minimum_required(VERSION 3.13) # CMake version check
project(app) # Create project “app”
set(CMAKE_CXX_STANDARD 20) # Enable C++20 standardadd_executable(app “main.cpp”)
if(EMSCRIPTEN)
set_target_properties(app PROPERTIES SUFFIX “.html”)
target_link_options(app PRIVATE “-sUSE_WEBGPU=1” “-sUSE_GLFW=3”)
else()
set(DAWN_FETCH_DEPENDENCIES ON)
add_subdirectory(“dawn” EXCLUDE_FROM_ALL)
target_link_libraries(app PRIVATE dawn::webgpu_dawn glfw webgpu_glfw)
endif()
7.2 更新代码
在 Emscripten 中,创建wgpu::surface
需要 HTML 画布元素。为此,请调用instance.CreateSurface()
并指定#canvas
选择器以匹配 Emscripten 生成的 HTML 页面中的相应 HTML 画布元素。
不要使用 while 循环,而是调用emscripten_set_main_loop(Render)
以确保以适当的平滑速率调用Render()
函数,以便与浏览器和显示器正确对齐。
#include <GLFW/glfw3.h>
#include <webgpu/webgpu_cpp.h>
#include <iostream>
#if defined(__EMSCRIPTEN__)
#include <emscripten/emscripten.h>
#else
#include <webgpu/webgpu_glfw.h>
#endifvoid Start() {if (!glfwInit()) {return;}glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);GLFWwindow* window =glfwCreateWindow(kWidth, kHeight, "WebGPU window", nullptr, nullptr);#if defined(__EMSCRIPTEN__)wgpu::SurfaceDescriptorFromCanvasHTMLSelector canvasDesc{};canvasDesc.selector = "#canvas";wgpu::SurfaceDescriptor surfaceDesc{.nextInChain = &canvasDesc};surface = instance.CreateSurface(&surfaceDesc);
#elsesurface = wgpu::glfw::CreateSurfaceForWindow(instance, window);
#endifInitGraphics();#if defined(__EMSCRIPTEN__)emscripten_set_main_loop(Render, 0, false);
#elsewhile (!glfwWindowShouldClose(window)) {glfwPollEvents();Render();surface.Present();instance.ProcessEvents();}
#endif
}
7.3 使用 Emscripten 构建应用程序
使用 Emscripten 构建应用程序所需的唯一更改是使用神奇的emcmake
shell 脚本添加cmake
命令。这次,在build-web
子文件夹中生成应用程序并启动 HTTP 服务器。最后,打开浏览器并访问build-web/app.html
。
# Build the app with Emscripten.
$ emcmake cmake -B build-web && cmake --build build-web# Start a HTTP server.
$ npx http-server
原文链接:WebGPU跨平台应用开发 - BimAnt
相关文章:
WebGPU跨平台应用开发
对于 Web 开发人员来说,WebGPU 是一个 Web 图形 API,可提供对 GPU 的统一和快速访问。WebGPU 公开了现代硬件功能,并允许在 GPU 上进行渲染和计算操作,类似于 Direct3D 12、Metal 和 Vulkan。 虽然这是真的,但这个故事…...
Proteus(8.15)仿真下载安装过程(附详细安装过程图)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、Proteus是什么? 二、下载链接 三、下安装步骤 1.解压,有键管理员运行 2.点击Next,进行下一步 3.勾选I accept…&#…...
vlan和vlanif
文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法,vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…...
Unity开发哪里下载安卓Android-NDK-r21d
google的东西,居然是完全开源的 真的不是很多公司能做到,和那种伪搜索引擎是不同的 到底什么时候google才会开始造车 不过风险很多,最好不要合资,风险更大...
期末速成C++【初识C++】
目录 1.英文单词 2.C的特点 3.C对C语言的补充 3.1命名空间和域操作符 🎇3.2控制台输入输出 3.3类型增强 3.3.1const常变量 3.3.2const与指针 3.3.3布尔类型与枚举类型 3.4默认参数 🎇3.5函数重载 🎇引用 3.6.1引用做函数参数 …...
爬虫案例学习6
获取淘宝商品数据2024-12-18 参考学习: 大佬博客 视频教程 通过搜索发现,数据是通过发送请求过来的,不是静态存在源代码的 所以我们需要请求这个接口获取数据:比如标题,价格,图片等信息 https://h5api.m…...
28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强
A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法:无模型水下图像增强方法:基于深度学习的水下图像增强方法: 论文方法概述像素分布…...
[BJDCTF2020]ZJCTF,不过如此 1
[BJDCTF2020]ZJCTF,不过如此 1 打开实例发现代码审计 需要GET传入text和file参数,然后执行文件包含 text需要读取到I have a dream文本,这边采用data流进行绕过 ?textdata://,I have a dream&filenext.php成功绕过,接下来…...
Hive的in与not in 值中有null的时候注意事项,join where条件等问题
在进行hive SQL查询数据的时候,where条件中使用了in或者not in,但是该值内有null空。 这时,无论是in还是not in,空值都不会进入该条件内,但是使用not in的时候只是希望把自己不想要的数据给排除掉,这时会同…...
大语言模型画图(流程图、框架图)
第一步:向随意大语言模型,描述内容,推荐豆包 豆包 加上下面Prompt 通过Mermaid语法,描述上面流程图 第二步:将生成Mermaid输入流程图生成网站 中文Mermaid - 流程图、关系图在线画图、生成和编辑器...
Oracle创建逻辑目录
Oracle 在执行逻辑备份及还原时,需要用到逻辑目录。 本文就来简单介绍一下逻辑目录相关的操作,希望对大家有所帮助。 1.登录到Oracle数据库 使用具有足够权限的数据库用户登录到Oracle数据库。通常,这需要是管理员账号,如SYS…...
[react] 优雅解决typescript动态获取redux仓库的类型问题
store.getState()是可以获取总仓库的 先拿到函数的类型 再用ReturnType<T> 它是 TypeScript 中的一个内置条件类型,用于获取某个函数类型 T 的返回值类型 代码 // 先拿总仓库的函数类型type StatefuncType typeof store.getState;//再拿函数类型T的返回值类…...
python如何获取excel单元格文字是否加粗
是的,Python 可以获取 Excel 单元格中的文字是否加粗。通常,这需要使用 openpyxl 库,它允许你读取和写入 Excel 文件(.xlsx 格式)。 以下是一个示例代码,展示如何检查某个单元格的文字是否加粗:…...
我的性能优化经验
专业方向:App cpu/memory/gpu/流畅度/响应时间的优化,Anr,Framework CarPowerManagementService模块的(STR),从0~1完成性能监控体系搭建,完成3大版本迭代高质量性能交付 响应时间: …...
【Vulkan入门】16-IndexBuffer
TOC 先叨叨 上篇介绍了如何使用VertexBuffer传入顶点信息。两个多星期了我们一直在玩三个点,本篇介绍如何渲染更多的点。 在渲染前考虑一个问题,渲染一个三角形需要三个点,渲染两个相接的三角形需要几个点? 答案是6个点…...
如何通过HTTP API新建Collection
本文介绍如何通过HTTP API创建一个新的Collection。 前提条件 已创建Cluster:创建Cluster。 已获得API-KEY:API-KEY管理。 Method与URL HTTP POST https://{Endpoint}/v1/collections 使用示例 说明 需要使用您的api-key替换示例中的YOUR_API_KEY、…...
excel 使用vlook up找出两列中不同的内容
当使用 VLOOKUP 函数时,您可以将其用于比较两列的内容。假设您要比较 A 列和 B 列的内容,并将结果显示在 C 列,您可以在 C1 单元格中输入以下公式: 这个公式将在 B 列中的每个单元格中查找是否存在于 A 列中。如果在 A 列中找不到…...
实验16 循环神经网络(3)
目录 1.数据处理 1.1.数据集下载 1.2.数据加载 1.2.1读取数据 1.2.2词表转换 1.2.3封装数据 2. 模型构建 2.1汇聚层算子 2.2模型汇总 3. 模型训练 3.1模型训练 3.2绘制准确率和损失函数图像 4. 模型评价 5. 模型预测 6. 基于Torch的单向LSTM 6.1模型修改-只返…...
Docker 清理命令
Docker 清理命令 删除停止的容器:停止的容器仍然会占用磁盘空间,可以使用以下命令删除所有停止的容器: docker container prune删除无用的网络:Docker 创建的网络,如果不再使用,也可以被清理: d…...
游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上
游泳溺水识别数据集: 对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上 ,可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98% 9818图片 有效集%…...
【计算机网络】应用层
1. 域名系统 DNS 1.1 域名系统概述 域名系统 DNS (Domain Name System) : 互联网使用的命名系统。 用来把人们使用的机器名字(域名)转换为 IP 地址。 为互联网的各种网络应用提供了核心服务。 域名采用层次树状结构的命名方法。 DNS 是…...
计算机组成原理的学习笔记(1)
学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。 一、hello.c如何运行起来? 1. 预处理阶段 在编译 C 程序时,预处理器首先处理代码。预处理器会: 插入头文件:例如,…...
挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串
一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上ÿ…...
《薄世宁医学通识50讲》以医学通识为主题,涵盖了医学的多个方面,包括医学哲学、疾病认知、治疗过程、医患关系、公共卫生等
《薄世宁医学通识50讲》是一门由薄世宁医生主讲的医学通识课程,该课程旨在通过深入浅出的方式,向广大听众普及医学知识,提升公众对医学的认知和理解。 晓北斗推荐-薄世宁医学通识 以下是对该课程的详细介绍: 一、课程概述 《薄世…...
Golang囊地鼠gopher
开发知识点-golang 介绍红队专题-Golang工具Fscan简介主要功能ubuntu 安装windows 安装常用命令:项目框架源文件common目录Plugins目录Webscan目录入口点插件扫描类型爆破插件common.ScantypeWebtitle函数webpoc扫描POC 执行CEL-GO 实践CEL指纹识别免杀源码特征参考链接红队专…...
关于如何正确在测试用例中mock静态方法的问题
文章目录 情况一:希望在测试用例中直接执行静态方法的逻辑情况二:不希望在测试用例中执行静态方法的逻辑插桩方法坑1: 报错SubclassByteBuddyMockMaker原因与解决方案坑2:报错 the existing static mock registration must be deregistered原…...
深度学习0-前置知识
一、背景 AI最大,它的目的是通过让机器模仿人类进而超越人类; ML次之,它是AI的一个分支,是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器,让机器自行学会如何执行任务,它的成功取决于…...
web网页前后端交互方式
参考该文, 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单,设置method属性定义发送表单数据的方式是get还是post。 如使用get方式,则提交的数据会在url中显示;如使用post方式,提交…...
电商大数据的几种获取渠道分享!
在当今数字化时代,电商大数据已成为企业决策和运营的重要基础。如何高效地获取、分析和利用这些数据,对于提升电商企业的竞争力至关重要。本文将详细介绍几种电商大数据的获取渠道,帮助电商从业者更好地掌握数据资源,提升业务洞察…...
【图像配准】方法总结
图像配准(Image registration)就是将不同时间、不同传感器(成像设备)或不同条件下(天候、照度、摄像位置和角度等)获取的两幅或多幅图像进行匹配、叠加的过程,就是找到1幅图像像素到另1幅图像像素间的空间映射关系它已…...
SSM 超市管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
【Yonghong 企业日常问题04】永洪BI可视化工具Linux部署全攻略(部署详解版)
文章目录 一、准备工作二、服务器环境配置2.1 安装JDK2.2 安装字体 三、产品安装四、相关资料 一、准备工作 在进行部署之前需要有以下几项工作准备: 1.产品安装包 2.对应版本的License 3.对应版本的JDK(推荐JDK11,产品v8版本以上需要JDK11以上版本) 4.…...
ubuntu下gdb调试ROS
参考: 使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客 https://blog.csdn.net/weixin_45031801/article/details/134399664?spm1001.2014.3001.5506 一、调试准备 1.1 CMakeLists改动 注释文件中的 set(CMAKE_BUILD_TYPE "Release") #构建类…...
scala中正则表达式的使用
正则表达式: 基本概念 在 Scala 中,正则表达式是用于处理文本模式匹配的强大工具。它通过java.util.regex.Pattern和java.util.regex.Matcher这两个 Java 类来实现(因为 Scala 运行在 Java 虚拟机上,可以无缝使用 Java 类库&…...
语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限
环境: Win10专业版 谷歌浏览器 版本 131.0.6778.140(正式版本) (64 位) 问题描述: 局域网web语音识别出现识别失败 chrome控制台出现下获取浏览器录音功能,因为安全性问题,需要在…...
前端本地数据存储方式有哪些
发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 在前端开发中,本地数据存储是实现客户端数据持久化的关键技术。以下是几种常见的前端本地数据存储方式: …...
python总说的cd是什么
以下适用于windows环境 cd就是change directory的缩写,即改变目录。 讲cd命令之前,先来看看提示符是什么意思。现在的提示符是c:\> c:说明现在的工作盘是c盘,\告诉我们当前的工作目录是根目录。 >的作用是把工作目录和我们要输入的…...
Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题
项目场景: 提示:这里简述项目相关背景: 例如:Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题 问题描述 提示:这里描述项目中遇到的问题: 例如…...
Netdevops入门基础学习03
1、数据类型 在Python中解释器会自动识别数据类型,但是在C语言中需要手动指定(故Python简单易学) 字符串: str(string) 在Python中加了引号的都是字符串整数: int (integer)浮点数: …...
什么是自然语言处理
01.什么是自然语言处理 自然语言处理(Natural Language Processing,简称NLP)是一门跨学科领域,它结合了计算机科学、人工智能、语言学、心理学等多个学科的知识,旨在使计算机能够理解、解释、处理和生成人类语言。自然语言处理的目标是缩小人类语言和计算机之间的差距,使…...
网络安全怎么学习
当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。 一、网络安全的基本概念 网络安全是一种保护:它涉及保护我们的设…...
网络多层的协议详述
网络层 1)地址管理:制定一系列的规则,通过地址,在网络上描述出一个设备的位置 2)路由选择:网络环境比较复杂,从一个节点到另一个节点,存在很多条不同的路径,需要规划出…...
【C#】方法参数的修饰符ref 与 out
在 C# 中,ref 和 out 是方法参数的修饰符,用于将参数 按引用传递,而不是按值传递。这允许方法修改调用者传递的变量的值。尽管它们的行为类似,但有重要的区别和适用场景。 1. ref 的含义与使用 含义 引用传递: 参数通…...
hpe服务器更新阵列卡firmware
背景 操作系统:RHEL7.8 hpe服务器经常出现硬盘断开,阵列卡重启问题,导致系统hang住。只能手动硬重启。 I/O error,dev sda smartpqi 0000:5c:00:0: resettiong scsi 1:1:0:1 smartpqi 0000:5c:00:0: reset of scsi 1:1:0:1:…...
arcgisPro相接多个面要素转出为完整独立线要素
1、使用【面转线】工具,并取消勾选“识别和存储面邻域信息”,如下: 2、得到的线要素,如下:...
【机器学习】【集成学习——决策树、随机森林】从零起步:掌握决策树、随机森林与GBDT的机器学习之旅
这里写目录标题 一、引言机器学习中集成学习的重要性 二、决策树 (Decision Tree)2.1 基本概念2.2 组成元素2.3 工作原理分裂准则 2.4 决策树的构建过程2.5 决策树的优缺点(1)决策树的优点(2)决策树的缺点(3࿰…...
YOLOv8目标检测——详细记录使用ONNX Runtime进行推理部署C++/Python实现
概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程,本节主要介绍ONNX Runtime的原理以及使用其进行推理加速,使用Python、C两种编程语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. ONNX Ru…...
联合物种分布模型(JSDM)与Hmsc包:群落生态学数据分析与预测技术
联合物种分布模型(Joint Species Distribution Modelling,JSDM)在生态学领域,特别是群落生态学中发展最为迅速,它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…...
蓝桥杯——竞赛省赛国赛题分享
目录 一.[蓝桥杯 2013 省 AB] 错误票据 代码如下: 二.[蓝桥杯 2024 省 Java B] 报数游戏 代码如下: 讲解: 三.[蓝桥杯 2014 国 C] 拼接平方数 代码如下: 四.三步问题(递归,上台阶) 代码…...
【ubuntu18.04】ubuntu18.04挂在硬盘出现 Wrong diagnostic page; asked for 1 got 8解决方案
错误日志 [ 8754.700227] usb 2-3: new full-speed USB device number 3 using xhci_hcd [ 8754.867389] usb 2-3: New USB device found, idVendor0e0f, idProduct0002, bcdDevice 1.00 [ 8754.867421] usb 2-3: New USB device strings: Mfr1, Product2, SerialNumber0 [ 87…...