pcl 상용 지식

시간 계산
pcl 에 서 는 프로그램 운행 시간 을 계산 하 는 함수 가 많 습 니 다. 그 중에서 콘 솔 을 이용 한 시간 계산 은 먼저 헤더 파일 #include 을 포함해 야 합 니 다. 그 다음 에 pcl::console::TicToc time; time.tic(); + + cout< “ ” 。어떻게 pcl:: PointCloud:: Ptr 와 pcl:: PointCloud 와 유사 한 두 가지 종류의 상호 전환 을 실현 합 니까?
#include 
#include 
#include 
 
pcl::PointCloud<:pointxyz>::Ptr cloudPointer(new pcl::PointCloud<:pointxyz>);
pcl::PointCloud<:pointxyz> cloud;
cloud = *cloudPointer;
cloudPointer = cloud.makeShared();

어떻게 점 운 의 x, y, z 의 극치 를 찾 습 니까?
#include 
#include 
#include 
pcl::PointCloud<:pointxyz>::Ptr cloud;
cloud = pcl::PointCloud<:pointxyz>::Ptr (new pcl::PointCloud<:pointxyz>);
pcl::io::loadPCDFile<:pointxyz> ("your_pcd_file.pcd", *cloud);
pcl::PointXYZ minPt, maxPt;
pcl::getMinMax3D (*cloud, minPt, maxPt);

만약 저장 점 의 색인 이 필요 하 다 는 것 을 알 고 있다 면, 어떻게 원점 구름 에서 새로운 점 구름 으로 복사 합 니까?
#include 
#include 
#include 
#include 
 
pcl::PointCloud<:pointxyz>::Ptr cloud(new pcl::PointCloud<:pointxyz>);
pcl::io::loadPCDFile<:pointxyz>("C:\office3-after21111.pcd", *cloud);
pcl::PointCloud<:pointxyz>::Ptr cloudOut(new pcl::PointCloud<:pointxyz>);
std::vector indexs = { 1, 2, 5 };
pcl::copyPointCloud(*cloud, indexs, *cloudOut);

어떻게 점 구름 에서 점 을 삭제 하고 추가 합 니까?
#include 
#include 
#include 
#include 
 
pcl::PointCloud<:pointxyz>::Ptr cloud(new pcl::PointCloud<:pointxyz>);
pcl::io::loadPCDFile<:pointxyz>("C:\office3-after21111.pcd", *cloud);
pcl::PointCloud<:pointxyz>::iterator index = cloud->begin();
cloud->erase(index);//     
index = cloud->begin() + 5;
cloud->erase(cloud->begin());//   5 
pcl::PointXYZ point = { 1, 1, 1 };
//     5   1     ,        
cloud->insert(cloud->begin() + 5, point);
cloud->push_back(point);//          
std::cout << cloud->points[5].x;//  1

삭 제 된 점 이 너무 많 으 면 위의 방법 으로 새로운 점 구름 에 복사 한 다음 에 원점 구름 에 값 을 부여 하 는 것 을 권장 합 니 다. 많은 점 을 추가 하려 면 먼저 resize 를 한 다음 에 순환 으로 점 구름 에 추가 하 는 것 을 권장 합 니 다.
어떻게 점 운 에 대해 전역 또는 국부 변환 을 진행 합 니까
#include 
#include 
#include 
#include 
#include 
        pcl::PointCloud<:pointxyz>::Ptr cloud (new pcl::PointCloud<:pointxyz>);
        pcl::io::loadPCDFile("path/.pcd",*cloud);
//    
 //      
        Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();
        float theta = M_PI/4;   //     ,   45 
        transform_1 (0,0) = cos (theta);  //     Z   
        transform_1 (0,1) = -sin(theta);
        transform_1 (1,0) = sin (theta);
        transform_1 (1,1) = cos (theta);
        //   transform_1 (0,2) = 0.3;   //         
        //   transform_1 (1,2) = 0.6;
        //    transform_1 (2,2) = 1;
        transform_1 (0,3) = 25; //   X   
        transform_1 (1,3) = 30;
        transform_1 (2,3) = 380;
        pcl::PointCloud<:pointxyz>::Ptr transform_cloud1 (new pcl::PointCloud<:pointxyz>);
        pcl::transformPointCloud(*cloud,*transform_cloud1,transform_1);  //    
        
        //  
        pcl::transformPointCloud(*cloud,pcl::PointIndices indices,*transform_cloud1,matrix); //        ,                 ,        ,        。

