资源简介
本代码由opencv实现,每一步骤都附有详细的说明,文件包中除了实现代码之外还包含一篇ICP的经典文章,注释中的公式指的就是文章中的公式
代码片段和文件信息
#include “ICP.h“
void ReadPoint3D(const char *filename vector &P)
{
FILE *fp = fopen(filename “r“);
char str[10];
while(fscanf(fp “%s“ str) != EOF)
{
if(strcmp(str “v“) == 0)
{
Point3D p;
fscanf(fp “%lf%lf%lf%d%d%d“ &p.x &p.y &p.z &p.r &p.g &p.b);
P.push_back(p);
}
}
fclose(fp);
}
void SelectPoint3D(const char *filename vector &P int ratio)
{
FILE *fp = fopen(filename “r“);
char str[10];
int i=0;
while(fscanf(fp “%s“ str) != EOF)
{
if(strcmp(str “v“) == 0)
{
Point3D p;
fscanf(fp “%lf%lf%lf%d%d%d“ &p.x &p.y &p.z &p.r &p.g &p.b);
if(i%ratio == 0)
P.push_back(p);
i++;
}
}
fclose(fp);
}
void ICP(vector &model vector &data double *R double *T double e)
{
vector Y P;
vector::iterator it1 it2;
double pre_d = 0.0 d = 0.0;
int round = 0;
P = data;
do
{
pre_d = d;
double R1[9] T1[3];
FindClosestPointSet(model P Y);//寻求model到data中的对应点,并把它存在Y中
Point3D _mean_P _mean_Y;
CalculateMeanPoint3D(P _mean_P);//求质心坐标
CalculateMeanPoint3D(Y _mean_Y);
double m[9] A[9] delta[3];
for(int i=0; i<9; i++)
{
m[i] = 0;
}
it1 = P.begin();
it2 = Y.begin();
for(; it1!=P.end(); it1++ it2++)
{
double p[3] y[3] mul[9];
p[0] = it1->x;
p[1] = it1->y;
p[2] = it1->z;
y[0] = it2->x;
y[1] = it2->y;
y[2] = it2->z;
MatrixMul(p y mul 3 1 13);//mul= p*y
MatrixAdd(m mul 3 3);//m=m+mul
}
for(int i=0; i<9; i++)
{
m[i] = m[i]/(double)P.size();///求均值
}
double mean_P[3] mean_Y[3] mul[9];
mean_P[0] = _mean_P.x;
mean_P[1] = _mean_P.y;
mean_P[2] = _mean_P.z;
mean_Y[0] = _mean_Y.x;
mean_Y[1] = _mean_Y.y;
mean_Y[2] = _mean_Y.z;
MatrixMul(mean_P mean_Y mul 3 1 1 3);//mul=mean_P*mean_Y
MatrixDiv(m mul 3 3);//m=m-mul,
//从75行到107行相当于单位四元素中公式(22),(23)的求解过程
//接下来求反对称矩阵及其特征值特征向量
double m_T[9];
MatrixTran(m m_T 3 3);///求m的转置
for(int i=0; i<9; i++)
{
A[i] = m[i];
}//A=m
//公式(25)中delta的求解过程
MatrixDiv(A m_T 3 3);//A=A-m_T
delta[0] = A[5];
delta[1] = A[6];
delta[2] = A[1];
//公式(25)中主对角线上元素的求解
double tr = MatrixTR(m 3);//求m的迹
MatrixAdd(m m_T 3 3);///m=m+m_T
double I3[9] = {1 0 0 0 1 0 0 0 1};
I3[0] = tr;
I3[4] = tr;
I3[8] = tr;
MatrixDiv(m I3 3 3);//m=m-I3
double Q[16];
Q[0] = tr;
for(int i=1; i<=3; i++)
Q[i] = delta[i-1];
for(int i=1; i<=3; i++)
Q[i*4] = delta[i-1];
for(int i=1; i<=3; i++)
{
Q[i*4 + 1] = m[4*(i-1) + 0];
Q[i*4 + 2] = m[4*(i-1) + 1];
Q[i*4 + 3] = m[4*(i-1) + 2];
}
//求公式(25)中反对称矩阵的最大特征值及其特征向量
double eigen qr[4];
MatrixEigen(Q &eigen qr 4);
//根据特征向量求旋转矩阵,公式(21)
CalculateRotation(qr R1);
//158到167行为求平移向量的过程,公式(26)
double qt[3];
for(int i=0; i<
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-11-05 21:34 ICP1\
文件 1716108 2013-04-15 16:23 ICP1\A method for regitration of 3D modle.pdf
目录 0 2013-11-01 14:53 ICP1\Debug\
文件 557568 2013-11-01 15:19 ICP1\Debug\ICP1.exe
文件 1265108 2013-11-01 15:19 ICP1\Debug\ICP1.ilk
文件 2788352 2013-11-01 15:19 ICP1\Debug\ICP1.pdb
文件 8636 2013-11-04 14:49 ICP1\ICP.cpp
文件 1226 2012-04-29 20:41 ICP1\ICP.h
目录 0 2013-10-30 21:06 ICP1\ICP1\
目录 0 2013-11-01 15:19 ICP1\ICP1\Debug\
文件 34908 2013-11-01 14:53 ICP1\ICP1\Debug\CL.read.1.tlog
文件 1020 2013-11-01 14:53 ICP1\ICP1\Debug\CL.write.1.tlog
文件 236258 2013-11-01 15:19 ICP1\ICP1\Debug\ICP.obj
文件 2360 2013-11-01 14:53 ICP1\ICP1\Debug\ICP1.Build.CppClean.log
文件 406 2013-11-01 14:53 ICP1\ICP1\Debug\ICP1.exe.em
文件 472 2013-11-01 14:53 ICP1\ICP1\Debug\ICP1.exe.em
文件 381 2013-11-01 15:19 ICP1\ICP1\Debug\ICP1.exe.intermediate.manifest
文件 79 2013-11-01 15:19 ICP1\ICP1\Debug\ICP1.lastbuildstate
文件 812 2013-11-01 15:19 ICP1\ICP1\Debug\ICP1.log
文件 198 2013-11-01 14:53 ICP1\ICP1\Debug\ICP1_manifest.rc
文件 1910 2013-11-01 14:53 ICP1\ICP1\Debug\cl.command.1.tlog
文件 2 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 2 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 2 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 2 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 2 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 2 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 1820 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 3588 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 1016 2013-11-01 14:53 ICP1\ICP1\Debug\li
文件 91065 2013-11-01 15:19 ICP1\ICP1\Debug\main.obj
............此处省略15个文件信息
相关资源
- stc-icp_STC单片机烧录工具兼容Win10
- SICP中文第二版
- ACM ICPC培训资料汇编 2 8
-
MusicPla
yer - SICP计算机程序的构造和解释(中英文
- 计算机程序的构造和解释SICP中文第
- ACM-ICPC 历年竞赛 真题,各大赛区真题
- 《计算机程序的构造和解释》中文高
- HowtoWriteandPublishaScientificPaper科技论文
- 算法参考资料
- 点云配准PFH、FPFH、icp、NDT、3Dsc.zip
- seerc-2019-editorial.pdf
- 基于PCL开源库fpfh+icp算法实现点云配准
- ACM ICPC Latex 自动生成模版的模版
- 基于PICPIC18F452的步进电机控制系统
- MusicPlayOnLine-master
- 微信h5支付“网站域名ICP备案主体与商
- pcl icp算法
- 2019年新疆省赛题解和标程.zip
- 山东大学ACM模板-计算几何
- ACM-ICPC世界总决赛试题解析2004-2011第
- springboot + mybaties + phoenix + HikariCP 整合
- AnalysationofTrafficParaments.rar
- 三维激光扫描点云配准
- 网站域名ICP备案主体与商户号主体不
- NOIP 2018 提高组精品模拟题
- 基于综合改进ICP算法的三维激光扫描
- PIC单片机应用开发24例——基于
- 基于KDTree改进的ICP算法在点云配准中
- 石墨消解-ICP-MS法测定土壤中的八种重
评论
共有 条评论