2017-11-22 2 views
3

PCL을 사용하여 점 구름의 법선을 계산합니다. Meshlab을 사용하면 모든 법선이 외부에서 내부까지 있지만 법선이 올바른 것입니다. 모두 반전하면 법칙이 올바른 것입니다.PCL은 일부 부품에서 잘못된 법선 방향을 추정합니다.

그러나 PCL을 사용하면 왼쪽 그림과 같이 일부 법선의 방향이 잘못됩니다.

enter image description here

은 PCL에 의해 추정 된 정상으로, 내가 올바른 결과를 얻을 수 없다, 더 의미, meshlab 및 PCL를 사용하여 아래의 재구성 표면을 확인하십시오. enter image description here

내 코드에 따라 내 샘플 .ply 데이터가 here, 그리고 내 모델은 여기에서 볼 수 있습니다, 내가 반경, 이웃과 중심 위치의 수를 변경하는 시도로하지만,이 문제를 해결 coundn't.

cout << "begin normal estimation" << endl; 
NormalEstimationOMP<PointXYZ, Normal> ne; 
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>()); 
ne.setSearchMethod(tree); 
ne.setNumberOfThreads(8); 
ne.setInputCloud(filtered); 
ne.setKSearch(15); 
ne.setRadiusSearch(5); 

Eigen::Vector4f centroid; 
compute3DCentroid(*filtered, centroid); 
ne.setViewPoint(centroid[0], centroid[1], centroid[2]); 

PointCloud<Normal>::Ptr cloud_normals (new PointCloud<Normal>()); 
ne.compute(*cloud_normals); 
cout << "normal estimation complete" << endl; 

아마도 다른 매개 변수를 조정해야합니까? 또는 더 나은 방법으로 전환 하시겠습니까? 관심을 가져 주셔서 감사합니다!

답변

2

사용자의 시점이 개체의 가운데에 있으며 지점이 감지 된 위치가 아닙니다. 모든 법선은 시점 뒤쪽에 단단한 물체가 있다는 생각으로 시점을 향해 (또는 멀리 서서) 지향됩니다. 귀하의 경우에는 그렇지 않습니다.

포인트가 실제로 감지 된 위치로 뷰 포인트를 설정하고 그 포인트에 따라 방향을 지정할 수 있습니다.

귀하의 경우 옵션이 아니라면 이와 같은 조치를 취할 수 있습니다.

  1. 은 일반 당신이 그것을 할 수와 에서 제거 아마 (가 다 표시 할 방법은 경우

  2. 시작하고 확인하는 곳에서 임의의 지점을 선택 이웃 검색 반경을 선택 클라우드 또는 pointIndices).

  3. 그런 다음 이웃을 선택하고 법선이 동일한 경우 (내결색 제품인 경우) 을 선택하십시오. 그렇지 않다면 뒤집어서 완료 표시하십시오.

  4. 이 점에 대한 이웃을 찾고 모든 점을 반복하십시오.

이 트릭을 수행해야합니다. 반지름을 가지고 노는 것이 좋습니다. "손가락"의 반대쪽에서 점을 선택하고 싶지는 않습니다.

AFAIK PCL은 결합 된 "전체"스캔의 정상적인 방향을 결정하는 진정으로 강력한 방법을 가지고 있지 않습니다.

+0

예, 관측점이 문제이지만 내 클라우드에 대한 올바른 시점을 찾을 수 없습니다. 두 번째 제안은 내 생각에는 효과가 있지만 너무 많은 작업이 필요하므로 마침내 법선을 직접 계산하기로 결정했습니다. 귀하의 제안에 감사드립니다! –