如何显示和使用来自博斯普鲁斯海峡数据库(或类似数据库)的 3D 图像 - 从距离传感器的 Nx(3+2) 矩阵开始

How to show and work with a 3D image from the Bosphorus database (or a similar database) - Starting from a Nx(3+2) matrix from a range sensor

最佳

我的问题是我不知道如何使用博斯普鲁斯海峡数据(或类似的数据,它使用相同类型的结构)。 首先,我的最终目标是从博斯普鲁斯海峡数据库创建一个 3D 人脸识别系统。但不幸的是我不知道该怎么做。我不问你如何解决 3d 人脸识别,但我真的很想知道如何处理这些数据,以便我可以创建这个应用程序。我尝试了很多东西,但没有一个奏效。而且几乎所有的论文都是从给定的 3D 人脸开始的。

这个博斯普鲁斯海峡数据库为我提供了以下数据

这基本上就是一切。

但在我继续之前,这里是 Nx5 矩阵的描述:

  % Date:   2008
  % Outputs:
  %   zmin      : minimum depth value denoting the background        | =  -1000000           
  %   nrows     : subsampled number of rows                          | =   229
  %   ncols     : subsampled number of columns                       | =   188
  %   imfile    : image file name
  %   data      : Nx5 matrix where columns are 3D coordinates and 2D |  N = 43052 
  %   normalized image coordinates respectively. 2D coordinates are
  %   normalized to the range [0,1]. N = nrows*ncols. In this matrix, values
  %   that are equal to zmin denotes the background.

  -1000000000  -1000000000  -1000000000  0,995567  0,003639
  -1000000000  -1000000000  -1000000000  0,990248  0,003639
  -1000000000  -1000000000  -1000000000  0,984929  0,003639
  ...          ...          ...          ...       ...

现在真正的问题是:我如何处理这些数据

首先,如何根据这些数据创建如下图所示的3D图像?

其次,博斯普鲁斯海峡数据被归一化。但地标不是。 我如何绘制、使用、anker、引用该 3D 图像上的地标点?

三、如何从三维图像计算两点之间的测地距离? 例如。两个地标之间的测地距离(最短路径,Dijkstra)。因此,我如何从一个跳到另一个。

基本上就是这样。 我尝试了很多论文,但所有论文都以给定的 3D 图像开始,即使它们使用博斯普鲁斯海峡数据库或类似数据库。

希望有人能帮帮我,不客气

亲切的问候

迪特

-- 对于这个项目,我使用的是 Matlab。但是我觉得如果你有一个大概的想法,那环境就可以独立解决了--

问题1与你使用matlab处理结构化数据的方式有关。所以你需要知道处理它们所必需的结构和matlab操作。

该结构记录在数据文件的顶部:它似乎是一个 Nx5 space 分隔矩阵,因此您可以在此处使用 load 命令(键入 doc load查看它是如何工作的,或查看 this 问题的简单示例)。

facedata = load('yourfile');

然后你需要挑选出3D数据坐标并绘制出来。在此处阅读有关 matlab's indexing methods 的信息,并记住 matlab 索引列优先,这会引发很多人。

faceX = facedata(:,1);
faceY = facedata(:,2);
faceZ = facedata(:,3);

要绘制实际图,您可以使用 scatter3 尽管它只会绘制点云。您可能需要根据博斯普鲁斯海峡数据中哪个坐标排在第一位来稍微调整数据(他们可能会在随附的文档中说)但是一个安全的猜测是 XYZ,X 在右边,Z 垂直,所以您可以使用 catter3 (http://uk.mathworks.com/help/matlab/ref/scatter3.html) 将其绘制为点云。

scatter3(faceX,faceY,faceZ);

(编辑:我最初建议 surf 但它需要矩阵输入,正如 OP 在评论中指出的那样。我将其替换为 scatter3 因为它接受列输入,尽管 OP 的解决方案是使用 delaunay 三角剖分和 trimesh 给出了所需的线框)。

问题 2:答案在您 post 编辑的文本中:

data : Nx5 matrix where columns are 3D coordinates and 2D normalized image coordinates respectively.

因此只需使用前三列即可获得未规范化的数据。

问题 3:同样,您已经有了答案:获取 Dijkstra 的最短路径算法并实现它。请记住,它可能不是最准确的 - 对某些问题有很好的描述 here

如果您对此感到困惑,那么我会建议 post 专门针对它提出一个新问题。请详细说明您尝试过的方法、失败的原因以及您希望看到的结果。

总的来说,我还建议研究论文普遍假设您了解他们所使用的任何环境的基础知识——他们在期刊中没有太多空间,而且无论如何只会重复。有时对于基本信息,你必须横向思考:而不是 'how to use bosphorus data in matlab' 你可以把它分成几块然后概括,所以你可以问 'how to load text data into matlab', 'how to plot 3d data in matlab', 'how to implement dijkstra's shortest path algorithm in matlab'等

做最好的自己

如前所述,博斯普鲁斯海峡数据包含标准化数据。 只有前 3 个列向量在这里很重要,因为它们引用 3D 数据。

因此,如果 xyz 是我们的标准化数据矩阵

  xyz = 3normalizedColumnsXYZ;

  %% Then, you will get the mesh via the following piece of code

  x_plot = linspace(min( xyz(:,1)),max( xyz(:,1)),n);
  y_plot = linspace(min( xyz(:,2)),max( xyz(:,2)),n);
  [XI, YI] = meshgrid( x_plot, y_plot);
  ZI = griddata( xyz(:,1), xyz(:,2), xyz(:,3), XI, YI);


 %%plot the mesh - if you want to
     figure(1)
     mesh( XI, YI, ZI) 

向自己问好