資源簡介
本代碼由opencv實現(xiàn),每一步驟都附有詳細(xì)的說明,文件包中除了實現(xiàn)代碼之外還包含一篇ICP的經(jīng)典文章,注釋中的公式指的就是文章中的公式
代碼片段和文件信息
#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īng)點,并把它存在Y中
Point3D?_mean_P?_mean_Y;
CalculateMeanPoint3D(P?_mean_P);//求質(zhì)心坐標(biāo)
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行相當(dāng)于單位四元素中公式(22),(23)的求解過程
//接下來求反對稱矩陣及其特征值特征向量
double?m_T[9];
MatrixTran(m?m_T?3?3);///求m的轉(zhuǎn)置
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);
//根據(jù)特征向量求旋轉(zhuǎn)矩陣,公式(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個文件信息
評論
共有 條評論