相机模型

x=PX→x=K[R∣t]X→zc[uv1]=[kx0u00kyv0001][R∣t][xcyczc]x=PX \rightarrow x = K[R|t]X \rightarrow z_c\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} k_x & 0 & u_0 \\ 0 & k_y & v_0 \\ 0 & 0 & 1 \\ \end{bmatrix}[R|t]\begin{bmatrix} x_c \\ y_c \\ z_c\end{bmatrix}x=PX→x=K[R∣t]X→zc​​uv1​​=​kx​00​0ky​0​u0​v0​1​​[R∣t]​xc​yc​zc​​​
xxx表示图像点,XXX表示空间点。

PPP是正交矩阵,上三角矩阵KKK是相机内参数(相机硬件),矩阵内元素单位是像素(物理尺寸/单个CCD感光元宽度),[u0,v0][u0, v0][u0,v0]是光轴中心点图像坐标。

[R∣t][R|t][R∣t]是相机外参数,表示相机旋转和平移位姿。

python代码

import numpy as np
import cv2
import open3d as o3d
import trimeshdef RGBD2Point(depth_img, rgb_img):# 相机内参k_x = 5.775910000000000082e+02k_y = 5.787300000000000182e+02u_0 = 3.189049999999999727e+02v_0 = 2.426839999999999975e+02factor = 1K = [[k_x, 0, u_0], [0, k_y, v_0], [0, 0, 1]]# 逐点处理,此过程可以使用numpy优化m, n = depth_img.shape  # 480 640color_map, point_cloud = [], []for v in range(m):      # 行相当于y坐标for u in range(n):  # 列相当于x坐标if depth_img[v, u] == 0:continuergb = rgb_img[v, u]rgb = [rgb[0], rgb[1], rgb[2]]rgb_info = np.array(rgb) / 255.0  # 颜色归一化到0-1之间rgb_info = rgb_info[::-1]  # cv2读取数据格式为BGRcolor_map.append(rgb_info)depth = depth_img[v, u]# 矩阵运算速度较慢# x_c, y_c, z_c = np.transpose(np.dot(np.linalg.inv(K), np.transpose(depth * np.array([u, v, 1]))))z_c = depth / factorx_c = (u - u_0) * z_c / k_xy_c = (v - v_0) * z_c / k_ypoint_cloud.append([x_c, y_c, z_c])point_cloud = np.array(point_cloud)color_map = np.array(color_map)return point_cloud, color_map  # shape都是(212342, 3) point为(x,y,z) color为(r,g,b)s_depth = cv2.imread("data/depth.png", -1)  # 480 640
s_color = cv2.imread("data/rgb.jpg")     # (480, 640, 3)
points, color = RGBD2Point(s_depth, s_color)
pc = o3d.geometry.PointCloud()
pc.points = o3d.utility.Vector3dVector(points)
pc.colors = o3d.utility.Vector3dVector(color)
o3d.visualization.draw_geometries([pc])      # 可视化
o3d.io.write_point_cloud("data/pc.ply", pc)  # 保存文件pc.estimate_normals()
# estimate radius for rolling ball
distances = pc.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radius = 1.5 * avg_dist
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pc, o3d.utility.DoubleVector([radius, radius * 2]))
print(mesh.get_surface_area())   # 表面积:9609237.82040951
o3d.visualization.draw_geometries([mesh], window_name='Open3D downSample', width=800, height=600, left=50, top=50,point_show_normal=True, mesh_show_wireframe=True, mesh_show_back_face=True,)
# create the triangular mesh with the vertices and faces from open3d
tri_mesh = trimesh.Trimesh(np.asarray(mesh.vertices), np.asarray(mesh.triangles), vertex_normals=np.asarray(mesh.vertex_normals))
tri_mesh.show()# a = [3, 5, 6]
# print(2 * a)  # [3, 5, 6, 3, 5, 6]
# print(2 * np.array(a))  # [6 10 12]

运行结果(左侧为生成的点云图,右图为原始RGB图):

生成Mesh图失去了颜色信息,三角Mesh化结果不太行

:本文图像数据来自论文DeepDeform

