Open3d之网格(Mesh)操作
网格
open3d有一种被称为TriangleMesh的3D三角网格的数据结构。下面的代码展示了如何从一个ply文件读取三角网格数据并打印它的顶点和三角形。
# -*-coding:utf-8 -*-
import copy
import numpy as np
import open3d as o3d# 加载三角网格
mesh = o3d.io.read_triangle_mesh("/home/ancy/PycharmProjects/learn/Open3D/examples/test_data/knot.ply")
# 打印网格信息
print(mesh)
# 打印网格定点信息
print('Vertices:')
print(np.asarray(mesh.vertices))
# 打印网格的三角形
print('Triangles:')
print(np.asarray(mesh.triangles))
TriangleMesh类是类有一些数据字段,例如vertices和triangles。Open3D通过numpy提供对这些字段的直接内存访问。
可视化3D网格
print("尝试使用法线 (存在: " + str(mesh.has_vertex_normals()) +") 和颜色 (exist: " + str(mesh.has_vertex_colors()) + ")去渲染网格")
# 因为网格不存在法线和颜色故看起来不美观
o3d.visualization.draw_geometries([mesh])
你可以旋转和移动这个网格,但是由于它是纯灰色的所以看起来不是并不像一个3D图形。这是因为当前网格没有顶点或面的法线,所以使用统一颜色着色而不是用更复杂的Phong着色(冯氏着色)。
表面法线估计
# 计算顶点的法线
mesh.compute_vertex_normals()
# 打印法线信息
print(np.asarray(mesh.triangle_normals))
# 可视化网格
o3d.visualization.draw_geometries([mesh])
裁剪网格
通过numpy直接操作网格的triangle和triangle_normals字段去除一半的曲面。
# 只取前半个三角形网格
mesh1 = copy.deepcopy(mesh)
mesh1.triangles = o3d.utility.Vector3iVector(np.asarray(mesh1.triangles)[:len(mesh1.triangles) // 2, :])
mesh1.triangle_normals = o3d.utility.Vector3dVector(np.asarray(mesh1.triangle_normals)[:len(mesh1.triangle_normals) // 2, :])
# 打印三角形信息
print(mesh1.triangles)
# 可视化
o3d.visualization.draw_geometries([mesh1])
网格上色
网格的上色和点云的上色是一致的, 使用paint_uniform_color给网格涂上统一的颜色,颜色在[0,1]范围的RGB空间中。
# 给网格上色
mesh1.paint_uniform_color([1, 0.706, 0])
# 可视化网格
o3d.visualization.draw_geometries([mesh1])
网格属性
def edges_to_lineset(mesh, edges, color):"""将边缘转为线集"""ls = o3d.geometry.LineSet()ls.points = mesh.verticesls.lines = edgescolors = np.empty((np.asarray(edges).shape[0], 3))colors[:] = colorls.colors = o3d.utility.Vector3dVector(colors)return lsdef check_properties(name, mesh):# 计算顶点法线mesh.compute_vertex_normals()# 是否为边缘流形(考虑边界)edge_manifold = mesh.is_edge_manifold(allow_boundary_edges=True)# 是否为边缘流形(不考虑边界)edge_manifold_boundary = mesh.is_edge_manifold(allow_boundary_edges=False)# 是否为所有顶点是否为流形vertex_manifold = mesh.is_vertex_manifold()# 是否为自相交网格self_intersecting = mesh.is_self_intersecting()# 是否为水密网格watertight = mesh.is_watertight()# 是否为可定向的网格orientable = mesh.is_orientable()print(name)print(f" edge_manifold: {edge_manifold}")print(f" edge_manifold_boundary: {edge_manifold_boundary}")print(f" vertex_manifold: {vertex_manifold}")print(f" self_intersecting: {self_intersecting}")print(f" watertight: {watertight}")print(f" orientable: {orientable}")geoms = [mesh]# 获取非边缘流形几何(考虑边界)if not edge_manifold:edges = mesh.get_non_manifold_edges(allow_boundary_edges=True)geoms.append(edges_to_lineset(mesh, edges, (1, 0, 0)))# 获取非边缘流形几何(不考虑边界)if not edge_manifold_boundary:edges = mesh.get_non_manifold_edges(allow_boundary_edges=False)geoms.append(edges_to_lineset(mesh, edges, (0, 1, 0)))# 获取非顶点流形if not vertex_manifold:verts = np.asarray(mesh.get_non_manifold_vertices())pcl = o3d.geometry.PointCloud(points=o3d.utility.Vector3dVector(np.asarray(mesh.vertices)[verts]))pcl.paint_uniform_color((0, 0, 1))geoms.append(pcl)# 自相交网格if self_intersecting:intersecting_triangles = np.asarray(mesh.get_self_intersecting_triangles())intersecting_triangles = intersecting_triangles[0:1]intersecting_triangles = np.unique(intersecting_triangles)print(" # visualize self-intersecting triangles")triangles = np.asarray(mesh.triangles)[intersecting_triangles]edges = [np.vstack((triangles[:, i], triangles[:, j]))for i, j in [(0, 1), (1, 2), (2, 0)]]edges = np.hstack(edges).Tedges = o3d.utility.Vector2iVector(edges)geoms.append(edges_to_lineset(mesh, edges, (1, 0, 1)))o3d.visualization.draw_geometries(geoms, mesh_show_back_face=True)
def edges_to_lineset(mesh, edges, color):"""将边缘转为线集"""ls = o3d.geometry.LineSet()ls.points = mesh.verticesls.lines = edgescolors = np.empty((np.asarray(edges).shape[0], 3))colors[:] = colorls.colors = o3d.utility.Vector3dVector(colors)return lsdef check_properties(name, mesh):# 计算顶点法线mesh.compute_vertex_normals()# 是否为边缘流形(考虑边界)edge_manifold = mesh.is_edge_manifold(allow_boundary_edges=True)# 是否为边缘流形(不考虑边界)edge_manifold_boundary = mesh.is_edge_manifold(allow_boundary_edges=False)# 是否为所有顶点是否为流形vertex_manifold = mesh.is_vertex_manifold()# 是否为自相交网格self_intersecting = mesh.is_self_intersecting()# 是否为水密网格watertight = mesh.is_watertight()# 是否为可定向的网格orientable = mesh.is_orientable()print(name)print(f" edge_manifold: {edge_manifold}")print(f" edge_manifold_boundary: {edge_manifold_boundary}")print(f" vertex_manifold: {vertex_manifold}")print(f" self_intersecting: {self_intersecting}")print(f" watertight: {watertight}")print(f" orientable: {orientable}")geoms = [mesh]# 获取非边缘流形几何(考虑边界)if not edge_manifold:edges = mesh.get_non_manifold_edges(allow_boundary_edges=True)geoms.append(edges_to_lineset(mesh, edges, (1, 0, 0)))# 获取非边缘流形几何(不考虑边界)if not edge_manifold_boundary:edges = mesh.get_non_manifold_edges(allow_boundary_edges=False)geoms.append(edges_to_lineset(mesh, edges, (0, 1, 0)))# 获取非顶点流形if not vertex_manifold:verts = np.asarray(mesh.get_non_manifold_vertices())pcl = o3d.geometry.PointCloud(points=o3d.utility.Vector3dVector(np.asarray(mesh.vertices)[verts]))pcl.paint_uniform_color((0, 0, 1))geoms.append(pcl)# 自相交网格if self_intersecting:intersecting_triangles = np.asarray(mesh.get_self_intersecting_triangles())intersecting_triangles = intersecting_triangles[0:1]intersecting_triangles = np.unique(intersecting_triangles)print(" # visualize self-intersecting triangles")triangles = np.asarray(mesh.triangles)[intersecting_triangles]edges = [np.vstack((triangles[:, i], triangles[:, j]))for i, j in [(0, 1), (1, 2), (2, 0)]]edges = np.hstack(edges).Tedges = o3d.utility.Vector2iVector(edges)geoms.append(edges_to_lineset(mesh, edges, (1, 0, 1)))o3d.visualization.draw_geometries(geoms, mesh_show_back_face=True)def get_non_manifold_edge_mesh():verts = np.array([[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [0, 0, 1]],dtype=np.float64,)triangles = np.array([[0, 1, 3], [1, 2, 3], [1, 3, 4]])mesh = o3d.geometry.TriangleMesh()mesh.vertices = o3d.utility.Vector3dVector(verts)mesh.triangles = o3d.utility.Vector3iVector(triangles)mesh.compute_vertex_normals()mesh.rotate(mesh.get_rotation_matrix_from_xyz((np.pi / 4, 0, np.pi / 4)),center=mesh.get_center(),)return meshdef get_non_manifold_vertex_mesh():verts = np.array([[-1, 0, -1],[1, 0, -1],[0, 1, -1],[0, 0, 0],[-1, 0, 1],[1, 0, 1],[0, 1, 1],],dtype=np.float64,)triangles = np.array([[0, 1, 2],[0, 1, 3],[1, 2, 3],[2, 0, 3],[4, 5, 6],[4, 5, 3],[5, 6, 3],[4, 6, 3],])mesh = o3d.geometry.TriangleMesh()mesh.vertices = o3d.utility.Vector3dVector(verts)mesh.triangles = o3d.utility.Vector3iVector(triangles)mesh.compute_vertex_normals()mesh.rotate(mesh.get_rotation_matrix_from_xyz((np.pi / 4, 0, np.pi / 4)),center=mesh.get_center(),)return meshdef get_open_box_mesh():mesh = o3d.geometry.TriangleMesh.create_box()mesh.triangles = o3d.utility.Vector3iVector(np.asarray(mesh.triangles)[:-2])mesh.compute_vertex_normals()mesh.rotate(mesh.get_rotation_matrix_from_xyz((0.8 * np.pi, 0, 0.66 * np.pi)),center=mesh.get_center(),)return meshdef get_intersecting_boxes_mesh():mesh0 = o3d.geometry.TriangleMesh.create_box()T = np.eye(4)T[:, 3] += (0.5, 0.5, 0.5, 0)mesh1 = o3d.geometry.TriangleMesh.create_box()mesh1.transform(T)mesh = mesh0 + mesh1mesh.compute_vertex_normals()mesh.rotate(mesh.get_rotation_matrix_from_xyz((0.7 * np.pi, 0, 0.6 * np.pi)),center=mesh.get_center(),)return meshcheck_properties('Knot', mesh)
check_properties('Moebius', o3d.geometry.TriangleMesh.create_moebius(twists=1))
check_properties("non-manifold edge", get_non_manifold_edge_mesh())
check_properties("non-manifold vertex", get_non_manifold_vertex_mesh())
check_properties("open box", get_open_box_mesh())
check_properties("intersecting_boxes", get_intersecting_boxes_mesh())
网格滤波
Open3d包含许多网格滤波的算法。接下来我们将会展示相关的一些滤波接口。
均值滤波
最简单的是均值滤波。给定的顶点由相邻顶点的平均值N给出的。公式如下:
可以使用此过滤器对网格进行降噪,如下面的代码所。filter_smooth_simple函数的参数number_of_iterations用来定义应用于网格的滤波器的频率。
# 创建具有噪声的网格
mesh_in = copy.deepcopy(mesh)
vertices = np.asarray(mesh_in.vertices)
noise = 5
vertices += np.random.uniform(0, noise, size=vertices.shape)
mesh_in.vertices = o3d.utility.Vector3dVector(vertices)
mesh_in.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_in])# 使用均值滤波迭代1次
mesh_out = mesh_in.filter_smooth_simple(number_of_iterations=1)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out])# 使用均值滤波迭代5次
mesh_out = mesh_in.filter_smooth_simple(number_of_iterations=5)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out])
一次滤波迭代之后
五次迭代后
拉普拉斯算子(Laplacian)
其中λ是滤波器的强度,是与相邻顶点的距离相关的归一化权重. 这个滤波器的接口是filter_smooth_laplacian,有两个参数: number_of_iterations 和 lambda。
# 使用拉普拉斯滤波迭代10次
mesh_out = mesh_in.filter_smooth_laplacian(number_of_iterations=10)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out])# 使用拉普拉斯滤波迭代50次
mesh_out = mesh_in.filter_smooth_laplacian(number_of_iterations=50)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out])
使用拉普拉斯滤波迭代10次
使用拉普拉斯滤波迭代50次
Taubin滤波
# 使用taubin滤波迭代10次
mesh_out = mesh_in.filter_smooth_taubin(number_of_iterations=10)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out])# 使用taubin滤波迭代100次
mesh_out = mesh_in.filter_smooth_taubin(number_of_iterations=100)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out])
使用taubin滤波迭代10次
使用taubin滤波迭代100次
采样
mesh = o3d.geometry.TriangleMesh.create_sphere()
mesh.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh])
pcd = mesh.sample_points_uniformly(number_of_points=500)
o3d.visualization.draw_geometries([pcd])
o3d.visualization.draw_geometries([mesh])
pcd = mesh.sample_points_uniformly(number_of_points=500)
o3d.visualization.draw_geometries([pcd])
- 默认通过参数init_factor:首先通过init_factor x number_of_points来从网格中均匀采样点云,之后进行消除。
- 可以直接提供一个点云数据给sample_points_poisson_disk函数,之后会进行点云的消除。
mesh = o3d.geometry.TriangleMesh.create_sphere()
pcd = mesh.sample_points_poisson_disk(number_of_points=500, init_factor=5)
o3d.visualization.draw_geometries([pcd])pcd = mesh.sample_points_uniformly(number_of_points=2500)
pcd = mesh.sample_points_poisson_disk(number_of_points=500, pcl=pcd)
o3d.visualization.draw_geometries([pcd])~
mesh = o3dtut.get_bunny_mesh()
pcd = mesh.sample_points_poisson_disk(number_of_points=500, init_factor=5)
o3d.visualization.draw_geometries([pcd])pcd = mesh.sample_points_uniformly(number_of_points=2500)
pcd = mesh.sample_points_poisson_disk(number_of_points=500, pcl=pcd)
o3d.visualization.draw_geometries([pcd])
网格细分
mesh = o3d.geometry.TriangleMesh.create_box()
mesh.compute_vertex_normals()
print(f'The mesh has {len(mesh.vertices)} vertices and {len(mesh.triangles)} triangles')
o3d.visualization.draw_geometries([mesh], zoom=0.8, mesh_show_wireframe=True)
mesh = mesh.subdivide_midpoint(number_of_iterations=1)
print(f'After subdivision it has {len(mesh.vertices)} vertices and {len(mesh.triangles)} triangles')
o3d.visualization.draw_geometries([mesh], zoom=0.8, mesh_show_wireframe=True)
The mesh has 8 vertices and 12 triangles
After subdivision it has 26 vertices and 48 triangles
Open3d实现了基于[Loop1987]的附加细分方法。该方法基于四次样条曲线,该样条曲线除了在特殊顶点处生成连续的极限曲面外,其他地方都生成
连续的极限曲面。这样可以得到更加平滑的拐角。
mesh = o3d.geometry.TriangleMesh.create_sphere()
mesh.compute_vertex_normals()
print(f'The mesh has {len(mesh.vertices)} vertices and {len(mesh.triangles)} triangles')
o3d.visualization.draw_geometries([mesh], zoom=0.8, mesh_show_wireframe=True)
mesh = mesh.subdivide_loop(number_of_iterations=2)
print(f'After subdivision it has {len(mesh.vertices)} vertices and {len(mesh.triangles)} triangles')
o3d.visualization.draw_geometries([mesh], zoom=0.8, mesh_show_wireframe=True)
The mesh has 762 vertices and 1520 triangles
After subdivision it has 12162 vertices and 24320 triangles
mesh = o3dtut.get_knot_mesh()
mesh.compute_vertex_normals()
print(f'The mesh has {len(mesh.vertices)} vertices and {len(mesh.triangles)} triangles')
o3d.visualization.draw_geometries([mesh], zoom=0.8, mesh_show_wireframe=True)
mesh = mesh.subdivide_loop(number_of_iterations=1)
print(f'After subdivision it has {len(mesh.vertices)} vertices and {len(mesh.triangles)} triangles')
o3d.visualization.draw_geometries([mesh], zoom=0.8, mesh_show_wireframe=True)
The mesh has 1440 vertices and 2880 triangles
After subdivision it has 5760 vertices and 11520 triangles
.
网格简化
有时候我们想用较少的三角形来表示一个高分辨率的网格,但是低分辨率的网格仍然应该接近高分辨率的网格。为此Open3D实现了许多网格简化的算法。
顶点聚类
mesh_in = o3dtut.get_bunny_mesh()
print(f'Input mesh has {len(mesh_in.vertices)} vertices and {len(mesh_in.triangles)} triangles')
o3d.visualization.draw_geometries([mesh_in])voxel_size = max(mesh_in.get_max_bound() - mesh_in.get_min_bound()) / 32
print(f'voxel_size = {voxel_size:e}')
mesh_smp = mesh_in.simplify_vertex_clustering(voxel_size=voxel_size,contraction=o3d.geometry.SimplificationContraction.Average)
print(f'Simplified mesh has {len(mesh_smp.vertices)} vertices and {len(mesh_smp.triangles)} triangles')
o3d.visualization.draw_geometries([mesh_smp])voxel_size = max(mesh_in.get_max_bound() - mesh_in.get_min_bound()) / 16
print(f'voxel_size = {voxel_size:e}')
mesh_smp = mesh_in.simplify_vertex_clustering(voxel_size=voxel_size,contraction=o3d.geometry.SimplificationContraction.Average)
print(f'Simplified mesh has {len(mesh_smp.vertices)} vertices and {len(mesh_smp.triangles)} triangles')
o3d.visualization.draw_geometries([mesh_smp])
Input mesh has 35947 vertices and 69451 triangles
voxel_size = 4.865594e-03
Simplified mesh has 3222 vertices and 6454 triangles
voxel_size = 9.731187e-03
Simplified mesh has 845 vertices and 1724 triangles
网格抽取
mesh_smp = mesh_in.simplify_quadric_decimation(target_number_of_triangles=6500)
print(f'Simplified mesh has {len(mesh_smp.vertices)} vertices and {len(mesh_smp.triangles)} triangles')
o3d.visualization.draw_geometries([mesh_smp])mesh_smp = mesh_in.simplify_quadric_decimation(target_number_of_triangles=1700)
print(f'Simplified mesh has {len(mesh_smp.vertices)} vertices and {len(mesh_smp.triangles)} triangles')
o3d.visualization.draw_geometries([mesh_smp])
Simplified mesh has 4409 vertices and 6500 triangles
Simplified mesh has 1982 vertices and 1700 triangles
连通分量
# 生成数据
mesh = o3dtut.get_bunny_mesh().subdivide_midpoint(number_of_iterations=2)
vert = np.asarray(mesh.vertices)
min_vert, max_vert = vert.min(axis=0), vert.max(axis=0)
for _ in range(30):cube = o3d.geometry.TriangleMesh.create_box()cube.scale(0.005, center=cube.get_center())cube.translate((np.random.uniform(min_vert[0], max_vert[0]),np.random.uniform(min_vert[1], max_vert[1]),np.random.uniform(min_vert[2], max_vert[2]),),relative=False,)mesh += cube
mesh.compute_vertex_normals()
# 显示输入网格
o3d.visualization.draw_geometries([mesh])
print("Cluster connected triangles")
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:triangle_clusters, cluster_n_triangles, cluster_area = (mesh.cluster_connected_triangles())
triangle_clusters = np.asarray(triangle_clusters)
cluster_n_triangles = np.asarray(cluster_n_triangles)
cluster_area = np.asarray(cluster_area)
# 删除小的连通分量
mesh_0 = copy.deepcopy(mesh)
triangles_to_remove = cluster_n_triangles[triangle_clusters] < 100
mesh_0.remove_triangles_by_mask(triangles_to_remove)
o3d.visualization.draw_geometries([mesh_0])
# 显示最大的连通分量
mesh_1 = copy.deepcopy(mesh)
largest_cluster_idx = cluster_n_triangles.argmax()
triangles_to_remove = triangle_clusters != largest_cluster_idx
mesh_1.remove_triangles_by_mask(triangles_to_remove)
o3d.visualization.draw_geometries([mesh_1])
Open3d之网格(Mesh)操作相关推荐
- Open3d(三)——网格数据操作
亲测代码程序可运行使用,open3d版本0.13.0. open3d数据资源下载:GitHub - Cobotic/Open3D: Open3D: A Modern Library for 3D Da ...
- OpenCascade源码分析之BRepMesh_IncrementalMesh(网格离散化操作)
OpenCascade源码分析之BRepMesh_IncrementalMesh(网格离散化操作) 一.引言 在使用opencascade读取连续曲面模型的时候,一般来说我们都会调用BRepMesh_ ...
- opengl网格mesh
和材质和网格(Mesh)一样,所有的场景/模型数据都包含在Scene对象中.Scene对象也包含了场景根节点的引用. 场景的Root node(根节点)可能包含子节点(和其它的节点一样),它会有一系列 ...
- 【MATLAB】三维图形绘制 ( 三维平面图 | 二维网格 | meshgrid 函数 | 绘制网格 | mesh 函授 | 绘制平面 | surf 函数 | 绘制等高线 | contour 函数 )
文章目录 一.二维网格 1.线图 与 平面图 2.meshgrid 函数生成二维网格 二.绘制网格 1.mesh 函数绘制网格 2.代码示例 三.绘制平面 1.surf 函数绘制平面 2.代码示例 四 ...
- OpenGL 网格Mesh
OpenGL 网格Mesh 网格Mesh简介 初始化 渲染 网格Mesh简介 通过使用Assimp,我们可以加载不同的模型到程序中,但是载入后它们都被储存为Assimp的数据结构.我们最终仍要将这些数 ...
- D3D中的网格(Mesh)
该教程基于DirectX 8.0 Graphics, 一部分内容由DirectX 8.0 SDK 英文文档翻译而来,一部分是自己工作经验的总结,作者对此享有著作权,读者可任意拷贝和传播,但不包含商业的 ...
- 【Shader】网格 Mesh
Mesh 1. 网格 Mesh 2. Mesh的组成 2.1 Vertex Data 2.2 Topology 2.3 Index data 1. 网格 Mesh Mesh指的就是模型的网格,它决定物 ...
- Open3d之网格变形
如果我们想使用少量的约束使得三角网格变形,得使用相应的网格变形算法.Open3d实现了[SorkineAndAlexa2007] 中的尽可能严格的算法,该方法优化了以下能量函数: 这里的表示 我们要优 ...
- Silvaco TCAD仿真8——网格mesh的意义(举例说明)
离子注入形成的掺杂分布,不同网格密度产生的效果 网格点稀疏 #启功工艺仿真器 go athena#定义网格 # x:0-1,间距是1.即x方向有1个网格点. # y:0-5,间距是0.1.即y方向有 ...
最新文章
- [笔记].关于Nios II的数据类型的一点想法
- python自动化办公都能做什么菜-python接口自动化
- mysql支持asp.net_关于Mysql + asp.net注射能支持多语句的感慨(2月)
- 北大清华的状元之争:一个典型的囚徒困境
- shell脚本之从1加到100之和的思路
- 用幼儿园所学拆解美国总统网络安全行政令(含软件供应链安全)
- @vue/cli 3.0 eslint 转成tslint
- 流媒体服务器搭建详解
- Git 报错fatal: not a git repository (or any parent up to mount point /) Stopping at filesystem bounda
- 最少钱币数-1-贪心算法(错,或者叫有问题)-CCF-CSP练习题(50)
- 89c51汇编语言流水灯,汇编语言流水灯
- 网页上使用按键代替鼠标点击按钮
- 江苏计算机二级msoffice高级应用,计算机二级考试MSOffice高级应用
- Python爬取并分析IMDB电影
- 【Unity】项目源码——2D横版过关类游戏《A_Standard_Runner》
- linux下qt打印功能如何实现,Qt Graphics-View的打印功能实现
- 学习自我管理和自我营销
- 【Git】分支概念及操作
- 树莓派学习笔记——定时向yeelink上传树莓派CPU温度
- 2021-07-08操作系统知识:程序计数器(pc)、指令寄存器(IR)、通用寄存器(GR)、状态寄存器(SR)、程序状态字PSW
热门文章
- 关于Jbulder2006的问题
- 计算机网络原理应用题/计算题
- Nginx 核心架构设计
- 本地上传文件到FastDFS命令上传报错:ERROR - file: connection_pool.c, line: 142, connect to server 192.168.0.197:221
- 在oracle中 生成大规模数据 500万条 (使用导入数据方式 sqlldr 导入命令 *.ctl文件)
- 【Oracle】设置快速恢复区及reset快速恢复区
- 【Linux】七种文件类型
- 微信小程序获取windowHeight出现不同页面高度不一致问题及解决方案
- JWT跨域身份验证解决方案
- js中改变原数组的方法以及解决改变原数组的方法