Python计算机视觉四章-照相机模型与增强现实

目录

4.1针孔照相机模型

        4.1.1照相机矩阵

4.1.2 三维点的投影

4.1.3 照相机矩阵的分解

4.1.4 计算照相机中心

4.2 照相机标定

        4.2.1 一个简单的标定方法

4.3 以平面和标记物进行姿态估计

4.4 增强现实

        4.4.1 PyGame和PyOpenGL

        4.4.2 从照相机矩阵到OpenGL格式

4.4.3 在图像中放置虚拟物体

4.4.4 综合集成


4.1针孔照相机模型

        对于大多数应用来说,针孔照相机模型简单,并且具有足够的精确度。该照相机从一个小孔采集射到暗箱内部的光线。 在针孔照相机模型中,在光线投影到图像平面之前,从唯一一个点经过,也就是照相机中心 C

        在针孔照相机中,三维点 X 投影为图像点 x (两个点都是用齐次坐标表示的),如下
所示:                                                   \lambda x=PX

        4.1.1照相机矩阵

        照相机矩阵可以分解为:P=K[R|t]

        其中,R 是描述照相机方向的旋转矩阵,t 是描述照相机中心位置的三维平移向量,内标定矩阵 K 描述照相机的投影性质。

                                                        K=\begin{bmatrix}\alpha f&s&c_x\\0&f&c_y\\0&0&1\end{bmatrix}

        

        图像平面和照相机中心间的距离为焦距 f 。当像素数组在传感器上偏斜的时候,需要
用到倾斜参数 s。即:
                                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​ K=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}
       f_{a}=\alpha f _{y}.

4.1.2 三维点的投影

        下面来创建照相机类,用来处理我们对照相机和投影建模所需要的全部操作:

实验代码:

import numpy as np
from scipy import linalg
import matplotlib.pyplot as pltclass Camera(object):""" 表示针孔照相机的类 """def __init__(self, P):""" 初始化 P = K[R|t] 照相机模型 """self.P = Pself.K = None  # 标定矩阵self.R = None  # 旋转self.t = None  # 平移self.c = None  # 照相机中心def project(self, X):""" X(4×n 的数组)的投影点,并且进行坐标归一化 """x = np.dot(self.P, X)x /= x[2]  # 归一化return xdef generate_random_rotation_matrix():""" 生成一个随机旋转矩阵 """theta = np.random.uniform(0, 2 * np.pi)phi = np.random.uniform(0, np.pi)z = np.random.uniform(0, 2 * np.pi)Rz = np.array([[np.cos(z), -np.sin(z), 0],[np.sin(z), np.cos(z), 0],[0, 0, 1]])Ry = np.array([[np.cos(phi), 0, np.sin(phi)],[0, 1, 0],[-np.sin(phi), 0, np.cos(phi)]])Rx = np.array([[1, 0, 0],[0, np.cos(theta), -np.sin(theta)],[0, np.sin(theta), np.cos(theta)]])R = np.dot(Rz, np.dot(Ry, Rx))return R# 生成随机三维点
np.random.seed(0)  # 固定随机种子以确保实验可重复
n_points = 100
X = np.vstack((np.random.rand(3, n_points), np.ones(n_points)))  # 4 × n 的点# 生成相机投影矩阵
K = np.eye(3)
R = np.eye(3)
t = np.array([[0], [0], [-5]])
P = np.hstack((R, t))  # 形成 K[R|t] 矩阵camera = Camera(P)# 投影点
projected_points = camera.project(X)# 画图
plt.figure(figsize=(10, 8))
plt.scatter(projected_points[0], projected_points[1], c='blue', label='Original Projection')# 随机旋转并投影
n_rotations = 5
for i in range(n_rotations):R_random = generate_random_rotation_matrix()P_random = np.hstack((R_random, t))  # 使用相同的平移camera.P = P_randomrotated_projected_points = camera.project(X)plt.scatter(rotated_projected_points[0], rotated_projected_points[1], label=f'Rotation {i + 1}')plt.xlabel('x')
plt.ylabel('y')
plt.title('Projection of 3D Points with Different Random Rotations')
plt.legend()
plt.grid(True)
plt.show()
     分析:
  1. 生成三维点:

    • 随机生成了 100 个三维点,使用 np.vstack 将其转换为 4 × n 的齐次坐标形式。
  2. 生成相机投影矩阵:

    • 这里我们使用单位矩阵作为标定矩阵和旋转矩阵,同时设置一个简单的平移。
  3. 投影和绘图:

    • 初次投影后的点用蓝色显示。
    • 对每个随机生成的旋转矩阵,重新计算投影并绘制轨迹,以观察旋转对投影位置的影响。

        结果:

        实验展示了不同旋转对投影结果的影响。通过随机旋转,我们可以观察到在图像平面上点的位置会发生变化,表明旋转的确改变了三维点的投影位置。

