Mitsuba 渲染基础

news2024/12/27 13:06:20

Mitsuba 渲染基础

    • 0. Abstract
    • 1. 安装 Mitsuba2
      • 1.1 下载 Mitsuba2 源码
      • 1.2 选择后端 (variants)
      • 1.3 编译
    • 2. [Mitsuba2PointCloudRenderer](https://github.com/tolgabirdal/Mitsuba2PointCloudRenderer)
      • 2.1 Mitsuba2 渲染 XML
      • 2.2 Scene 场景的 XML 文件格式
        • 2.2.1 `chair.npy` to XML
        • 2.2.2 Scene XML 文件解析
    • 3. Mitsuba2 小结
    • 4. Mitsuba3
      • 4.1 Mitsuba3 安装
      • 4.2 Quickstart
        • 4.2.1 Dr.Jit Quickstart (Similarity with NumPy)
        • 4.2.2 Mitsuba3 Quickstart

0. Abstract

最近看到一些点云相关的工作, 他们在文章中展示的点云结果很好看, 类似这样:

但自己用 matplotlib 画的结果却很丑, 发邮件问作者才知道他用了一个渲染工具 Mitsuba2PointCloudRenderer. 它用到了渲染软件 Mitsuba2, 执行:

python render_mitsuba2_pc.py chair.npy

就能渲染点云, 过程是这样的:

  1. generates an XML file, which describes a 3D scene in the format used by Mitsuba;
  2. calls Mitsuba2 to render the point cloud into an EXR file;
  3. processes the EXR into a jpg file.
  4. iterates for multiple point clouds present in the tensor (.npy)

想要了解其到底干了什么, 如何自定义渲染配置? 就进入这个仓库好好看一看.

1. 安装 Mitsuba2

那么自然要先安装 Mitsuba2, 比较麻烦, 似乎要根据 官方文档 从源码编译安装, 那就照说明做.

1.1 下载 Mitsuba2 源码

git clone --recursive https://github.com/mitsuba-renderer/mitsuba2

Mitsuba2 依赖了很多其他库, --recursive 可以保证同时将其依赖的库一起 clone 下来.

1.2 选择后端 (variants)

克隆好后, 还要了解 Mitsuba2 的后端. 它是一个重定向系统, 前端的调用接口大多是一致的, 实际的后端执行者有很多版本, 各后端版本命名规则:

上面是一个后端的例子:

  • Computational Backend: 指计算设备及计算方式. 如果选择在 CPU 上计算, 可以是 scalar, 对应标量计算方式, 也可以是 packet, 对应并行计算方式; 如果选择在 GPU 上计算, 有 gpugpu_autodiff 可选;

大概意思是, 渲染过程需要发出很多光线, scalar 后端每次只能计算一个光路径, packet 每次并行计算一组, gpu 则具有更高的并行性. 下图展示了 scalarpacket 的区别.

  • Color Representation: 指颜色的表示方式, 有 mono, rgb, spectral. 其中, mono 是单色的意思, 可能是灰白; 光谱表示可能有更加丰富的颜色; 需要注意的是, 在 spectral 模式下, 默认输出的依然是 RGB 图片, 输入仅包含 RGB 颜色信息的 scene, 也能渲染;
  • Polarization: 略;
  • Precision: 计算时使用的浮点精度, 默认是单精度, 带 _double 则表示使用双精度; 注意, GPU 不支持双精度.

全部的变体列表在 Choosing Variants 查看.

了解了 Mitsuba2 的后端后, 可在代码库的根目录配置你需要的后端类型:

cd <..mitsuba repository..>
cp resources/mitsuba.conf.template mitsuba.conf

打开 mitsuba.conf, 找到(大约在70行):

"enabled": [
    # The "scalar_rgb" variant *must* be included at the moment.
    "scalar_rgb",
    "scalar_spectral"
],

这是默认启用的两个, 你可以向这个列表中添加需要的后端.

注意: scalar_rgb 必须要有, 因为很多基础功能是基于它的; 尽量少添加, 因为后端越多, 编译时间越长, 占用空间越大.

设置默认后端: (如果使用 Mitsuba2 时未指定后端, 则使用默认的后端)

# If mitsuba is launched without any specific mode parameter,
# the configuration below will be used by default
"default": "scalar_spectral"

1.3 编译

不同系统编译要求及命令不同(Python>=3.6). Windows 下需要安装 Visual Studio, 果断放弃; Linux 下也需要一堆依赖:

# Install recent versions build tools, including Clang and libc++ (Clang's C++ library)
sudo apt install -y clang-9 libc++-9-dev libc++abi-9-dev cmake ninja-build
# Install libraries for image I/O and the graphical user interface
sudo apt install -y libz-dev libpng-dev libjpeg-dev libxrandr-dev libxinerama-dev libxcursor-dev
# Install required Python packages
sudo apt install -y python3-dev python3-distutils python3-setuptools

# >>>>>>>>>>>>> 可选 >>>>>>>>>>>>>>>>
# For running tests
sudo apt install -y python3-pytest python3-pytest-xdist python3-numpy
# For generating the documentation
sudo apt install -y python3-sphinx python3-guzzle-sphinx-theme python3-sphinxcontrib.bibtex

文档说编译器要选 clang, 因为用 gcc 会有各种问题.

export CC=clang-9
export CXX=clang++-9

如果已经有其他版本的 clang, 可以调整后缀.

然后, 进入代码根目录开始编译:

# Create a directory where build products are stored
mkdir build
cd build
cmake -GNinja ..
ninja

编译好之后, build 目录下会有一个dist 的文件夹, 里面就是编译好的 Mitsuba2:

其中 mitsuba 就是可执行文件.

注意, 如果选择了 GPU 后端, 需要有 CUDA 和 OptiX 来编译.

2. Mitsuba2PointCloudRenderer

在 Abstract 中, 已经说明这个库的步骤是先生成 .xml scene 文件, 然后调用 Mitsuba2 进行渲染. 为了急于验证编译的 Mitsuba2 好不好使, 先讲述渲染部分.

2.1 Mitsuba2 渲染 XML

编译之后就可以使用了, 在这之前, 需要把 render_mitsuba2_pc.py 中的 Mitsuba2 路径修改一下:

...
# mitsuba exectuable, 改成自己的 Mitsuba2 位置
PATH_TO_MITSUBA2 = "/home/tolga/Codes/mitsuba2/build/dist/mitsuba"
...

然后执行:

python render_mitsuba2_pc.py chair.npy

就可以得到渲染后的点云图片.

Mitsuba2 的调用是通过 python 的 subprocess 包执行 shell 命令来实现的:

...
subprocess.run([PATH_TO_MITSUBA2, xmlFile])
...

这里的 xmlFile 是 Python 代码根据 numpy 数组生成的表示 scene 的 xml 文件. 此行代码相当于 shell 命令:

/home/tolga/Codes/mitsuba2/build/dist/mitsuba chair_scene.xml

由 1.2 节可知, 默认使用的是 scalar_spectral, 应该是比较慢的, 渲染这个椅子大约花费了 42s. 那就试一试 GPU 咋样:

subprocess.run([PATH_TO_MITSUBA2, xmlFile, '-m', 'gpu_rgb'])

出了意外:

2024-09-20 20:15:36 INFO  main  [optix_api.cpp:56] Dynamic loading of the Optix library ..
Caught a critical exception: [optix_api.cpp:144] optix_initialize(): libnvoptix.so.1 could not be loaded.

试试手动渲染也是一样的错误. 后来尝试各种办法均无法解决, 可能原因是我使用的环境是 docker 服务器, 管不了 NVIDIA 驱动的事.

GPU 不行就试试 packet:

subprocess.run([PATH_TO_MITSUBA2, xmlFile, '-m', 'packet_rgb'])

好像并没有变快, 足足花了 49s. 可能还有其他参数未设置吧, 比如并行数量. 后来发现是因为 rgb, 之前是 spectral, scalar_rgb 足足花了 1.24m. 可见还是加速了的.

2.2 Scene 场景的 XML 文件格式

了解 scene 文件的格式才能自由调整渲染的各种属性, 官方文档中的 提供了详细说明, 但本博文就只简单了解一下根据 chair.npy 生成的 XML 文件.

2.2.1 chair.npy to XML

阅读 render_mitsuba2_pc.py, 可以发现, XML 文件的生成是三部分组成的: head, shape, tail, 具体的后面再说, 现在看看点云是如何转化为 XML 文件的.

最主要的是中间部分:

xml_ball_segment = \
	"""
	<shape type="sphere">
		<float name="radius" value="0.015"/>
		<transform name="toWorld">
			<translate x="{}" y="{}" z="{}"/>
		</transform>
		<bsdf type="diffuse">
			<rgb name="reflectance" value="{},{},{}"/>
		</bsdf>
	</shape>
"""
xml_segments = [xml_head]
for i in range(pcl.shape[0]):
	color = colormap(pcl[i, 0] + 0.5, pcl[i, 1] + 0.5, pcl[i, 2] + 0.5 - 0.0125)
	xml_segments.append(xml_ball_segment.format(pcl[i, 0], pcl[i, 1], pcl[i, 2], *color))
xml_segments.append(xml_tail)

通过一个 for 循环把点云 pcl 中的点映射至颜色 color (根据点位置), 然后点和颜色一起送入 xml_ball_segment 的格式化占位符中, 分别对应 shape -> transform -> translateshape -> bsdf -> rgb.

2.2.2 Scene XML 文件解析

已经了解了点云如何转化为 XML 文件, 可其中的标签都代表什么还不清楚, 查阅官方文档既漫长又枯燥, 直接拿得到的 XML 文件问一问通义千问吧, 现以注释的形式记录:

<scene version="0.6.0">
	<!--
		积分器是用来计算光照传输方程的方法, 模拟不同的光照效果;
			path: 这里指定的是路径追踪积分器(Path Tracer), 模拟光线在场景中的随机行走(即光线的“路径”), 从而得到更加真实的光影效果;
			maxDepth: 路径的最大深度, 当 maxDepth 设置为 -1 时, 表示没有最大深度限制, 即允许光线无限反弹.
	-->
	<integrator type="path">
		<integer name="maxDepth" value="-1"/>
	</integrator>
	<!-- 定义了一个相机(传感器)sensor, 它用于捕捉场景并生成图像; -->
	<sensor type="perspective">  <!-- “透视”相机, 它将场景中的物体从三维空间映射到二维图像上, 以模拟人眼观察的视觉效果. -->
		<float name="farClip" value="100"/>   <!-- 远裁剪平面的距离为 100 单位长度, 任何在这个距离之外的对象都不会被绘制. -->
		<float name="nearClip" value="0.1"/>  <!-- 近裁剪平面的距离为 0.1 单位长度. 任何在这个距离之内的对象也不会被绘制. -->
		<!--
			相机的位置和方向:
				origin="3,3,3": 相机的位置是在 (3, 3, 3) 坐标处.
				target="0,0,0": 相机对准的点是在原点 (0, 0, 0).
				up="0,0,1": 向上的方向是沿着 Z 轴正方向.
		-->
		<transform name="toWorld">
			<lookat origin="3,3,3" target="0,0,0" up="0,0,1"/>
		</transform>
		<float name="fov" value="25"/>  <!-- 相机的视场角(Field of View)为 25 度. 视场角决定了相机能看到的范围大小. -->
		<!--
			独立采样器(Sampler), 用于确定渲染过程中像素的样本分布
				sampleCount: 每个像素的采样数量为 256. 更多的样本可以减少噪点, 但也增加了渲染时间.
		-->
		<sampler type="independent">
			<integer name="sampleCount" value="256"/>
		</sampler>
		<!-- 渲染输出的胶片(Film)类型为 HDR(高动态范围)-->
		<film type="hdrfilm">
			<integer name="width" value="1920"/>  <!-- 图像宽度为1920像素 -->
			<integer name="height" value="1080"/> <!-- 图像高度为1080像素 -->
			<rfilter type="gaussian"/>  <!-- 使用高斯滤波器进行像素重建, 以减少输出图像的噪声 -->
		</film>
	</sensor>

	<!-- 材料的表面反射模型(BSDF) -->
	<bsdf type="roughplastic" id="surfaceMaterial">  <!-- 粗糙塑料材质的 BSDF(双向散射分布函数) -->
		<string name="distribution" value="ggx"/>
		<float name="alpha" value="0.05"/>  <!-- 微表面模型的粗糙度参数alpha为0.05. 该值越小, 表面看起来越光滑;越大, 则越粗糙. -->
		<float name="intIOR" value="1.46"/> <!-- 折射率影响物体的透明度和折射效果. 对于塑料而言, 1.46是一个合理的折射率值 -->
		<!--
			材料的漫反射颜色, 默认情况下是白色(1,1,1), 这里的值覆盖了默认的 0.5, 使得材料看起来更加白色. 
			漫反射颜色影响物体在没有直接光照情况下的颜色表现. 
		-->
		<rgb name="diffuseReflectance" value="1,1,1"/> <!-- default 0.5 -->
	</bsdf>

	<shape type="sphere">
		<float name="radius" value="0.015"/>
		<transform name="toWorld">
			<translate x="-0.28334808349609375" y="0.3507939875125885" z="-0.43566787242889404"/>
		</transform>
		<bsdf type="diffuse">
			<rgb name="reflectance" value="0.24634252336480672,0.9673892625993827,0.05893535263050671"/>
		</bsdf>
	</shape>
	<!-- ... 很多 shape ... -->
	<shape type="rectangle">
		<ref name="bsdf" id="surfaceMaterial"/>  <!-- 引用前面的 bsdf, 以说明本长方形的表面材质 -->
		<transform name="toWorld">
			<scale x="10" y="10" z="1"/>
			<translate x="0" y="0" z="-0.5"/>
		</transform>
	</shape>
	
	<shape type="rectangle">
		<transform name="toWorld">
			<scale x="10" y="10" z="1"/>
			<lookat origin="-4,4,20" target="0,0,0" up="0,0,1"/>
		</transform>
		<emitter type="area">
			<rgb name="radiance" value="6,6,6"/>
		</emitter>
	</shape>
</scene>

深追无益, 现在只关注几个要点, 用以调整生成点云渲染图的视角和颜色效果:

  • sensor -> transform -> lookat 影响视角: 查看方向朝上的方向决定了你看到图片的效果;
  • <float name="fov" value="25"/> 视场角决定了相机能看到的范围大小;
  • sensor -> film 影响生成图片的分辨率;

3. Mitsuba2 小结

有了这些, 已经足够渲染点云, 也能更改渲染时的各种属性. 存在的问题在于:

  • Windows 下安装麻烦, 不想安装 Visual Studio, 因为它太大了;
  • 目前无法使用 GPU;

然后, 目光转向:

4. Mitsuba3

Mitsuba2 已经被弃用, 不会再有更新和维护. Mitsuba3 已发布, 解决了之前的很多问题, 那就看一看咋样吧.

4.1 Mitsuba3 安装

Mitsuba3 官方已经打包了 PYPI 包, 可以直接用 pip 安装了(暂时没有 conda 渠道, 不过 Windows 下也能轻松安装了):

pip install mitsuba

Requirements

  • Python >= 3.8
  • (optional) For computation on the GPU: NVidia driver >= 495.89
  • (optional) For vectorized / parallel computation on the CPU: LLVM >= 11.1

无需自己手动编译, 可直接在 Python 脚本中调用:

import mitsuba as mi

mi.set_variant('scalar_rgb')      # 设置后端
scene_dict = mi.cornell_box()     # 包内提供的一个描述场景信息的字典, 等价于 xml 文件
scene = mi.load_dict(scene_dict)  # 加载场景
img = mi.render(scene)            # 渲染
mi.Bitmap(img).write('cbox.exr')  # 保存

当然也可以命令行调用:

~# mitsuba -h
Mitsuba version 3.5.2 (master[29d6537], Linux, 64bit, 64 threads, 8-wide SIMD)
Copyright 2022, Realistic Graphics Lab, EPFL
Enabled processor features: cuda llvm avx f16c sse4.2 x86_64

PYPI 包默认编译了 4 个后端:

>>> mi.variants()
['scalar_rgb', 'scalar_spectral', 'cuda_ad_rgb', 'llvm_ad_rgb']
# 注意, 在 Mitsuba3 中, 后端名不太一样, packet --> llvm, gpu --> cuda

基本够用了, 但如果你需要其他后端, 可以像 Mitsuba2 一样进行配置和编译. 比较麻烦, 不过比 Mitsuba2 好的地方在于, 我发现 Mitsuba3 的代码仓库中有 pyproject.toml 文件, 那么就可能通过:

cd <root of the repository>
pip install .

进行安装, 过程中会进行源代码的编译和安装. 我试了试, 无论是直接 cmake .. 还是 pip install ., 都失败了, 算了.

4.2 Quickstart

Mitsuba3 使用一个叫 Dr.Jit 的后端计算工具库, 这可能会在后面的高级用法中用到, 本节先介绍一下 Dr.Jit 的 Quickstart, 然后介绍 Mitsuba3 的 Quickstart.

Dr.Jit 是为 Mitsuba3 特意设计的, 但也可以用作其他计算用途.

重磅: 后面会牵扯到不少渲染, scalarllvm 都比较慢(后来发现, 即使在 scalar 下, CPU 都会 100%), 于是到 Colab 尝试, 分得 T4 GPU, 渲染竟然瞬间完成. 可结果却是模糊的…

4.2.1 Dr.Jit Quickstart (Similarity with NumPy)

Dr.Jit 语法很像 NumPy, 且两个库是可互操作的:

from drjit.llvm import Float, UInt32

# Create some floating-point arrays
a = Float([1.0, 2.0, 3.0, 4.0])
b = Float([4.0, 3.0, 2.0, 1.0])

# Perform simple arithmetic
c = a + 2.0 * b
print(f'c -> ({type(c)}) = {c}')

# Convert to NumPy array
d = np.array(c)
print(f'd -> ({type(d)}) = {d}')

这里 from drjit.llvm import Float, UInt32 有问题, 虽然能运行, 但 IDE 中写代码会报错: 找不到 llvm, 其他后端如 cuda 也一样. 这可能是其 .pyi 文档有问题. 改成 from drjit import llvm 就没问题了, 然后通过 llvm.Float, llvm.UInt32 访问其中的类.
注意, 尝试了修改其 .pyi 文件, 得到的结果是连运行都不行了.

NumPy 不同, Dr.Jit 可以选择在 GPU 上运算:

其他就不多说了, 如有需要, 可参考 Dr.Jit Quickstart.

4.2.2 Mitsuba3 Quickstart

上面安装后的测试已经是 Mitsuba3 的 Quickstart 了, 这里重复一遍, 并加以说明:

>>> import mitsuba as mi
>>> mi.variants()
['scalar_rgb', 'scalar_spectral', 'cuda_ad_rgb', 'llvm_ad_rgb']

这是默认的四个后端, 可以选择其中一个:

>>> mi.set_variant("scalar_rgb")

然后加载场景文件, 支持 XML 格式和 DICT 格式:

scene = mi.load_file("./scenes/cbox.xml")

scenes 可在这里下载. 渲染 (We can for example pass the desired number of samples per pixel (SPP)):

image = mi.render(scene, spp=256)

可用 matplotlib 画出渲染结果:

import matplotlib.pyplot as plt

plt.axis("off")
plt.imshow(image ** (1.0 / 2.2)); # approximate sRGB tonemapping

在这里插入图片描述
可以保存为各种格式的图片:

mi.util.write_bitmap("my_first_render.png", image)
mi.util.write_bitmap("my_first_render.exr", image)

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

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

相关文章

哪种电容笔更好用?2024精选推荐五款黄金畅销平替电容笔!

在当今信息化高速发展的时代&#xff0c;电容笔已成为众多电子设备用户不可或缺的重要配件。无论是专业的绘画创作者&#xff0c;还是日常学习、办公的人群&#xff0c;都对电容笔有着广泛的需求。可是市面上的品牌很多&#xff0c;到底哪种电容笔更好用呢&#xff1f;大家别担…

基于TCP协议的网络通信

TCP即传输控制协议&#xff0c;基于TCP协议的网络通信总是面向连接的&#xff0c;在通信过程中需要进行“三次握手&#xff0c;四次挥手”&#xff0c;这是众所周知的&#xff0c;所以这里不过多赘述。我们都知道TCP协议传输数据比较稳定&#xff0c;那么为什么稳定&#xff0c…

【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】

卸载 MySQL 参考文章&#xff1a; 完美解决Mysql彻底删除并重装_怎么找到mysql并卸载-CSDN博客使用命令卸载mysql_卸载mysql服务命令-CSDN博客 先管理员方式打开 cmd &#xff0c;切换到 MySQL 安装目录的 bin 文件夹下&#xff0c;执行如下命令&#xff0c;删除 MySQL 服务mys…

基于DPU的OpenStack裸金属服务快速部署及存储解决方案

1 方案背景和挑战 Openstack作为开源云计算领域的领军项目&#xff0c;凭借其强大的功能、灵活的架构以及活跃的社区支持&#xff0c;在全球范围内得到了广泛的采用。通过Openstack&#xff0c;企业和云服务提供商可以更加高效地管理和利用计算资源、存储资源和网络资源&#…

秋招面试准备:《小米2024数字芯片岗面试题》

在数字芯片设计的浪潮中&#xff0c;验证工程师的角色愈发重要。他们如同守门人&#xff0c;确保每一块芯片在投入市场前都能稳定、高效地运行。小米&#xff0c;作为全球知名的智能设备制造商&#xff0c;对数字芯片岗位的人才选拔尤为严格。 本文分享《小米2024数字芯片岗面…

Cat2Bug-Platform报告功能介绍

报告 报告是对团队、项目、测试用例、缺陷、交付物等工作管理做出的总结性报表&#xff0c;目前可通过OPEN API方式创建。 报告列表 报告列表中展示了已经提交的报表信息&#xff0c;点击某一个报告后可查看报告详情&#xff0c;报告可通过markdown格式展示&#xff0c;如下…

Java List初始化的六种方式

在日常的开发中,List作为我们常用的一种数据结构,那么有谁了解过在Java中如何对一个List进行初始化操作。在这些初始化操作中又有哪些遇到的坑呢? 1、常规方式 List<String> languageList = new ArrayList<>(); languageList.add("Java"); language…

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

如何构建出更好的大模型RAG系统?

ChatGPT爆火之后&#xff0c;以ChatPDF为首的产品组合掀起了知识库问答的热潮。 在过去一整年中&#xff0c;大多数人都在完成RAG系统到高级RAG系统的迭代升级。但是技术发展是迅速的&#xff0c;如何深入了解RAG的发展&#xff0c;做出更好的RAG系统&#xff0c;其实还是非常…

32岁前端干了8年,是继续做前端开发,还是转其它工作_ui设计师转开发

前端发展有瓶颈&#xff0c;变来变去都是那一套&#xff0c;只是换了框架换了环境。换了框架后又得去学习&#xff0c;虽然很快上手&#xff0c;但是那些刚毕业的也很快上手了&#xff0c;入门门槛越来越低&#xff0c;想转行或继续卷&#xff0c;该如何破圈? 这是一位网友的自…

使用SBP打AssetBundle时脚本引用丢失

1&#xff09;使用SBP打AssetBundle时脚本引用丢失 2&#xff09;在UE 5.3中连接Power节点为何10的3次幂等于1009 3&#xff09;如何在Widget中倾斜一张纹理贴图 4&#xff09;如何在打开关卡蓝图时更改游戏模式 这是第401篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热…

uni-app快速入门

目录 一、什么是 uni-app二、快速创建 uni-app 项目1.创建 uni-app2.运行 uni-app 三、uni-app 相对传统 H5 的变化1.网络模型的变化2.文件类型变化3.文件内代码架构的变化4.外部文件引用方式变化5.组件/标签的变化6.js的变化&#xff08;1&#xff09;运行环境从浏览器变成v8引…

MCU自动测量单元采集振弦式应变计测值的过程

振弦式应变计是一种广泛应用于土木工程、地质勘探等领域的高精度传感器&#xff0c;用于测量结构的应变变化。近年来&#xff0c;随着微控制器单元(MCU)的发展&#xff0c;自动化测量技术得到了极大的提升&#xff0c;使得振弦式应变计的测值采集更加高效和精确。本文将详细介绍…

关于 mybatis-plus-boot-starter 与 mybatis-spring-boot-starter 的错误

不是知道你是否 出现过这样的错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 经过各种度娘&#xff0c;无非就是让你检查三种情况 情况一&#xff1a;mapper.xml没有按照传统的maven架构进行放置 情况二&#xff1a;mybatis的配置信…

C语言实现简单凯撒密码算法

**实验2&#xff1a;传统密码技术 【实验目的】 通过本次实训内容&#xff0c;学习常见的传统密码技术&#xff0c;通过编程实现简单代替密码中的移位密码算法&#xff0c;加深对传统密码技术的了解&#xff0c;为深入学习密码学奠定基础。【技能要求】 分析简单代替密码中的移…

R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析

随机森林作为一种集成学习方法&#xff0c;在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性&#xff0c;随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中&#xff0c;使用Bootstrap抽样生成不同的训练集&#xff…

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】 2207.字符串中最多数目的子序列方法&#xff1a;贪心 一次遍历 2207.字符串中最多数目的子序列 方法&#xff1a;贪心 一次遍历 从题意中可以看出来&#xff0c;对于 pattern.charAt(0) 一定是插入到最左侧是最优…

什么是SSL证书?它能保护你的网络安全!

相信大家在浏览网页时经常会看到一些网址前面有个“小锁”图标&#xff0c;它代表的网站是安全的&#xff0c;而这背后的秘密就是SSL证书。那SSL证书到底是什么&#xff1f;它有什么用呢&#xff1f; 什么是SSL证书&#xff1f; SSL证书的全称是Secure Sockets Layer证书&…

php发送邮箱教程:如何实现邮件发送功能?

php发送邮箱性能优化策略&#xff1f;怎么使用PHPMail发送邮箱&#xff1f; 无论是用户注册验证、密码重置&#xff0c;还是系统通知&#xff0c;邮件发送都是不可或缺的一部分。AokSend将详细介绍如何使用PHP实现邮件发送功能&#xff0c;帮助开发者快速掌握这一技能。 php发…

高效驱动,掌控动力:TB67H400AFNG 马达驱动器

在如今智能设备和自动化应用领域中&#xff0c;驱动器的性能直接决定了系统的可靠性与效率。东芝的TB67H400AFNG有刷直流马达驱动器凭借其卓越的性能&#xff0c;成为众多行业解决方案中的关键部件。无论是工业控制、自动化设备还是消费类电子产品&#xff0c;TB67H400AFNG都能…