如何从 3d 对象文件中获取 3d 坐标。

Posted

技术标签:

【中文标题】如何从 3d 对象文件中获取 3d 坐标。【英文标题】:How to get 3d coordinates from a 3d object file. 【发布时间】:2019-01-21 06:26:28 【问题描述】:

我正在使用 3 个 ArUco 标记卡在 3D 头部模型模型上,使用 C++ 中的 OpenCV 进行姿势估计。我的姿势估计算法给了我相对于相机的平移,但我现在想知道标记相对于模型坐标系的坐标。因此,我使用 3D 扫描仪扫描了头部模型,并随身携带了一个目标文件和纹理文件。我的问题是获取标记相对于头部模型的坐标的最简单或最佳方法是什么。我应该使用 OpenGL、blender 还是其他一些软件呢?寻找一些指示或建议。

【问题讨论】:

太宽泛、不清楚和模糊,没有任何样本输入,所以我们只能猜测您想要交叉匹配相似的网格并估计相对变换矩阵以在它们之间进行转换。这是一个巨大的话题,没有看到你的情况很难帮助......至少添加2个网格/PCL的屏幕截图无论如何要么识别特定特征(如鼻子或下巴,耳朵)并从它们的位置创建矩阵或使用SIFT / SURF 类似功能 + RANSAC 进行交叉匹配。如果您有标记,请使用它们,但它们需要具有特殊含义,例如两个网格中的已知位置。我认为标题具有误导性 【参考方案1】:

听起来您将标记相对于相机的坐标作为坐标系,因此在“眼睛空间”或相机空间中进行坐标。这是当你有相机在原点的坐标时。

这篇文章有一个精彩的图表,解释了不同的空间以及如何转换到不同的空间: http://antongerdelan.net/opengl/raycasting.html

如果您想要这些相同的坐标,但在模型空间中,您需要能够让您进入该空间的矩阵。

在这种情况下,您将从眼睛/相机空间 -> 模型空间出发,因此您需要将这些坐标乘以逆视图矩阵,然后乘以逆模型矩阵。那么您的坐标将在模型空间中。

但是当您使用物理相机而不是软件相机时,例如在 OpenGL 中,这要困难得多。 为此,您需要使用 OpenCV 来获取相机的内部和外部参数。 有关更多详细信息,请参阅本教程: https://docs.opencv.org/3.1.0/dc/dbb/tutorial_py_calibration.html

【讨论】:

以上是关于如何从 3d 对象文件中获取 3d 坐标。的主要内容,如果未能解决你的问题,请参考以下文章

从 2d 图像像素获取 3d 坐标系中的 x,y

如何从距离、方位角和仰角获取 3D 坐标

在three.js中获取鼠标点击点的3D坐标

OpenGL获取像素的原始3d坐标

如何使用 OpenCV 绘制 3D 坐标轴以进行人脸姿态估计?

如何在 Dlib C++ 中获取头部姿势估计的 3D 坐标轴