1.简介

Open3D:一个用于3D数据处理的现代库

Open3D是一个开源库,支持处理3D数据的软件的快速开发。Open3D前端在c++和Python中公开了一组精心选择的数据结构和算法。后端经过高度优化,并设置为并行化。我们欢迎来自开源社区的贡献。

  • Open3D的核心功能包括:
  • 三维数据结构
  • 三维数据处理算法
  • 现场重建
  • 表面对齐
  • 三维可视化
  • 物理渲染(PBR)
  • 3D机器学习支持PyTorch和TensorFlow
  • GPU加速核心3D操作
  • c++和Python版本可用

官方:Open3D: A Modern Library for 3D Data Processing — Open3D 0.15.1 documentation

2. 从python开始,深度图转点云

2.1 安装

安装系统ubuntu,mac win10都支持

conda create -n open3d python=3.7
activate open3d -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装
pip install open3d
# 验证
python -c "import open3d as o3d; print(o3d.__version__)"

测试可视化一个球:test3d.py

import open3d as o3d
mesh = o3d.geometry.TriangleMesh.create_sphere()mesh.compute_vertex_normals()
o3d.visualization.draw(mesh, raw_mode=True)

2.2可视化人脸点云

OPEN3D支持各种格式的3d文件,pcd,ply等

import pandas as pd
import numpy as np
import open3d as o3d
#ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud("./face.ply")
#pcd = o3d.io.read_point_cloud("./my_points.txt", format='xyz')
#pcd = o3d.io.read_point_cloud("./face.pcd")
print(pcd)
print(np.asarray(pcd.points))
o3d.visualization.draw_geometries([pcd],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])

2.3从深度图到点云

通常使用TOF等3d摄像头采集的格式一般只是深度图,需要经过转化,python这里的方式,先将深度图转化为3D坐标,存储为numpy格式,然后直接使用open3d转化为可视点云。

原本的csv可视的深度图如下:

data_path = "./face.csv"
w = 320
h = 240
data = pd.read_csv(data_path, header=None)
points = np.zeros((w*h, 3), dtype=np.float32)
n=0
for i in range(h):for j in range(w):deep = data.iloc[i, j]points[n][0] = jpoints[n][1] = ipoints[n][2] = deep#points.append([j,i,deep])n=n+1pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
#o3d.io.write_point_cloud("../../test_data/sync.ply", pcd)print("==========")
print(pcd)
print(np.asarray(pcd.points))
print("==========")o3d.visualization.draw_geometries([pcd],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])

点云结果:

这里只是简单的转化,没有根据相机内参进行映射,所以点的距离并不正常

查看相机内参,经过处理后可视化点云:

import pandas as pd
import numpy as np
import open3d as o3d
#ply_point_cloud = o3d.data.PLYPointCloud()
#pcd = o3d.io.read_point_cloud("./face.ply")
#pcd = o3d.io.read_point_cloud("./my_points.txt", format='xyz')
#pcd = o3d.io.read_point_cloud("./face.pcd")data_path = "./face.csv"camera_factor = 1;
camera_cx = 180.8664;
camera_cy = 179.088;camera_fx = 216.75;
camera_fy = 214.62;w = 320
h = 240
data = pd.read_csv(data_path, header=None)
points = np.zeros((w*h, 3), dtype=np.float32)
n=0
for i in range(h):for j in range(w):deep = data.iloc[i, j]points[n][2] = deep/camera_factorpoints[n][0] = (j-camera_cx)*points[n][2]/camera_fxpoints[n][1] = (i-camera_cy)*points[n][2]/camera_fy#points.append([j,i,deep])n=n+1pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
#o3d.io.write_point_cloud("../../test_data/sync.ply", pcd)print("==========")
print(pcd)
print(np.asarray(pcd.points))
print("==========")#knot_data = o3d.data.KnotMesh()
#mesh = o3d.io.read_triangle_mesh("./face.ply")
#print(mesh)
#o3d.io.write_triangle_mesh("copy_of_knot.ply", mesh)o3d.visualization.draw_geometries([pcd],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])

侧面:

2.4 点云分割聚类

保留前景信息,利用聚类和分割函数,也可先进行numpy预处理