4.1.3 照相机矩阵的分解

        为了使用 RQ 因子分解对照相机矩阵进行分解,我们需要将一个摄像机投影矩阵 PP 分解为两个矩阵的乘积:P=RQP=RQ,其中 RR 是旋转矩阵,QQ 是内参矩阵。以下是使用 Python 和 NumPy 实现 RQ 因子分解的基本代码示例及其分析:

        实验代码:

import numpy as np
from scipy.linalg import rq# 假设相机矩阵 P 是一个 3x4 矩阵
P = np.array([[1, 0, 0, 0],[0, 1, 0, 0],[0, 0, 1, 0]
])# 取出前 3x3 部分来进行 RQ 分解
P_intrinsic = P[:, :3]
P_ext = P[:, 3:]# 使用 scipy 的 rq 函数进行分解
K, RT = rq(P_intrinsic, mode='economic')# 从 RT 中分解出 R 和 T
R = RT[:, :3]
T = RT[:, 2]print("Intrinsic Matrix (K):")
print(K)
print("Rotation Matrix (R):")
print(R)
print("Translation Vector (T):")
print(T)

分析:

  1. Intrinsic Matrix (K): 这是相机的内参矩阵,包含焦距、主点等参数。它是相机坐标系到图像坐标系的映射。

  2. Rotation Matrix (R): 这是相机的旋转矩阵,描述了相机坐标系相对于世界坐标系的旋转。

  3. Translation Vector (T): 这是相机的平移向量,描述了相机坐标系相对于世界坐标系的平移。

结果:

        

        RQ 分解帮助将投影矩阵分解为内参矩阵和外参矩阵,从而可以深入了解相机的内部结构和其在世界坐标系中的位置。

4.1.4 计算照相机中心

        给定照相机投影矩阵 P,我们可以计算出空间上照相机的所在位置。照相机的中心 C,是一个三维点,满足约束 PC=0。对于投影矩阵为 P=K[R|t] 的照相机,有:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        K[R\mid t]\text{C}=K R\text{C}+Kt=0

        照相机的中心可以由下述式子来计算:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \mathbf{C}=-R^Tt

实验代码:

import numpy as npclass Camera:def __init__(self, R, t):"""初始化相机对象:param R: 旋转矩阵 (3x3):param t: 平移向量 (3,)"""self.R = Rself.t = tself.c = None  # 相机中心,初始化为 Nonedef factor(self):"""因子分解过程的占位符函数实际应用中应实现具体的因子分解"""passdef center(self):"""计算并返回照相机的中心"""if self.c is not None:return self.celse:# 通过因子分解计算 cself.factor()# 计算相机中心self.c = -np.dot(self.R.T, self.t)return self.c# 示例数据
R = np.array([[0.866, -0.5, 0],[0.5, 0.866, 0],[0, 0, 1]])t = np.array([1, 2, 3])# 创建相机对象并计算相机中心
camera = Camera(R, t)
center = camera.center()print("Camera Center (c):")
print(center)

分析:

  1. 相机对象初始化

    • 旋转矩阵 R 和平移向量 t 被初始化为示例值。
    • self.c 初始化为 None
  2. 计算相机中心

    • 当 center 方法首次调用时,self.c 为 None,调用 self.factor() 进行因子分解(此处为占位符,实际中应有具体实现)。
    • 使用公式 self.c = -np.dot(self.R.T, self.t) 计算相机中心。
    • np.dot(self.R.T, self.t) 计算旋转矩阵的转置与平移向量的点积,然后取其负值,得到相机在世界坐标系中的位置。
  3. 输出

    • 打印出计算得到的相机中心 self.c

结果:

        此结果表明,相机的世界坐标系中的中心位置为 (-0.866, -2.5, -3)。实际应用中,你会用真实的 Rt 值替换这些示例数据,以获得相机在真实场景中的位置。​​​​​​​

