PCL 포인트 클라우드 라이브러리에서 자주 사용하는 팁

4716 단어 기교를 쓰다
1. 포인트 클라우드 데이터 저장
//    ASSIC(      )
pcl::PCDWriter writer;
writer.write(s_pcd,laserCloudIn);

//bin  (      )
pcl::io::savePCDFileBinary(s_pcd, *cloud);

2. 점 구름이 X, Y, Z축에 있는 극값 찾기
pcl::PointXYZ minPt, maxPt;
pcl::getMinMax3D (*cloud, minPt, maxPt);

3. 저장할 점의 인덱스를 알면 원점 구름에서 새 점 구름으로 어떻게 복사합니까?
pcl::PointCloud<:pointxyz>::Ptr cloudOut(new pcl::PointCloud<:pointxyz>);
std::vector indexs = { 1, 2, 5 };
pcl::copyPointCloud(*cloud, indexs, *cloudOut);

4. 점구름에서 어떻게 점을 삭제하고 추가합니까?
pcl::PointCloud<:pointxyz>::iterator index = cloud->begin();
cloud->erase(index);//     
index = cloud->begin() + 5;
cloud->erase(index);//   5 
pcl::PointXYZ point = { 1, 1, 1 };
//     5        ,          
cloud->insert(cloud->begin() + 5, point);
cloud->push_back(point);//          

5. 점운에 대해 전역 또는 국부 변환을 어떻게 하는가
//  
pcl::transformPointCloud(*cloud,*transform_cloud1,transform_1);
        
//  
//        ,                 ,        ,        。
pcl::transformPointCloud(*cloud,pcl::PointIndices indices,*transform_cloud1,matrix); 

6. 두 점 클라우드 필드 링크(두 점 클라우드 크기는 같아야 함)
pcl::PointCloud<:pointnormal>::Ptr cloud_with_nomal (new pcl::PointCloud<:pointnormal>);
pcl::concatenateFields(*cloud,*cloud_normals,*cloud_with_nomal);

7. 점 구름에서 잘못된 점을 삭제하는 방법
vector indices;
pcl::removeNaNFromPointCloud(*cloud,*output,indices);

8. 질량 중심 계산
Eigen::Vector4f centroid;//  
pcl::compute3DCentroid(*cloud_smoothed,centroid); //       

9. 점운의 법방향량을 계산한다
pcl::NormalEstimation<:pointxyz pcl::normal=""> ne;
pcl::PointCloud<:normal>::Ptr pcNormal(new pcl::PointCloud<:normal>);  
pcl::search::KdTree<:pointxyz>::Ptr tree(new pcl::search::KdTree<:pointxyz>);
tree->setInputCloud(inCloud);  
ne.setInputCloud(inCloud);  
ne.setSearchMethod(tree);  
ne.setKSearch(50);  
//ne->setRadiusSearch (0.03);   
ne.compute(*pcNormal);

10. 점운을 추출하는 경계
pcl::PointCloud<:boundary> boundaries; //        pcl::BoundaryEstimation<:pointxyz pcl::normal="" pcl::boundary=""> boundEst; //               
pcl::NormalEstimation<:pointxyz pcl::normal=""> normEst; //           
pcl::PointCloud<:normal>::Ptr normals(new pcl::PointCloud<:normal>); //         
pcl::PointCloud<:pointxyz>::Ptr cloud_boundary (new pcl::PointCloud<:pointxyz>); 
normEst.setInputCloud(pcl::PointCloud<:pointxyz>::Ptr(cloud)); 
normEst.setRadiusSearch(reforn); //         
normEst.compute(*normals); //          normals

 
boundEst.setInputCloud(cloud); //       
boundEst.setInputNormals(normals); //         ,           
boundEst.setRadiusSearch(re); //            
boundEst.setAngleThreshold(M_PI/4); //          
boundEst.setSearchMethod(pcl::search::KdTree<:pointxyz>::Ptr (new pcl::search::KdTree<:pointxyz>)); //      KdTree
boundEst.compute(boundaries); //          boundaries

11.k 근린과 반경 검색
pcl::KdTreeFLANN<:pointxyz>kdtree; //  kdtree    
kdtree.setInputCloud(cloud);           //    
pcl::PointXYZ searchPoint;              //          
//K    
int K = 10;                             //        
vectorpointIdxNKNSearch(K);        //         
vectorpointNKNSquaredDistance(K);//       
kdtree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance)
//     
std::vector pointIdxRadiusSearch;
std::vector pointRadiusSquaredDistance;
float radius; //      
kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance);

12. 새로운 점 클라우드 클래스 추가
//                    PCL     
#include   
//                 
// :     
#include 

//         
struct PointXYZIR
{
  PCL_ADD_POINT4D
  float intensity;
  uint16_t ring;                   ///< laser ring number
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW  //  new     
} EIGEN_ALIGN16; //  SSE  

POINT_CLOUD_REGISTER_POINT_STRUCT(PointXYZIR, (float, x, x)(float, y, y)(float, z, z)(float, intensity, intensity)(uint16_t, ring, ring))

좋은 웹페이지 즐겨찾기