如何转换Bundler的捆绑出去格式化为Meshlab的项目格式(.mlp)

2024-09-30 01:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用MeshLab处理三维扫描,特别是给网格一个纹理。 我正在尝试使用命令行自动化Meshlab的一些特性,Meshlab服务器在某些任务中运行良好。但是,我正在使用捆绑出去存储相机位置的格式,而且似乎没有打开捆绑出去文件使用meshlabserver。我需要从我的三维扫描得到相机的位置,以便应用纹理。在

我尝试过转换捆绑出去通过打开两个文件并比较其中的格式,使用Python脚本将文件文件转换为.mlp文件,但是在编写脚本的过程中,我注意到这两个文件包含的数据并不完全相同,即使对于同一个相机也是如此。特别是包含在捆绑出去文件与.mlp文件中的转换矢量不匹配。在

下面是我在MeshLab中通过导入捆绑出去文件:

<!DOCTYPE MeshLabDocument>
<MeshLabProject>
 <MeshGroup/>
 <RasterGroup>
  <MLRaster label="IMG_1923.JPG">
   <VCGCamera TranslationVector="1.47497 -1.02971 3.11087 1" LensDistortion="0 0" CameraType="0" PixelSizeMm="1 1" ViewportPx="4032 3024" CenterPx="2016 1512" RotationMatrix="0.874226 0.050346 -0.482903 0 0.0346906 -0.998544 -0.0413029 0 -0.484279 0.0193558 -0.8747 0 0 0 0 1 " FocalMm="3345.59"/>
   <Plane semantic="1" fileName="images/IMG_1923.JPG"/>
  </MLRaster>
...

注意“TranslationVector”属性以及其中的值。在

这是捆绑出去用于创建.mlp文件的文件:

^{pr2}$

捆绑文件的解释如下:

# Bundle file v0.3
<number of images> <number of points>
<f> <k1> <k2>
<r_1,1> <r_1,2> <r_1,3>
<r_2,1> <r_2,2> <r_2,3>
<r_3,1> <r_3,2> <r_3,3>
<t_1> <t_2> <t_3>
...

其中: f: 焦距 k1和k2:径向畸变系数 r_i,j:旋转矩阵的元素 t_i:平移向量的元素

最后一行的三个值t_1、t_2和t_3是存储平移向量的位置。它与.mlp文件的不匹配。两个文件共有的所有其他值都匹配。在

链接到捆绑出去文件格式规范:http://www.cs.cornell.edu/~snavely/bundler/bundler-v0.3-manual.html#S6 (向下滚动到“VI.输出格式和场景表示”)

我希望.mlp文件包含与捆绑出去但有一个属性,即平移向量,在两个文件中不匹配。在

如果有人能解释为什么会有差异,并可能提供一种在捆绑出去文件转换为.mlp文件。在


Tags: 文件脚本numberimg属性格式向量jpg
1条回答
网友
1楼 · 发布于 2024-09-30 01:28:18

我找到了解决办法。在

在研究了MeshLab的源代码之后,我发现了这个文件: https://github.com/cnr-isti-vclab/meshlab/blob/d596d7c086c51fbdfb56050f9c30b55dd0286d4c/src/meshlabplugins/filter_layer/filter_layer.cpp

来自630号线:

//// Import cameras
for (uint i = 0; i < num_cams; ++i)
{
    float f, k1, k2;
    float R[16] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1 };
    vcg::Point3f t;

    fgets(line, 100, fp);; if (line[0] == '\0') return false; sscanf(line, "%f %f %f", &f, &k1, &k2);

    fgets(line, 100, fp);; if (line[0] == '\0') return false; sscanf(line, "%f %f %f", &(R[0]), &(R[1]), &(R[2]));  R[3] = 0;
    fgets(line, 100, fp);; if (line[0] == '\0') return false; sscanf(line, "%f %f %f", &(R[4]), &(R[5]), &(R[6]));  R[7] = 0;
    fgets(line, 100, fp);; if (line[0] == '\0') return false; sscanf(line, "%f %f %f", &(R[8]), &(R[9]), &(R[10])); R[11] = 0;

    fgets(line, 100, fp);; if (line[0] == '\0') return false; sscanf(line, "%f %f %f", &(t[0]), &(t[1]), &(t[2]));

    Matrix44f mat = Matrix44f::Construct(Matrix44f(R));

    Matrix33f Rt = Matrix33f(Matrix44f(mat), 3);
    Rt.Transpose();

    Point3f pos = Rt * Point3f(t[0], t[1], t[2]);

    md.rasterList[i]->shot.Extrinsics.SetTra(Point3f(-pos[0], -pos[1], -pos[2]));
...
}

这就是从Bundler的平移向量到Meshlab的平移向量的转换的地方。在

我从上面的代码中提取的信息如下:

转换转换向量的方法捆绑出去收件人.mlp:

  1. 读取旋转矩阵(从捆绑出去),存储为R
  2. 读取翻译矢量(从捆绑出去),存储为t
  3. 转置旋转矩阵R
  4. 将R-转置乘以t,存储为pos
  5. 将pos设置为.mlp平移向量

我在Python中测试了这个配方,其输出与.mlp文件中的相同

相关问题 更多 >

    热门问题