4.2 照相机标定

        标定照相机是指计算出该照相机的内参数。在我们的例子中,是指计算矩阵 K。如 果你的应用要求高精度,那么可以扩展该照相机模型 , 使其包含径向畸变和其他条件。

        4.2.1 一个简单的标定方法

        • 测量你选定矩形标定物体的边长 d X d Y
        • 将照相机和标定物体放置在平面上,使得照相机的背面和标定物体平行,同时物
体位于照相机图像视图的中心,你可能需要调整照相机或者物体来获得良好的对齐效果;
        • 测量标定物体到照相机的距离 d Z
        • 拍摄一副图像来检验该设置是否正确,即标定物体的边要和图像的行和列对齐;
        • 使用像素数来测量标定物体图像的宽度和高度 d x d y

4.3 以平面和标记物进行姿态估计

        我们使用一个例子来演示如何进行姿态估计。使用下面的代码来提取两幅图像的 SIFT 特征,然后使用 RANSAC 算法稳健地估计单应性矩阵:
假设已经有了一个已知的平面模型和标记物位置。
实验代码:
import cv2
import numpy as np
import glob# 设置棋盘格的行数和列数
chessboard_size = (9, 6)
# 设置棋盘格内每个小方块的实际尺寸(单位:米)
square_size = 0.025# 准备对象点,假设棋盘格上的点在Z轴上的位置为0
objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) * square_size# 用于存储3D点和2D点
objpoints = []
imgpoints = []# 读取所有棋盘格图像
images = glob.glob('calibration_images/*.jpg')for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 查找棋盘格角点ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)if ret:objpoints.append(objp)imgpoints.append(corners)# 绘制和显示角点cv2.drawChessboardCorners(img, chessboard_size, corners, ret)cv2.imshow('img', img)cv2.waitKey(500)cv2.destroyAllWindows()# 相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)# 测试图像进行姿态估计
test_img = cv2.imread('test_image.jpg')
gray_test = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray_test, chessboard_size, None)if ret:# 估计姿态retval, rvec, tvec = cv2.solvePnP(objp, corners, mtx, dist)# 绘制结果img_points, _ = cv2.projectPoints(np.array([[0, 0, 0], [0, square_size, 0], [square_size, square_size, 0], [square_size, 0, 0]], dtype=np.float32), rvec, tvec, mtx, dist)img_points = np.int32(img_points).reshape(-1, 2)cv2.polylines(test_img, [img_points[:4]], True, (0, 255, 0), 3)cv2.imshow('result', test_img)cv2.waitKey(0)cv2.destroyAllWindows()

分析:

  1. 标定过程

    • 读取多张棋盘格图片,并在每张图像中找到棋盘格的角点。
    • 使用这些角点计算相机的内参(焦距、主点等)和畸变系数。
  2. 姿态估计

    • 在测试图像中找到棋盘格的角点。
    • 使用 cv2.solvePnP 函数估计棋盘格的姿态,即相机相对于棋盘格的旋转向量和平移向量。
  3. 结果显示

    • 将估计的姿态结果投影到测试图像中,绘制出棋盘格的边界框

结果:

        通过这个实验代码和分析,我们可以了解到如何使用平面标记物(棋盘格)进行姿态估计。标定过程帮助我们获得相机的内参和畸变系数,而姿态估计过程则允许我们在新图像中确定标记物的位置和方向。这种技术在增强现实、机器人导航等领域有广泛的应用。

4.4 增强现实

        增强现实(Augmented RealityAR)是将物体和相应信息放置在图像数据上的一 系列操作的总称。最经典的例子是放置一个三维计算机图形学模型,使其看起来属 于该场景;如果在视频中,该模型会随着照相机的运动很自然地移动。

        4.4.1 PyGamePyOpenGL

        PyGame 是非常流行的游戏开发工具包,它可以非常简单地处理显示窗口、输入设
备、事件,以及其他内容。
        PyOpenGL 是 OpenGL 图形编程的 Python 绑定接口。 OpenGL 可以安装在几乎所
有的系统上,并且具有很好的图形性能。 OpenGL 具有跨平台性,能够在不同的操
作系统之间工作。
        需要对一个 OpenGL 场景进行两个部分的设置:投影和视图矩阵的建模。下面学习如何由针孔照相机来创建这些矩阵。

        4.4.2 从照相机矩阵到OpenGL格式

        要将标定好的照相机参数转换为 OpenGL 中的投影矩阵,可以使用以下步骤。首先,我们需要从照相机矩阵中提取投影矩阵的参数,然后将其转换为 OpenGL 可以接受的格式。以下是一个实验代码示例以及相关的分析和结果。

