2017-10-16 1 views
0

PCL (Point Cloud Library)에서 새로운데 맞춤형 데이터 세트에 supervoxel_clustering (this link)을 구현하려고했습니다. 내 포인트 클라우드 데이터 세트는 다음 필드를 포함합니다. X Y Z R G B L1 L2 여기서 R, G, B는 integer 값이 0-255이고 L1과 L2가 integer 레이블입니다.PCL (Point Cloud Library)에서 supervoxel 클러스터링 프로세스 동안 사용자 정의 필드 유지

는 supervoxel을 적용한 후, 나는 그들의 레이블 포인트 구름을 저장

/// save the labeled cloud 
PointLCloudT::Ptr labeled_cloud = super.getLabeledCloud(); 
pcl::io::savePCDFileASCII("/path/labeled_cloud.pcd", *labeled_cloud); 

내 질문은 : 구름 과정에서 원래의 지점에서 내 레이블과 색상을 전송하는 방법. 내 포인트 유형을 정의하려고합니다 : X Y Z R G B L1 L2 L3,하지만 점 유형에 대한 자습서에서는 그렇게하는 것이 쉽지 않습니다. 내가 생각하고있는 하나의 모호한 해결책은 KD 트리를 사용하고 supervoxel 결과에서 원래 점으로 레이블을 전송하지만 여전히 pcl의 모든 사용자 정의 필드로 원래 원래 점을 읽을 필요가 있습니다.

누구나 도움이 될 수 있습니까?

덕분에, 브루스

답변

1

나는 당신이 이미 L1 및 L2 필드 지점 유형을 정의 이해합니다.

점은 supervoxel_clustering에서 가져온 것과 동일한 순서로 나오고 getLabeledCloud() 메서드는 모든 원래 점을 반환합니다. 가장 쉬운 해결책은 L1, L2 및 L3 필드로 포인트 클라우드를 정의하고 원래의 포인트 클라우드를 해당 유형으로 복사 한 다음 클라우드를 반복하고 labeled_cloud에서 라벨을 복사하는 것입니다.

pcl::PointCloud<your_custom_point_type_with_L1_L2_L3> combined_cloud; 
pcl::copyPointCloud(original_cloud, combined_cloud); 

for (int i = 0; i < labeled_cloud->point.size(); i++){ 
    combined_cloud[i].label3 = labeled_cloud[i].label; 
} 
+0

같은

뭔가 답변 주셔서 감사합니다. 나는이 솔루션을 생각하고 있었지만 쉽지만 안전하지는 않습니다. 왜냐하면 supervoxle 프로세스 중에 원본 점 중 하나가 제거되거나 NaN 값이 있거나 다른 이유로 주문이 변경되면 레이블을 복사하면 엉망이되기 때문입니다. – Bruce

+0

하지만 나노 값을 필터링합니까? 나는 그렇지 않다고 생각한다. 귀하의 예제에서 milk_cartoon_all_small_clorox.pcd 포인트 클라우드를 보면 nan (xyz는 색상 값 있음) 점이있는 것처럼 보이지만 getLabeledCloud() 메소드는 정확히 동일한 양의 점과 xyz 데이터를 갖는 점을 정확히 반환합니다 일치합니다. – Rooscannon

+0

추가 std :: cout << cloud-> 점 [0] << "\ n"<< cloud-> 점 [1] << "\ n"; 예제 코드에서 그것은 (유모, 유모, 유모 - 18,23,9,0) 인쇄 할 수 있습니다 (유모, 유모, 유모를 - 18,21,11,0) 는 구현 삭제합니까 전철기? – Rooscannon