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 면 형식 에서 점 구름 형식 으로 바 꿀 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.