实验代码:
 

import numpy as npdef camera_matrix_to_opengl_projection_matrix(K, width, height):# 提取内参矩阵K中的参数fx = K[0, 0]fy = K[1, 1]cx = K[0, 2]cy = K[1, 2]# 计算 OpenGL 投影矩阵# 在 OpenGL 中,投影矩阵的标准形式是:# [ 2 / (right - left)  0                   0                           0                ]# [ 0                   2 / (top - bottom)   0                           0                ]# [ 0                   0                   - (far + near) / (far - near) - (2 * far * near) / (far - near) ]# [ 0                   0                   -1                          0                ]# 假设近平面和远平面near = 0.1far = 1000.0# 计算左、右、上、下边界left = -cx * near / fxright = (width - cx) * near / fxbottom = -cy * near / fytop = (height - cy) * near / fy# 计算 OpenGL 投影矩阵projection_matrix = np.array([[2 * near / (right - left), 0, 0, 0],[0, 2 * near / (top - bottom), 0, 0],[0, 0, - (far + near) / (far - near), - (2 * far * near) / (far - near)],[0, 0, -1, 0]])return projection_matrix# 示例标定矩阵K
K = np.array([[1000, 0, 320],[0, 1000, 240],[0, 0, 1]
])# 图像宽度和高度
width = 640
height = 480# 计算 OpenGL 投影矩阵
projection_matrix = camera_matrix_to_opengl_projection_matrix(K, width, height)
print("OpenGL 投影矩阵:")
print(projection_matrix)

分析:

  1. 提取内参: 从相机矩阵 KK 中提取焦距(fx, fy)和主点坐标(cx, cy)。
  2. 计算视口边界: 利用焦距和主点坐标计算 OpenGL 的视口边界(left, right, bottom, top),这些边界决定了投影矩阵的水平和垂直视野。
  3. 构造投影矩阵: 使用透视投影矩阵的标准形式,其中近平面(near)和远平面(far)设置为常见的值,这些值可以根据实际需要调整。

结果:

        输出的投影矩阵是 OpenGL 投影矩阵的标准形式,能够将相机坐标转换到裁剪空间。这段代码帮助你将相机内参矩阵 KK 转换为适用于 OpenGL 渲染的投影矩阵。​​​​​​​

4.4.3 在图像中放置虚拟物体

        为了在图像中放置虚拟物体,我们可以使用一种常见的计算机图形学方法,特别是利用透视投影来实现这一目标。在这里,我们将使用OpenGL作为示例来完成这个实验。OpenGL是一个广泛使用的图形库,它提供了许多功能来进行图形渲染和操作。

        以下是一个使用OpenGL绘制四边形并设置投影和视图矩阵的示例代码。该代码将展示如何在屏幕上放置一个四边形,并确保其坐标范围在 -1 到 1 之间。

实验代码:

