你搜到这找资料是希望能找到讲的明白的,希望我能把一个知识点讲明白
两幅点云配准后我们希望知道配准的好不好,为什么需要知道,因为如果自动化产线里匹配不好出现频率太高,良品率就下去了,谁会买这样的产线呢?如果知道匹配不行,至少我们还有办法去做补救。
根据我的经验,一种通过已知旋转平移矩阵再去评判配准的变换矩阵是否精确,用于算法精度测试,需要一个可读数的旋转平移平台机构;有一种用的比较多,是通过可视化或者配准结果保存,通过肉眼判断结果好坏,这两种都是需要人工参与,对于自动化而言,自动校验结果怎么办呢?
还是有办法的,办法还挺多的,就是今天的主角——假设校验。提到假设校验,不得不提到True Positive/True Negative/False Positive/False Negative,从字面你也能理解是啥意思了,不懂请看FP,FN,TP,TN
假设校验算是三维点云识别的范畴,推荐文章Point Cloud Library Three-Dimensional Object Recognition and 6 DoF Pose Estimation
PCL提出四种校验
1. Hypotheses Verification,一次只校验一个假设: CAD-Model Recognition and 6DOF Pose Estimation Using 3D Cues;
bool PCLAlgorithm::HypothesesVerification(const PointCloudXYZ &target, const PointCloudXYZ &cloud_registration) { if(target.size() > 0 && cloud_registration.size() > 0) { std::vector<PointCloudXYZ::ConstPtr> registered_instances; registered_instances.push_back(cloud_registration.makeShared()); std::vector<bool> hypotheses_mask; // Mask Vector to identify positive hypotheses boost::shared_ptr<pcl::HypothesisVerification<pcl::PointXYZ, pcl::PointXYZ>> Hv; Hv->setSceneCloud (target.makeShared()); // Scene Cloud Hv->addModels (registered_instances, true); //Models to verify Hv->setResolution (0.001f); Hv->setInlierThreshold (0.001f); Hv->setOcclusionThreshold (0.001f); //遮挡阈值 Hv->verify (); Hv->getMask (hypotheses_mask); // i-element TRUE if hvModels[i] verifies hypotheses if(hypotheses_mask[0]) { PCL_INFO("Good registration! \n"); return hypotheses_mask[0]; } else { PCL_ERROR("Wrong registration! \n"); return false; } } else { PCL_ERROR("No data after registration! \n"); return false; } }2.Global Hypotheses Verification,是第1种的升级版,一次校验多个假设,PCL官网教程和博客上代码非常多,这里不再赘述:A Global Hypotheses Verification Method for 3D Object Recognition;
3. Greedy Verification,贪婪,数据结构和算法里的经典算法之一;
4. Papazov Hypotheses Verification,通过RANSAC
更新中。。。
