点云技术相关产学研社区

 找回密码
 立即注册加入PCL中国点云技术相关产学研社区

扫一扫,访问微社区

查看: 10345|回复: 11

icp问题

[复制链接]
发表于 2013-4-4 16:17:11 | 显示全部楼层 |阅读模式
我用kinect采集了两个场景,一个有21万个点,一个有17万,然后使用例程中的icp代码,结果如图片显示!如何解决呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册加入PCL中国点云技术相关产学研社区

x
回复

使用道具 举报

发表于 2013-4-4 16:44:11 | 显示全部楼层
你可以方便把你的两个场景的可视化效果,顺便传上来,再把你用的icp的参数粘上来。从你结果看,你可以调整icp相关的参数,再试一试。
祝好运!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-4 16:45:23 | 显示全部楼层
问题补充!
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloude_1(new pcl::PointCloud<pcl::PointXYZ>);
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloude_2(new pcl::PointCloud<pcl::PointXYZ>);
        //设定输入无序点云1的宽和高
        cloude_1->width = Point1_NUM;
        cloude_1->height=1;
        cloude_1->is_dense=false;
        cloude_1->points.resize(cloude_1->width*cloude_1->height);

        Point3DSet* shuju;
        shuju=ReadFromTXT1();
       
        for(size_t i=0;i<cloude_1->points.size();++i)
        {
                cloude_1->points[i].x=shuju->point[i].x;
                cloude_1->points[i].y=shuju->point[i].y;
                cloude_1->points[i].z=shuju->point[i].z;
        }

        //设定输入无序点云2的宽和高
        cloude_2->width = Point1_NUM;
        cloude_2->height=1;
        cloude_2->is_dense=false;
        cloude_2->points.resize(cloude_2->width*cloude_2->height);

        Point3DSet* shuju2;
        shuju2=ReadFromTXT2();
       
        for(size_t i=0;i<cloude_2->points.size();++i)
        {
                cloude_2->points[i].x=shuju2->point[i].x;
                cloude_2->points[i].y=shuju2->point[i].y;
                cloude_2->points[i].z=shuju2->point[i].z;
        }

        //下面进行icp算法
        pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
        icp.setInputCloud(cloude_2);
        icp.setInputTarget(cloude_1);
        pcl::PointCloud<pcl::PointXYZ> Final;
        icp.align(Final);
        cout << "has converged:" << icp.hasConverged() << " score: " <<icp.getFitnessScore() <<endl;
        cout << icp.getFinalTransformation() <<endl;
回复 支持 反对

使用道具 举报

发表于 2013-4-4 17:08:37 | 显示全部楼层
你还是没上传点云可视的图片。
首先,你需要确定,你两个输入点云之间进行了粗配准,这是icp成功的关键。
如果保证了上面条件,你可以进行调整一个icp的参数,像迭代次数、判断对应点时的误差之类的。

祝好运,解决了,晒晒方案!谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-4 18:07:23 | 显示全部楼层
mypcl 发表于 2013-4-4 17:08
你还是没上传点云可视的图片。
首先,你需要确定,你两个输入点云之间进行了粗配准,这是icp成功的关键。
...

什么是粗配准!点云可视我还没学,我把点云投影到二维得两幅图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册加入PCL中国点云技术相关产学研社区

x
回复 支持 反对

使用道具 举报

发表于 2013-4-4 20:26:07 | 显示全部楼层
lijingcsu 发表于 2013-4-4 18:07
什么是粗配准!点云可视我还没学,我把点云投影到二维得两幅图

那我建议你看看ICP的具体算法吧,网上介绍比较多。慢慢来了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-4 20:39:32 | 显示全部楼层
mypcl 发表于 2013-4-4 20:26
那我建议你看看ICP的具体算法吧,网上介绍比较多。慢慢来了。

算法的具体内容我知道,将整个点云看成3Xm的矩阵,利用四元素法求两个矩阵之间的旋转和平移!你不要说的我没看书一样,好吧!关键是矩阵之间的大小可能不一样!要先利用kdtree从目标点云中找输入点云的最近点,就是没听过什么粗配准!加上我今天第一次用pcl
回复 支持 反对

使用道具 举报

发表于 2013-4-5 12:54:26 | 显示全部楼层
lijingcsu 发表于 2013-4-4 20:39
算法的具体内容我知道,将整个点云看成3Xm的矩阵,利用四元素法求两个矩阵之间的旋转和平移!你不要说的 ...

呵呵,没有任何说你的意思,在进行变换矩阵求解前,需要找出对应点对,你那个数据目前就是两个点云之间的没有进行大概的配准(有人把它叫粗配准(initial guess)),进行icp根本收敛不了。icp是进行优化配准结果的一个过程。我其实也了解不多,多多分享互相学习了。

祝好运!
回复 支持 反对

使用道具 举报

发表于 2013-4-7 09:32:29 | 显示全部楼层
distance threshold过小,导致不能找到足够的correspondence以用于迭代计算变换矩阵。

其实,如果你真的了解ICP算法了的话,再结合PCL给出的那段红色提示,很自然的就应该知道是什么原因导致出错的。

另外,你确实需要把两个点云以某种方式可视化(画/渲染)出来以帮助你确认结果是否对了,对于图形学的算法差不多都需要这样,否则你很难debug。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-7 11:03:26 | 显示全部楼层
落木森林 发表于 2013-4-7 09:32
distance threshold过小,导致不能找到足够的correspondence以用于迭代计算变换矩阵。

其实,如果你真的了 ...

这个问题我解决了!icp算法中对于数据大小不一致的点云,首先是从目标点云中找出和输入点云距离最近的点,用楼上的说法叫粗配准!其中利用kdtree寻找最近点如果不是要求特别高是可以设定最小距离以加快算法速度,提高效率,不设定最小距离根据kdtree的原理它也可以只是效率没这么高!现在学习pcl的障碍是不懂数据结构,对其中的参数的具体意义不懂!它的帮助文档完全没有opencv之类的库帮助文档简洁有效!问题解决方法如下.终结此贴!谢谢各位!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册加入PCL中国点云技术相关产学研社区

x
回复 支持 反对

使用道具 举报

本版积分规则

QQ|小黑屋|点云技术相关产学研社区 ( 陕ICP备13001629号 )

GMT+8, 2024-5-21 02:41 , Processed in 1.390144 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表