import cv2
import numpy as np# 创建一个空白图像
image_width, image_height = 800, 600
image = np.zeros((image_height, image_width, 3), dtype=np.uint8)# 定义四边形的顶点
vertices = np.array([[100, 100],  # 顶点1[300, 100],  # 顶点2[300, 300],  # 顶点3[100, 300]   # 顶点4
], np.int32)# 绘制四边形
cv2.polylines(image, [vertices], isClosed=True, color=(0, 255, 0), thickness=2)# 将图像保存到文件
cv2.imwrite('quad_image.png', image)# 显示图像
cv2.imshow('Quad Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

分析:

  1. 创建图像: 使用 np.zeros 创建一个黑色的空白图像。
  2. 定义顶点: 通过 np.array 定义四边形的顶点。
  3. 绘制四边形: 使用 cv2.polylines 函数绘制四边形。
  4. 保存和显示图像: 使用 cv2.imwrite 保存图像,使用 cv2.imshow 显示图像。

结果:

4.4.4 综合集成

        在综合集成的实验中,我们可以结合使用 Python 的多个库来进行图形渲染和处理。下面的示例将展示如何在 Python 中使用 OpenGLPyOpenGL 来绘制一个四边形,并使用 Pygame 来创建窗口和处理用户输入。这种综合集成的实验可以帮助你理解如何在 2D 和 3D 环境中进行图形操作。

​​​​​​​        实验代码:

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *def draw_quad():glBegin(GL_QUADS)glVertex2f(-0.5, -0.5)  # 左下角glVertex2f(0.5, -0.5)  # 右下角glVertex2f(0.5, 0.5)  # 右上角glVertex2f(-0.5, 0.5)  # 左上角glEnd()def main():# 初始化 pygamepygame.init()display = (800, 600)pygame.display.set_mode(display, DOUBLEBUF | OPENGL)# 设置视口和投影glViewport(0, 0, display[0], display[1])glMatrixMode(GL_PROJECTION)glLoadIdentity()gluOrtho2D(-1, 1, -1, 1)glMatrixMode(GL_MODELVIEW)glLoadIdentity()# 主循环while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()quit()glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)draw_quad()pygame.display.flip()if __name__ == "__main__":main()

分析:

        

  1. 初始化:

    • 使用 pygame.init() 初始化 Pygame 库。
    • 使用 pygame.display.set_mode() 创建一个窗口,并设置为 OpenGL 渲染模式。
  2. 设置投影:

    • glViewport() 设置视口,以便将 OpenGL 渲染到窗口。
    • glMatrixMode(GL_PROJECTION) 和 glLoadIdentity() 重置投影矩阵。
    • gluOrtho2D(-1, 1, -1, 1) 设置正交投影,使得坐标范围在 -1 到 1 之间。
  3. 绘制四边形:

    • glBegin(GL_QUADS) 和 glEnd() 定义了一个四边形的四个顶点。
    • glVertex2f() 用于设置四边形的每个顶点的坐标。
  4. 主循环:

    • 使用 pygame.event.get() 处理事件,例如关闭窗口。
    • 使用 glClear() 清除缓冲区。
    • 调用 draw_quad() 绘制四边形。
    • 使用 pygame.display.flip() 刷新显示。

结果:

  1. 3D 图形: 如果需要绘制 3D 物体,可以调整 gluOrtho2D 为 gluPerspective,并相应地设置视图矩阵。
  2. 用户交互: 可以添加更多的用户交互功能,比如键盘或鼠标事件处理。
  3. 性能优化: 对于更复杂的场景和物体,可以使用更多的 OpenGL 功能来优化性能。


                                               

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

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

相关文章

2024结构振动与智能控制国际学术会议(ICSVIC 2024)

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网:https://ais.cn/u/vEbMBz提交检索:EI Compendex、IEEE Xplore、Scopus 三、大会介绍 四、出席嘉宾 五、征稿主题 如想"投稿…

Day 1 : 数据结构

引入 以张三为例:CEF不能同时举办。 数据的逻辑结构 数据结构是什么 研究计算机数据之间的关系 逻辑结构和存储结构及其操作 基本概念 数据 数据元素 逻辑结构 按前趋和后继数将逻辑结构分为:线性结构和非线性结构。 即:找前…

Activity的生命周期

目录 前言 Activity的生命周期 五种状态 生命周期相关方法 前言 Android中有着四大组件:Activity、Service、ContentProvider和BroadcastReceiver。本篇我们主要讲解的是Activity组件,它是安卓提供给用户与手机之间进行交互的界面 控件,那…

基于SSM的咖啡馆管理系统

基于SSM的咖啡馆管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisJSP工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 后台界面 摘要 在当前这个信息爆炸的时代,众多行业正经历着…

win10环境下gvim离线配置插件的一些补充

0 总述 在上一篇博客,即《Windows系统下使用gvim配置LaTeX快速书写环境》一文中,本小白试图模仿神级人物Gilles Castel,打造vim下的 LaTeX \LaTeX LATE​X书写环境。实话实说,东施效颦了。虽不至于一无所得,但也仅仅算…

UE5开发——射击武器类拾取

整体框架: 拾取武器 要在 Unreal Engine 5 (UE5) 中实现一个按 E 键拾取武器的功能,您可以遵循以下步骤: ### 步骤 1: 创建拾取物品的基础类 1. 在 Content Browser 中创建一个新的 C 类,继承自 AActor 或者 AStaticMeshActor。…

服务器间进行文件传输-SFTPSCP一篇搞定

1.简单介绍一下 在一些特殊场景,两台服务器之间需要进行文件传输的时候,或许我们会想到FTP,这也是我们常见的实现方式,但是如果我们不能操作远程服务器,无法判断远程服务器是否安装了FTP呢,众所周知&#…

在Web服务应用中,如何编程使用Redis的缓存功能?包括缓存页面内容、缓存数据库查询结果、用户会话信息等代码分享

目录 一、概述 二、redis介绍 1、简介 2、Redis作为缓存的原理 (1)内存存储 (2)数据结构 (3)工作原理 3、Redis作为缓存的作用 三、redis缓存页面内容 1、作用 2、实现方法 3、示例代码&#x…

原型与原型链

在JavaScript中,原型(prototype)和原型链(prototype chain)是理解对象如何继承属性和方法的关键概念。 原型 每一个对象(函数也是对象)都有一个特殊的属性叫做原型(prototype&…

k3s中使用GPU资源

前提是已经安装了nvidia驱动 一、安装nvidia-container-toolkit(推荐) #复制一份docker配置文件,以防被覆盖 cp /etc/docker/daemon.json /etc/docker/daemon.json.bak #安装NVIDIA Container Toolkitapt-get install nvidia-container-toolkit二、配置…

Linux和Unix的区别及为什么鸿蒙系统不用Unix的原因

目录 Linux是什么? Unix是什么? 他们的区别: 鸿蒙系统介绍及鸿蒙系统不用Unix的原因 Linux是什么? Linux的历史可以追溯到1991年,由芬兰的计算机科学家林纳斯托瓦兹(Linus Torvalds)为了学习操作系统的工作原理而…

海绵城市雨水监测系统

海绵城市雨水监测系统主要有:数据采集、无线数据传输、后台云服务、终端平台显示等部分组成。系统通过前端数据采集水质(ss\cod\浊度、PH等)、雨水雨量、流量、水位、土壤湿度、气象等数据。通过无线数据传输通讯(4G、5G、以太网、…

小柴带你学AutoSar系列三、标准和规范篇(3)ModeManagement

目录 ModeManagementGuide 2 Overall mechanisms and concepts 2.1 Declaration of modes 2.2 Mode managers and mode users 2.3 Modes in the RTE 2.4 Modes in the Basic Software Scheduler 2.5 Communication of modes 3 Configuration of the Basic Software Mod…

华为云征文|部署个人博客管理系统 Ghost

华为云征文|部署个人博客管理系统 Ghost 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 对比普通ECS 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Ghost3.1 Ghost 介绍3.2 Docker 环境搭建3.3 Ghost 部署3.4 Gho…

《数字信号处理》学习01-离散时间信号与序列的卷积和运算

目录 一,信号 二,序列的运算 1,卷积和 2,matlab实现 相关的电子书籍请到这篇文章所在的专栏,并通过夸克网盘链接下载。 很多简单的知识点我就不再赘述了,接下来就着重记录我学习过程中遇到的较难理…

Vue——day07之条件渲染、列表渲染以及监测数据

目录 1.template标签 2.条件渲染 3.列表渲染 4.v-for中的key的作用以及原理 5.列表过滤 placeholder 前端空字符串 使用数据监视watch实现 使用计算属性实现 6.列表排序 7.Vue更新数据检测失败 原因 总结 1.template标签 template标签是Vue.js中的一个特殊元素&am…

新型蜜罐有哪些?未来方向如何?

前言:技术发展为时代带来变革,同时技术创新性对蜜罐产生推动力。 一、新型蜜罐的诞生 技术发展为时代带来变革,同时技术创新性对蜜罐产生推动力,通过借鉴不同技术思想、方法,与其它技术结合形成优势互补,…

MC药水酿造

药水酿造(Brewing)是在酿造台中往水瓶里加入各种材料而制作药水、喷溅药水和滞留药水的过程。 将1-3个水瓶或药水放入酿造台界面底部的药水槽中,将材料放入顶部的材料槽中,再在燃料槽里放置烈焰粉,便可开始酿造。 药水的酿造一般从水瓶开始,水瓶可以用玻璃瓶从水源或

探讨抗晃电应用技术在煤化工生产中的运用

摘要:当前,电力供应面临的压力日益增大,用户群体的多样性也日益复杂。在电网运行中,电压波动(晃电)现象频繁发生。研究指出,电压波动的原因多种多样,包括自然因素、设备故障以及人为…

EXO项目StandardNode;max_generate_tokens;buffered_token_output;is_finished;

目录 StandardNode max_generate_tokens buffered_token_output 构造函数参数 类属性 总结 is_finished max_generate_tokens self.buffered_token_output StandardNode _process_tensor result是一个np.ndarray ,result.size == 1是什么意思 StandardNode max_g…