Open3d从RGBD生成点云、mesh相关推荐

  1. Open3d利用彩色图和深度图生成点云进行室内三维重建

    上一次得到的点云图在累加多张后配准会出现少量离群的点云,效果很差,于是考虑从 ICL-NUIM dataset这个数据集获得官方的室内图进行三维重建,数据集网址如下: ICL-NUIM RGB-D B ...

  2. open3d显示pcd点云并读取任意点的坐标+生成点云绕任意轴旋转的transformation matrix

    为了对点云进行旋转操作,达到各点云之间不对齐的效果,找到了生成点云绕任意轴旋转的矩阵的代码. 链接: https://blog.csdn.net/u010848251/article/details/ ...

  3. open3d学习教程1--点云对象PointCloud

    目录: 前言 1. open3d.geometry.PointCloud 前言 点云简单来说就是3d坐标下一个个点组成的数据,每个点可以包含x,y,z,颜色.分类值.强度值.时间等等信息.点云是3d数 ...

  4. PCL——从点云到网格(一)利用OpenNI2和深度相机生成点云

    最近做毕设,学习了一下PCL的使用(C++).这几篇博客就记录一下自己做毕设的时候利用深度相机得到点云,最后生成Mesh的过程.效果应该不是最好的,但是先把流程记录下来,自己下次看的时候就知道大体流程 ...

  5. oak深度相机入门教程-使用NN模型生成点云

      系列文章目录: oak深度相机入门教程-识别眼睛的凝视方向 oak深度相机入门教程-检测是否佩戴口罩 oak深度相机入门教程-文本检测+光学字符识别(OCR)管道 oak深度相机入门教程-识别人的 ...

  6. 【BIM模型生成点云数据】revit转obj格式,全网最详细最简单的步骤了!

    最近,学习到了一种新方法,用于制作点云数据集,那就是----用BIM三维模型转obj格式之后导入到cloudcompare生成点云数据.该方式适合做仿真实验,也可以用于三维建模的精度对比. 关键性问题 ...

  7. Open3D 可视化numpy点云数据

    Open3D 可视化numpy点云数据 使用Open3D 可视化点云数据的效果比较炫. 但是当我时隔半年重新使用Open3D库时发现原来的用法发生了改变,特此记录,持续更新. Anaconda 安装O ...

  8. 既可生成点云又可生成网格的超网络方法 ICML

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文发表在 ICML 2020 中,题目是Hypernetwork approach to gener ...

  9. 3D点云处理:数据集生成点云

    文章目录 点云结果 1. 数据集 2. 生成点云 2.1 生成点云代码 点云结果 生成的点云数据 1. 数据集 数据集来源:T-LESS .下载的数据分别是itodd_test_all 和tless_ ...

最新文章

  1. std::vector使用简介
  2. 使用反射代替不断添加的if-else来实现代码的可扩展性
  3. 安装库_Python快速安装库的靠谱办法
  4. TrackViewState到底是干什么的
  5. python 高阶函数之 reduce
  6. jquery|javascript 回车事件
  7. 程序员过关斩将--真的可以用版本号的方式来保证MQ消费消息的幂等性?
  8. linux命令:vim文件操作命令、新建用户,查看用户列表,chown命令
  9. android ListView实现下拉上拉刷新功能
  10. 笔记 我的Linux入门之路,我的LINUX之路----linux目录文件管理
  11. MFC:VS拖拽多个文件到控件并获取路径
  12. 河流干涸的原因可能是水循环被破坏
  13. 【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]
  14. ESP8266-Arduino编程实例-L3G4200D三轴陀螺仪驱动
  15. log4j 配置文件路径问题
  16. 商业创业计划书PPT模板
  17. [转]用.net快速开发下载软件
  18. 后缀表达式求值和转换(C++)
  19. 基于 React hooks + Typescript + Cesium 实现泛光尾迹线
  20. this的三种常见用法

热门文章

  1. 软件测试培训分享:软件测试自学能找到工作吗
  2. 推荐几款很棒的文本编辑器
  3. 好的程序员如何写代码
  4. Css实现漂亮的滚动条样式
  5. 程序题智能批改系统需求分析
  6. 多时间尺度 3D 卷积神经网络的步态识别
  7. 虚拟机性能监控、故障处理工具
  8. C#得到10000以内素数
  9. Arduino设计 有害气体检测小车
  10. 四层高速dsp开发板制作1——原理图设计