Search-Octree-PCL-Cpp (70%)
PCL-CPP κΈ°λ° Octree νμ
μ½λλ [μ΄κ³³]μμ λ€μ΄λ‘λ κ°λ₯ν©λλ€. μννμΌμ [cloud_cluster_0.pcd]μ μ¬μ©νμμ΅λλ€.
#include <pcl/io/pcd_io.h>
#include <pcl/octree/octree_search.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/point_types.h>
#include <iostream>
#include <vector>
//Spatial Partitioning and Search Operations with Octrees
//http://pointclouds.org/documentation/tutorials/octree.php#octree-search
//Commnets : Hunjung, Lim (hunjung.lim@hotmail.com)
int main()
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
// *.PCD νμΌ μ½κΈ° (https://raw.githubusercontent.com/adioshun/gitBook_Tutorial_PCL/master/Intermediate/sample/cloud_cluster_0.pcd)
pcl::io::loadPCDFile<pcl::PointXYZRGB>("cloud_cluster_0.pcd", *cloud);
// μκ°μ νμΈμ μν΄ μμ ν΅μΌ (255,255,255)
for (size_t i = 0; i < cloud->points.size(); ++i){
cloud->points[i].r = 255;
cloud->points[i].g = 255;
cloud->points[i].b = 255;
}
//Octree μ€λΈμ νΈ μμ±
float resolution = 0.03f; //볡μ
ν¬κΈ° μ€μ (Set octree voxel resolution)
pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGB> octree(resolution);
octree.setInputCloud(cloud); // μ
λ ₯
octree.addPointsFromInputCloud(); //Octree μμ± (Build Octree)
//κΈ°μ€μ (searchPoint) μ€μ λ°©λ² #1(x,y,z μ’ν μ§μ )
//pcl::PointXYZRGB searchPoint;
//searchPoint.x = 0.026256f;
//searchPoint.y = -1.464739f;
//searchPoint.z = 0.929567f;
//κΈ°μ€μ (searchPoint) μ€μ λ°©λ² #2(3000λ²μ§Έ ν¬μΈνΈ)
pcl::PointXYZRGB searchPoint = cloud->points[3000];
//κΈ°μ€μ μ’ν μΆλ ₯
std::cout << "searchPoint :" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z << std::endl;
//κΈ°μ€μ κ³Ό λμΌν 볡μ
λ΄ μ‘΄μ¬ νλ νλ ν¬μΈνΈ νμ(Voxel Neighbor Search)
std::vector<int> pointIdxVec; //κ²°κ³Όλ¬Ό ν¬μΈνΈμ Index μ μ₯(Save the result vector of the voxel neighbor search)
if (octree.voxelSearch(searchPoint, pointIdxVec))
{
//μκ°μ νμΈμ μνμ¬ μμ λ³κ²½ (255,0,0)
for (size_t i = 0; i < pointIdxVec.size(); ++i){
cloud->points[pointIdxVec[i]].r = 255;
cloud->points[pointIdxVec[i]].g = 0;
cloud->points[pointIdxVec[i]].b = 0;
}
}
// κΈ°μ€μ μμ κ°κΉμ΄ μμμ€ Kλ²μ§ΈκΉμ§μ ν¬μΈνΈ νμ (K nearest neighbor search)
int K = 50; // νμν ν¬μΈνΈ μ μ€μ
std::vector<int> pointIdxNKNSearch; //Save the index result of the K nearest neighbor
std::vector<float> pointNKNSquaredDistance; //Save the index result of the K nearest neighbor
if (octree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)
{
//μκ°μ νμΈμ μνμ¬ μμ λ³κ²½ (0,255,0)
for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i){
cloud->points[pointIdxNKNSearch[i]].r = 0;
cloud->points[pointIdxNKNSearch[i]].g = 255;
cloud->points[pointIdxNKNSearch[i]].b = 0;
}
}
// νμλ μ μ μ μΆλ ₯
std::cout << "K = 50 nearest neighbors:" << pointIdxNKNSearch.size() << endl;
//κΈ°μ€μ μμ μ§μ λ λ°κ²½λ΄ ν¬μΈνΈ νμ (Neighbor search within radius)
float radius = 0.02; //νμν λ°κ²½ μ€μ (Set the search radius)
std::vector<int> pointIdxRadiusSearch; //Save the index of each neighbor
std::vector<float> pointRadiusSquaredDistance; //Save the square of the Euclidean distance between each neighbor and the search point
if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
{
//μκ°μ νμΈμ μνμ¬ μμ λ³κ²½ (0,0,255)
for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i){
cloud->points[pointIdxRadiusSearch[i]].r = 0;
cloud->points[pointIdxRadiusSearch[i]].g = 0;
cloud->points[pointIdxRadiusSearch[i]].b = 255;
}
}
// νμλ μ μ μ μΆλ ₯
std::cout << "Radius 0.02 nearest neighbors: " << pointIdxRadiusSearch.size() << endl;
// μμ±λ ν¬μΈνΈν΄λΌμ°λ μ μ₯
pcl::io::savePCDFile<pcl::PointXYZRGB>("Octree_AllinOne.pcd", *cloud);
}
κ²°κ³Ό
searchPoint :0.0346006 -1.46636 0.975463
K = 50 nearest neighbors:50
Radius 0.02 nearest neighbors: 141
μ°Έκ³ μμΉ
κ²°κ³Ό
κ° κΈ°λ₯λ³ μ½λ 3κ°
1. Neighbors within voxel search
μ½λλ [μ΄κ³³]μμ λ€μ΄λ‘λ κ°λ₯ν©λλ€. μννμΌμ [cloud_cluster_0.pcd]μ μ¬μ©νμμ΅λλ€.
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/octree/octree_search.h>
#include <iostream>
#include <vector>
#include <ctime>
int
main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile<pcl::PointXYZRGB>("cloud_cluster_0.pcd", *cloud);
float resolution = 128.0f;
pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGB> octree (resolution);
octree.setInputCloud (cloud);
octree.addPointsFromInputCloud ();
pcl::PointXYZRGB searchPoint;
searchPoint.x = 0.026256f;
searchPoint.y = -1.464739f;
searchPoint.z = 0.929567f;
// Neighbors within voxel search
std::vector<int> pointIdxVec;
if (octree.voxelSearch (searchPoint, pointIdxVec))
{
std::cout << "Neighbors within voxel search at (" << searchPoint.x
<< " " << searchPoint.y
<< " " << searchPoint.z << ")"
<< std::endl;
for (size_t i = 0; i < pointIdxVec.size (); ++i)
std::cout << " " << cloud->points[pointIdxVec[i]].x
<< " " << cloud->points[pointIdxVec[i]].y
<< " " << cloud->points[pointIdxVec[i]].z << std::endl;
}
}
κ²°κ³Ό
...
-0.00606756 -1.46653 0.797328
-0.00904433 -1.46755 0.796737
-0.0120327 -1.46887 0.795969
...
2. K nearest neighbor search
μ½λλ [μ΄κ³³]μμ λ€μ΄λ‘λ κ°λ₯ν©λλ€. μννμΌμ [cloud_cluster_0.pcd]μ μ¬μ©νμμ΅λλ€.
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/octree/octree_search.h>
#include <iostream>
#include <vector>
#include <ctime>
int
main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile<pcl::PointXYZRGB>("cloud_cluster_0.pcd", *cloud);
float resolution = 128.0f;
pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGB> octree (resolution);
octree.setInputCloud (cloud);
octree.addPointsFromInputCloud ();
pcl::PointXYZRGB searchPoint;
searchPoint.x = 0.026256f;
searchPoint.y = -1.464739f;
searchPoint.z = 0.929567f;
// K nearest neighbor search
int K = 10;
std::vector<int> pointIdxNKNSearch;
std::vector<float> pointNKNSquaredDistance;
std::cout << "K nearest neighbor search at (" << searchPoint.x
<< " " << searchPoint.y
<< " " << searchPoint.z
<< ") with K=" << K << std::endl;
if (octree.nearestKSearch (searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)
{
for (size_t i = 0; i < pointIdxNKNSearch.size (); ++i)
std::cout << " " << cloud->points[ pointIdxNKNSearch[i] ].x
<< " " << cloud->points[ pointIdxNKNSearch[i] ].y
<< " " << cloud->points[ pointIdxNKNSearch[i] ].z
<< " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;
}
}
κ²°κ³Ό
K nearest neighbor search at (0.026256 -1.46474 0.929567) with K=10
0.0262559 -1.46474 0.929567 (squared distance: 3.69042e-13)
0.0234182 -1.46435 0.929759 (squared distance: 8.24415e-06)
0.0290953 -1.46517 0.929357 (squared distance: 8.28962e-06)
0.0262519 -1.46476 0.932708 (squared distance: 9.86657e-06)
0.0262599 -1.46472 0.926419 (squared distance: 9.90814e-06)
0.0290885 -1.46518 0.932502 (squared distance: 1.68363e-05)
0.0234196 -1.46433 0.926612 (squared distance: 1.69452e-05)
0.0234169 -1.46437 0.932899 (squared distance: 1.93018e-05)
0.029102 -1.46515 0.926206 (squared distance: 1.95655e-05)
0.0205821 -1.46402 0.929919 (squared distance: 3.28378e-05)
3. Neighbors within radius search
μ½λλ [μ΄κ³³]μμ λ€μ΄λ‘λ κ°λ₯ν©λλ€. μννμΌμ [cloud_cluster_0.pcd]μ μ¬μ©νμμ΅λλ€.
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/octree/octree_search.h>
#include <iostream>
#include <vector>
#include <ctime>
int
main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile<pcl::PointXYZRGB>("cloud_cluster_0.pcd", *cloud);
float resolution = 128.0f;
pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGB> octree (resolution);
octree.setInputCloud (cloud);
octree.addPointsFromInputCloud ();
pcl::PointXYZRGB searchPoint;
searchPoint.x = 0.026256f;
searchPoint.y = -1.464739f;
searchPoint.z = 0.929567f;
// Neighbors within radius search
std::vector<int> pointIdxRadiusSearch;
std::vector<float> pointRadiusSquaredDistance;
float radius = 256.0f * rand () / (RAND_MAX + 1.0f);
std::cout << "Neighbors within radius search at (" << searchPoint.x
<< " " << searchPoint.y
<< " " << searchPoint.z
<< ") with radius=" << radius << std::endl;
if (octree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
{
for (size_t i = 0; i < pointIdxRadiusSearch.size (); ++i)
std::cout << " " << cloud->points[ pointIdxRadiusSearch[i] ].x
<< " " << cloud->points[ pointIdxRadiusSearch[i] ].y
<< " " << cloud->points[ pointIdxRadiusSearch[i] ].z
<< " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
}
}
κ²°κ³Ό
...
-0.00606756 -1.46653 0.797328
-0.00904433 -1.46755 0.796737
-0.0120327 -1.46887 0.795969
...
Last updated
Was this helpful?