두 점 클 라 우 드 필드 연결 (두 점 클 라 우 드 크기 가 같 아야 합 니 다)
         pcl::PointCloud<:pointxyz>::Ptr cloud (new pcl::PointCloud<:pointxyz>);
         pcl::io::loadPCDFile("/home/yxg/pcl/pcd/mid.pcd",*cloud);
         pcl::NormalEstimation<:pointxyz> ne;
        ne.setInputCloud(cloud);
        pcl::search::KdTree<:pointxyz>::Ptr tree (new pcl::search::KdTree<:pointxyz>());
        ne.setSearchMethod(tree);
        pcl::PointCloud<:normal>::Ptr cloud_normals(new pcl::PointCloud<:normal>()); 
        ne.setKSearch(8);
        //ne.setRadisuSearch(0.3);
        ne.compute(*cloud_normals);    
        pcl::PointCloud<:pointnormal>::Ptr cloud_with_nomal (new pcl::PointCloud<:pointnormal>);
        pcl::concatenateFields(*cloud,*cloud_normals,*cloud_with_nomal);

어떻게 점 구름 에서 무효 점 을 삭제 합 니까?
pcl 의 무효 점 은 점 의 특정한 좌표 값 이 nan 이라는 것 을 말 합 니 다.
 #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    typedef pcl::PointXYZRGBA point;
    typedef pcl::PointCloud CloudType;
    
    int main (int argc,char **argv)
    {
            CloudType::Ptr cloud (new CloudType);
            CloudType::Ptr output (new CloudType);
    
            
            pcl::io::loadPCDFile(argv[1],*cloud);
            cout<size()< indices;
            pcl::removeNaNFromPointCloud(*cloud,*output,indices);
            cout<size()<

xyzrgb 형식 을 xyz 형식의 점 구름 으로 변환 합 니 다.
#include 
#include 
#include 
#include 
#include 

using namespace std;
typedef pcl::PointXYZ point;
typedef pcl::PointXYZRGBA pointcolor;

int main(int argc,char **argv)
{
        pcl::PointCloud::Ptr input (new pcl::PointCloud);
        pcl::io::loadPCDFile(argv[1],*input);
        

        pcl::PointCloud::Ptr output (new pcl::PointCloud);
        int M = input->points.size();
        cout<points[i].x;
                p.y = input->points[i].y;
                p.z = input->points[i].z; 
                output->points.push_back(p);
        }
        output->width = 1;
        output->height = M;
        
        cout<< "size is"<size()<

flann kdtree 조회 k 근린
   //      
        pcl::KdTreeFLANN<:pointxyz> kdtree;  //      k    ,            ,           
        kdtree.setInputCloud(cloud);
        int k =2;
        float everagedistance =0;
        for (int i =0; i < cloud->size()/2;i++)
        {
                vector nnh ;
                vector squaredistance;
                //  pcl::PointXYZ p;
                //   p = cloud->points[i];
                kdtree.nearestKSearch(cloud->points[i],k,nnh,squaredistance);
                everagedistance += sqrt(squaredistance[1]);
                //   cout<size()/2);
        cout<
#include 
        pcl::KdTreeFLANN<:pointxyz> kdtree; //  KDtree
        kdtree.setInputCloud (in_cloud);
        pcl::PointXYZ searchPoint; //     ,(       )
        searchPoint.x = 1;
        searchPoint.y = 2;
        searchPoint.z = 3;

        //        
        int k = 10; //      
        std::vector pointIdxNKNSearch(k); //         
        std::vectorpointNKNSquareDistance(k); //       
        if (kdtree.nearestKSearch(searchPoint,k,pointIdxNKNSearch,pointNKNSquareDistance)>0)
        {
                for (size_t i = 0; i < pointIdxNKNSearch.size (); ++i)
                        std::cout << "    "  <<   in_cloud->points[ pointIdxNKNSearch[i] ].x 
                                  << " " << in_cloud->points[ pointIdxNKNSearch[i] ].y 
                                  << " " <points[ pointIdxNKNSearch[i] ].z 
                                  << " (squared distance: " < pointIdxRadiusSearch;  //          
        std::vector a;
        if ( kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, a) > 0 )
        {
          for (size_t i = 0; i < pointIdxRadiusSearch.size (); ++i)
                  std::cout << "    "  <<   in_cloud->points[ pointIdxRadiusSearch[i] ].x 
                            << " " <points[ pointIdxRadiusSearch[i] ].y 
                            << " " << in_cloud->points[ pointIdxRadiusSearch[i] ].z 
                            << " (squared distance: " <

파일
접 두 사 는 ply 형식 파일 로 자주 사용 되 는 점 클 라 우 드 데이터 파일 입 니 다..ply 파일 은 ply 데 이 터 를 저장 할 수 있 을 뿐만 아니 라 데 이 터 를 저장 할 수 있 습 니 다. emacs 로 파일 을 열 어 표 두 를 관찰 합 니 다. 표 두 ply 의 값 이 0 이면 ze 는 이 파일 을 점 클 라 우 드 파일 이 라 고 표시 합 니 다. element face 의 값 이 특정한 정수 N 이면 이 파일 을 격자 파일 이 라 고 표시 합 니 다.N 개의 격자 가 포함 되 어 있 습 니 다. 따라서 pcl 을 이용 하여 ply 파일 을 읽 습 니 다. element face 로 만 읽 을 수 없습니다.pcl::PointCloud::Ptr cloud (new pcl::PointCloud) 파일 을 읽 을 때 이 파일 이 점 구름 인지 격자 류 파일 인지 먼저 구분 해 야 합 니 다.점 클 라 우 드 파일 이 라면 일반적인 점 클 라 우 드 류 에 따라 읽 으 면 됩 니 다. 홈 페이지 의 예 는 이 렇 습 니 다.ply 파일 이 격자 류 라면 필요 합 니 다.
    pcl::PolygonMesh mesh;
    pcl::io::loadPLYFile(argv[1],mesh);
    pcl::io::savePLYFile("result.ply", mesh);

읽다(홈 페이지 예 가 성공 한 이 유 는 모델 을 세분 화하 여 격자 가 점 이 되 었 기 때 문 입 니 다)
계산 점 의 색인
예 를 들 어 sift 알고리즘 에서 pcl 은 색인 을 직접 제공 할 수 없습니다. (주요 원인 은 sift 점 은 계산 을 통 해 나 온 것 입 니 다. 특정한 매개 변수 에서 sift 점 은 원본 데이터 의 점 이 아니 라 일부 점 의 유사 성 일 수 있 습 니 다) 색인 을 얻 으 려 면 다음 과 같은 함 수 를 이용 할 수 있 습 니 다.
void getIndices (pointcloud::Ptr cloudin, pointcloud keypoints, pcl::PointIndices::Ptr indices)
{
        pcl::KdTreeFLANN<:pointxyz> kdtree;
        kdtree.setInputCloud(cloudin);
        std::vectorpointNKNSquareDistance; //       
        std::vector pointIdxNKNSearch;

        for (size_t i =0; i < keypoints.size();i++)
        {
                kdtree.nearestKSearch(keypoints.points[i],1,pointIdxNKNSearch,pointNKNSquareDistance);
                // cout<indices.push_back(pointIdxNKNSearch[0]);
                
        }

}

그 사상 은 원시 데 이 터 를 flann 의 kdtree 에 삽입 하여 키 포인트 의 가장 가 까 운 이웃 을 찾 고 거리 가 0 이면 같은 점 임 을 설명 하고 색인 을 추출 하면 된다 는 것 이다.
계산 질량 심
     Eigen::Vector4f centroid;  //  
     pcl::compute3DCentroid(*cloud_smoothed,centroid); //       

격자 에서 정점 추출 (격자 를 점 으로 변환)
#include 
#include 
#include 
#include 
#include 
#include //loadPolygonFileOBJ     ;
#include 
#include 
#include 
using namespace pcl;
int main(int argc,char **argv)
{
        pcl::PolygonMesh mesh;
        //   pcl::io::loadPolygonFileOBJ(argv[1], mesh);
        pcl::io::loadPLYFile(argv[1],mesh);
        pcl::PointCloud<:pointxyz>::Ptr cloud(new pcl::PointCloud<:pointxyz>);
        pcl::fromPCLPointCloud2(mesh.cloud, *cloud);
        pcl::io::savePCDFileASCII("result.pcd", *cloud);
return 0;
}

이상 코드 는. obj 또는. ply 면 형식 에서 점 구름 형식 으로 바 꿀 수 있 습 니 다.

좋은 웹페이지 즐겨찾기