Fast ICP的VS2010实现

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/zhouyelihua https://blog.csdn.net/zhouyelihua/article/details/73794338

后续会详细的解读全部的源码。。。。
Fast ICP论文地址:

http://docs.happycoders.org/orgadoc/graphics/imaging/fasticp_paper.pdf

fast icp source code C++源码:

http://gfx.cs.princeton.edu/proj/trimesh2/

这个代码是vs2010根据源码修改的一个工程。。本程序只使用lib和头文件十分方便使用
工程地址

#include "TriMesh.h"
#include "TriMesh_algo.h"
#include "ICP.h"
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;
using namespace trimesh;
int main(){
    int verbose = 0;
    bool do_scale = false;
    bool do_affine = false;
    bool bulkmode = true;
    char filename1[100]="../1.obj";//输入的工程文件支持obj。ply,stl
    char filename2[100]="../2.obj";
    TriMesh *mesh1 = TriMesh::read(filename1);
    TriMesh *mesh2 = TriMesh::read(filename2);
    xform xf1;
    string xffilename1 = xfname(filename1);
    xf1.read(xffilename1);

    xform xf2;
    string xffilename2 = xfname(filename2);
    xf2.read(xffilename2);

    KDtree *kd1 = new KDtree(mesh1->vertices);
    KDtree *kd2 = new KDtree(mesh2->vertices);
    vector<float> weights1, weights2;

    if (bulkmode) {
        float area1 = mesh1->stat(TriMesh::STAT_TOTAL, TriMesh::STAT_FACEAREA);
        float area2 = mesh2->stat(TriMesh::STAT_TOTAL, TriMesh::STAT_FACEAREA);
        float overlap_area, overlap_dist;
        find_overlap(mesh1, mesh2, xf1, xf2, kd1, kd2,
            overlap_area, overlap_dist);
        float frac_overlap = overlap_area / min(area1, area2);
        if (frac_overlap < 0.1f) {
            TriMesh::eprintf("Insufficient overlap\n");
            exit(1);
        } else {
            TriMesh::dprintf("%.1f%% overlap\n",
                frac_overlap * 100.0);
        }
    }

    float err = ICP(mesh1, mesh2, xf1, xf2, kd1, kd2, weights1, weights2,
        verbose, do_scale, do_affine);
    if (err >= 0.0f)
        err = ICP(mesh1, mesh2, xf1, xf2, kd1, kd2, weights1, weights2,
        verbose, do_scale, do_affine);

    if (err < 0.0f) {
        TriMesh::eprintf("ICP failed\n");
        exit(1);
    }

    TriMesh::eprintf("ICP succeeded - distance = %f\n", err);
        xf1.write(xffilename1);//输出的网格1的变化矩阵
    xf2.write(xffilename2);//网格2的变换举证

    return 0;
}

具体查看一下网格变换矩阵

[R0T1]

这里写图片描述

具体整个工程的下载
http://download.csdn.net/detail/zhouyelihua/9881814


如果您觉得此博客对您有用,欢迎对我进行小额赞助。




不筹钱娶媳妇的程序员不是好程序员!


猜你喜欢

转载自blog.csdn.net/zhouyelihua/article/details/73794338
今日推荐