import pandas as pd
import numpy as np
import open3d as o3d
import matplotlib.pyplot as plt
#ply_point_cloud = o3d.data.PLYPointCloud()
#pcd = o3d.io.read_point_cloud("./face.ply")
#pcd = o3d.io.read_point_cloud("./my_points.txt", format='xyz')
#pcd = o3d.io.read_point_cloud("./face.pcd")data_path = "./face.csv"camera_factor = 10;
camera_cx = 180.8664;
camera_cy = 179.088;camera_fx = 216.75;
camera_fy = 214.62;w = 320
h = 240
data = pd.read_csv(data_path, header=None)
points = np.zeros((w*h, 3), dtype=np.float32)n=0
for i in range(h):for j in range(w):deep = data.iloc[i, j]points[n][2] = deep/camera_factorpoints[n][0] = (j-camera_cx)*points[n][2]/camera_fxpoints[n][1] = (i-camera_cy)*points[n][2]/camera_fy#points.append([j,i,deep])n=n+1points = points[points[:,2]<100]pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
#o3d.io.write_point_cloud("../../test_data/sync.ply", pcd)
#pcd.paint_uniform_color([1, 0.706, 0])
print("==========")
print(pcd)
print(np.asarray(pcd.points))
print("==========")##聚类啦
#with o3d.utility.VerbosityContextManager(
#        o3d.utility.VerbosityLevel.Debug) as cm:
#    labels = np.array(
#        pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))#max_label = labels.max()
#print(f"point cloud has {max_label + 1} clusters")
#colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))
#colors[labels < 0] = 0
#pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])plane_model, inliers = pcd.segment_plane(distance_threshold=0.01,ransac_n=3,num_iterations=1000)
[a, b, c, d] = plane_model
print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")inlier_cloud = pcd.select_by_index(inliers)
inlier_cloud.paint_uniform_color([1.0, 0, 0])
outlier_cloud = pcd.select_by_index(inliers, invert=True)#画个框玩玩
aabb = pcd.get_axis_aligned_bounding_box()
aabb.color = (1, 0, 0)
obb = pcd.get_oriented_bounding_box()
obb.color = (0, 1, 0)
#knot_data = o3d.data.KnotMesh()
#mesh = o3d.io.read_triangle_mesh("./face.ply")
#print(mesh)
#o3d.io.write_triangle_mesh("copy_of_knot.ply", mesh)o3d.visualization.draw_geometries([outlier_cloud, aabb],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])

3,表面重建

3.1泊松重建

在很多情况下,我们想要生成一个密集的3D几何体,例如,一个三角形网格。然而,从多视角立体视觉方法,或深度传感器,我们只能获得非结构化点云。为了从这个非结构化输入中得到一个三角形网格,我们需要执行表面重建。在文献中有两个方法和Open3D目前实现以下:α形状(Edelsbrunner1983),球旋转(Bernardini1999),泊松表面重建[Kazhdan2006]

泊松重建需要法线估计,直接调用:

pcd.normals = o3d.utility.Vector3dVector(np.zeros((1, 3)))  # invalidate existing normalspcd.estimate_normals()

泊松表面重建还将在点密度低的区域创建三角形,甚至可以外推到某些区域(见上图底部的老鹰输出)。create_from_point_cloud_poisson函数有第二个密度返回值,表示每个顶点的密度。低密度值意味着只支持来自输入点云的少量点。

3.2Alpha shapes重建

alpha形状[Edelsbrunner1983]是凸包的泛化。

tetra_mesh, pt_map = o3d.geometry.TetraMesh.create_from_point_cloud(pcd)
for alpha in np.logspace(np.log10(2.5), np.log10(0.1), num=2):print(f"alpha={alpha:.3f}")mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha, tetra_mesh, pt_map)mesh.compute_vertex_normals()o3d.visualization.draw_geometries([mesh], mesh_show_back_face=True)

3.3Ball pivoting

球体旋转算法(BPA) [Bernardini1999]是一种与alpha形状相关的表面重建方法。

radii = [0.005, 0.01, 0.02, 0.04]
rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, o3d.utility.DoubleVector(radii))
o3d.visualization.draw_geometries([pcd, rec_mesh])

