PCL - ICP代碼研讀(十九 ) - CorrespondenceRejectorDistance實現
前言
getRemainingCorrespondences
函數是CorrespondenceRejector
類別的核心,由CorrespondenceRejector
的子類別各自實作。
它接受original_correspondences
作為輸入,使用一定的判斷條件拒絕掉部分點對,最後將結果保存到remaining_correspondences
裡。
注意到它是一個virtual函數,所以CorrespondenceRejector
的各子類別會有不同的實現方式。
本篇對應到correspondence_rejection_distance.cpp
這個檔案。
getRemainingCorrespondences函數
從CorrespondenceRejectorDistance
這個類別的名稱就可以看出來,它是以點對的距離為拒絕的標準。
CorrespondenceRejectorDistance::getRemainingCorrespondences
的具體實現如下:接受original_correspondences
作為輸入,拒絕掉其中距離平方超過max_distance_
的點對,最後將結果保存到remaining_correspondences
裡。
#include <pcl/registration/correspondence_rejection_distance.h>
//
void
pcl::registration::CorrespondenceRejectorDistance::getRemainingCorrespondences(
const pcl::Correspondences& original_correspondences,
pcl::Correspondences& remaining_correspondences)
{
unsigned int number_valid_correspondences = 0;
remaining_correspondences.resize(original_correspondences.size());
for (const auto& original_correspondence : original_correspondences) {
if (data_container_) {
調用DataContainer::getCorrespondenceScore計算配對original_correspondence
的距離平方,檢查是否小於max_distance_
(距離平方的閾值),最後把符合資格者填入remaining_correspondences
:
// score小於max_distance_的才加入remaining_correspondences
if (data_container_->getCorrespondenceScore(original_correspondence) <
max_distance_) {
remaining_correspondences[number_valid_correspondences] =
original_correspondence;
++number_valid_correspondences;
}
}
else分支的邏輯與if分支大同小異:
else {
// correspondence中距離小於max_distance_的才加入remaining_correspondences
if (original_correspondence.distance < max_distance_) {
remaining_correspondences[number_valid_correspondences] =
original_correspondence;
++number_valid_correspondences;
}
}
}
remaining_correspondences.resize(number_valid_correspondences);
}