verts,_,_,_=measure.marching_cubes(root_stack,0) lengths=measure.mesh_edges(verts)如何修改

时间: 2024-02-27 10:51:39 浏览: 25
`measure.marching_cubes`函数返回的是一个包含顶点、三角形索引等信息的元组,因此你可以直接使用元组中的顶点信息计算网格的边数。以下是修改后的代码示例: ``` import skimage.measure as measure verts, faces, _, _ = measure.marching_cubes(root_stack, 0) num_edges = len(faces) # faces存储了三角形索引信息,因此它的长度即为网格的边数 print(num_edges) ``` 注意,此处计算的是三角形网格的边数。如果你需要计算其他类型的网格边数,可以使用相应的计算方式。例如,对于四边形网格,可以将`faces`视为四边形索引,计算其长度并乘以4得到网格边数。
相关问题

verts,_,_,_=measure.marching_cubes_lewiner(root_stack,0) lengths=measure.mesh_edges(verts)如何修改

`measure.marching_cubes_lewiner`函数同样返回一个包含顶点、三角形索引等信息的元组,因此你可以直接使用元组中的顶点信息计算网格的边数。以下是修改后的代码示例: ``` import skimage.measure as measure verts, faces, _, _ = measure.marching_cubes_lewiner(root_stack, 0) num_edges = len(faces) # faces存储了三角形索引信息,因此它的长度即为网格的边数 print(num_edges) ``` 同样需要注意,此处计算的是三角形网格的边数。如果你需要计算其他类型的网格边数,可以使用相应的计算方式。

输入图像为二值图像提取出来的骨架图像,程序运行提示ValueError: Input volume should be a 3D numpy array.,img = cv2.imread('gaussian.bmp', cv2.IMREAD_GRAYSCALE) # 提取骨架线 skeleton = cv2.ximgproc.thinning(img) # 获取骨架线路径 contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] # 确定骨架线的宽度 width = 2 # 将骨架线离散化为一系列点 skeleton_points = [] for i in range(len(cnt) - 1): p1 = cnt[i][0] p2 = cnt[i + 1][0] rr, cc = line_nd(p1, p2) for j in range(len(rr)): skeleton_points.append([rr[j], cc[j], width]) skeleton_points = np.array(skeleton_points) # 使用Marching Cubes算法进行三维重建 verts, faces, _, _ = measure.marching_cubes(skeleton_points, 0.1) # 绘制三维模型 fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='jet')

根据你的代码,`measure.marching_cubes`函数的输入应该是一个三维的NumPy数组。但是,你的代码中并没有对骨架线图像进行任何的三维处理,所以它不是一个三维的NumPy数组。 如果你想对二维图像进行三维重建,你需要将二维图像转换为三维的形式。一种简单的方法是将二维图像沿着Z轴进行堆叠,得到一个三维的数据集。你可以使用NumPy的`stack`函数来实现这个操作,例如: ``` img = cv2.imread('gaussian.bmp', cv2.IMREAD_GRAYSCALE) skeleton = cv2.ximgproc.thinning(img) contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] width = 2 # 将二维骨架图沿着Z轴堆叠,得到一个三维数组 skeleton_3d = np.zeros((skeleton.shape[0], skeleton.shape[1], 10), dtype=np.uint8) for i in range(10): skeleton_3d[:, :, i] = skeleton # 获取骨架线路径 skeleton_points = [] for i in range(len(cnt) - 1): p1 = cnt[i][0] p2 = cnt[i + 1][0] rr, cc, zz = line_nd(p1 + (0,), p2 + (9,)) for j in range(len(rr)): skeleton_points.append([rr[j], cc[j], zz[j], width]) skeleton_points = np.array(skeleton_points) # 使用Marching Cubes算法进行三维重建 verts, faces, _, _ = measure.marching_cubes(skeleton_3d, 0.1) # 绘制三维模型 fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='jet') ``` 在上面的代码中,我首先将二维的骨架图像`skeleton`沿着Z轴堆叠了10层,得到一个三维的数组`skeleton_3d`。注意,这里我假设了你的输入图像高度为10,如果不是,请将10改为合适的值。然后,我对`skeleton_3d`数组进行了三维重建,得到了`verts`和`faces`。最后,我使用Matplotlib库绘制了三维模型。 需要注意的是,由于我在`skeleton_points`数组中加入了第四个元素,表示骨架线的宽度,所以在`marching_cubes`函数中的第二个参数应该是一个小于1的浮点数,例如0.1。另外,在对二维骨架图进行离散化时,我使用了`(0,)`和`(9,)`来给p1和p2添加了一个Z坐标,这个坐标的取值范围是0到9,对应着`skeleton_3d`数组的第三个维度的取值范围。

相关推荐

for (int camera_index = 0; camera_index < this->m_safe_camera_list.size(); ++camera_index) { camera* cam = &(this->m_safe_camera_list[camera_index]); if (cam->m_is_exter_calib_check_mark == true) { // as a Internal reference K of the camera, the K-1 is : // 1/ax 0 -px/ax // 0 1/ay -py/ay // 0 0 1 Eigen::Matrix3f invk; invk.setIdentity(); invk(0, 0) = 1.0 / cam->m_inter_calib(0, 0); invk(0, 2) = -1.0 * cam->m_inter_calib(0, 2) / cam->m_inter_calib(0, 0); invk(1, 1) = 1.0 / cam->m_inter_calib(1, 1); invk(1, 2) = -1.0 * cam->m_inter_calib(1, 2) / cam->m_inter_calib(1, 1); Eigen::Vector3f tmp_t_verts = cam->m_exter_calib.topRightCorner(3, 1); Eigen::Matrix3f tmp_inv_r_mat= cam->m_exter_calib.topLeftCorner(3, 3).transpose(); Eigen::Vector3f tmp_root_point = -tmp_inv_r_mat * tmp_t_verts; for (int pose_index = 0; pose_index < cam->m_2D_pose_list.size(); ++pose_index) { Eigen::MatrixXf pose = cam->m_2D_pose_list[pose_index]; // check the pose's Confidence, if all the joints's confidiance is smaller than the gain, drop out float confidence = pose.row(2).maxCoeff(); if (confidence < this->m_joint_confidence_gian) { continue; }; my_radials tmpradials; tmpradials.m_2d_pose = pose; tmpradials.m_root_point = tmp_root_point; tmpradials.m_radials_points = (invk * pose.topRows(2).colwise().homogeneous()).colwise().normalized(); tmpradials.m_radials_points = tmp_inv_r_mat * tmpradials.m_radials_points; tmpradials.m_3d_pose_ID = -1; tmpradials.m_camera_index = camera_index; tmpradials.m_poes_index = pose_index; tmpradials.m_pose_confidence = pose.row(2).leftCols(7).sum(); this->m_3d_radials.push_back(tmpradials); } } }

最新推荐

recommend-type

nodejs-x64-0.10.21.tgz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

node-v4.1.1-linux-armv6l.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这
recommend-type

python中从Excel中取的列没有了0

可能是因为Excel中的列被格式化为数字,而数字前导的0被省略了。可以在Excel中将列的格式更改为文本,这样就会保留数字前导的0。另外,在Python中读取Excel时,可以将列的数据类型指定为字符串,这样就可以保留数字前导的0。例如: ```python import pandas as pd # 读取Excel文件 df = pd.read_excel('data.xlsx', dtype={'列名': str}) # 输出列数据 print(df['列名']) ``` 其中,`dtype={'列名': str}`表示将列名为“列名”的列的数据类型指定为字符串。