【Open3D】人脸深度图转点云,点云表面重建相关推荐

  1. (12)点云数据处理学习——表面重建

    1.主要参考 (1)官网的介绍 Surface reconstruction - Open3D 0.16.0 documentation (2)大佬的blog 三维点云重建 - open3d pyth ...

  2. SSRNet:用于大规模点云表面重建的深度学习网络(CVPR2020)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 整理人:袁赣张秦,付前程,张琛,廖新耀 论文: [1] Zhengxin Mi#, Yiming Lu ...

  3. 可用于大规模点云表面重建的深度学习算法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 整理人:袁赣张秦,付前程,张琛,廖新耀 论文: [1] Zhengxin Mi#, Yiming Lu ...

  4. python 点云重建,点云 表面重建 - osc_0tk7cpde的个人空间 - OSCHINA - 中文开源技术交流社区...

    啊哈 最近在参加一个数学建模的比赛 要求是对一个果子里面的虫洞进行三维模型重建 但是百度之后并没有找到对点云数据直接重建的方法(很少) 整个代码是python写的 里面的各种库似乎有一个是可以做这个的 ...

  5. 百度人脸识别技术应用003---百度云离线SDK_Android版_功能分析_获取摄像头视频流中的图片_发给百度人脸识别API_识别搜索_或先同步百度云人脸信息_然后本地人脸识别

    1.基于上一节,我们已经把百度云上的人脸库,建好了,然后我们可以从,百度云官网拿到, 离线人脸识别的SDK. SDK下载_文字识别SDK_语音识别SDK-百度AI开放平台 这里可以点进去下载 2.然后 ...

  6. Open3D快速裁剪指定区域的点云

    Open3D快速裁剪指定区域的点云 Open3D是一个用于计算机视觉和三维重建的开源库,它提供了许多强大的工具来处理点云数据.其中包括一个简单但功能强大的裁剪点云的函数,可以通过指定一个三维框来选择任 ...

  7. 基于翔云OCR云平台的人脸识别(1)

    基于翔云OCR云平台的人脸识别 本节通过翔云OCR云平台来实现人脸识别.调用人脸对比API,通过https post方式向云服务器提交两张需要对比的图片Base64流以及其他信息,云服务器处理后返回判 ...

  8. 基于翔云OCR云平台的人脸识别(2)

    基于翔云OCR云平台的人脸识别(2) 项目思路 raspistill命令的相关参数说明 -v:调试信息查看 -w:图像宽度 -h:图像高度 -rot:图像旋转角度,只支持 0.90.180.270 度 ...

  9. ICCV 2021 Oral | 无需法向的大场景点云表面重建

    编辑丨CVer 论文链接:https://arxiv.org/abs/2105.03582 代码已开源在github: https://github.com/tangjiapeng/SA-ConvON ...

最新文章

  1. Linux下的ATT语法(即GNU as 汇编语法)入门
  2. 跨平台打造移动原生应用的10大武器
  3. eBay再度问路中国
  4. Cpp / 右值、纯右值、将亡值
  5. Objective-C之MRC、ARC模式下,属性修饰关键字strong、retain、assign、weak的区别和联系...
  6. 十、request.getSession( )、reqeust.getSession(false)和 request.getSession(true)
  7. 【flink】flink 消费组死掉 Lag不变 kafka不提交 重启恢复 非常诡异
  8. CSMA/CA与CSMA/CD
  9. 计算机水平拼音怎么写,电脑上的拼音到底是怎么敲出来的
  10. VS2013配置OpenGL
  11. 结构化设计向导与IP核生成工具——IP核生成时.xaw与.xco的区别
  12. 足球类游戏球场风云前端项目代码
  13. 2021B站1024程序员节 网络攻防CTF
  14. 一位游戏大厂测试的一些知识分享
  15. javascript 代码中的use strict是什么意思
  16. linux进程与服务管理,linux基础之进程管理与服务
  17. 招聘是一门学问,给求职者发了offer后,他说不来了
  18. 个人作业二-软件案例分析
  19. ubuntu php libzip安装 ./configure报错 checking for libzip... not found configure
  20. javaweb农产品网络交易平台设计springboot+ssm

热门文章

  1. 一款可同时对接饿了么、美团、饿百零售的小票打印机
  2. 从零开始实现基于go-zero框架的微服务电商项目(三)——gorm、redis、腾讯云SMS、validate、md5加密、日志输入到kafka的添加
  3. 浅谈Asterisk的语音编码(codec)
  4. 【PTA】5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即“小时:分钟:秒”,当小时等于24小时,置为0。
  5. 【图像去噪】自适应布谷鸟算法优化维纳滤波器图像去噪【含Matlab源码 1892期】
  6. 字面量、直接量、常量
  7. 浅谈设计模式之五——Adapter模式
  8. 2021-1-17微淼商学院基金篇
  9. Mac 安装 Xcode工具软件
  10. Rsync 实现 Windows 与 CentOS 之间数据同步