-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Hao Guo <[email protected]>
- Loading branch information
1 parent
34c1e71
commit c294fc7
Showing
15 changed files
with
41,935 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) | ||
project(resampling) | ||
find_package(PCL 1.2 REQUIRED) | ||
include_directories(${PCL_INCLUDE_DIRS}) | ||
link_directories(${PCL_LIBRARY_DIRS}) | ||
add_definitions(${PCL_DEFINITIONS}) | ||
add_executable (resampling resampling.cpp) | ||
target_link_libraries (resampling ${PCL_LIBRARIES}) |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#include <pcl/point_types.h> | ||
#include <pcl/io/pcd_io.h> | ||
#include <pcl/kdtree/kdtree_flann.h> | ||
#include <pcl/surface/mls.h> | ||
int | ||
main (int argc, char** argv) | ||
{// 将一个适当类型的输入文件加载到对象PointCloud中 | ||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ()); | ||
// 加载bun0.pcd文件,加载的文件在 PCL的测试数据中是存在的 | ||
pcl::io::loadPCDFile ("table_scene_lms400_downsampled.pcd", *cloud); | ||
// 创建一个KD树 | ||
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>); | ||
// 输出文件中有PointNormal类型,用来存储移动最小二乘法算出的法线 | ||
pcl::PointCloud<pcl::PointNormal> mls_points; | ||
// 定义对象 (第二种定义类型是为了存储法线, 即使用不到也需要定义出来) | ||
pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls; | ||
mls.setComputeNormals (true); | ||
//设置参数 | ||
mls.setInputCloud (cloud); | ||
mls.setPolynomialFit (true); | ||
mls.setSearchMethod (tree); | ||
mls.setSearchRadius (0.03); | ||
// 曲面重建 | ||
mls.process (mls_points); | ||
// 保存结果 | ||
pcl::io::savePCDFile ("bun0-mls.pcd", mls_points); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) | ||
|
||
project(concave_hull_2d) | ||
|
||
find_package(PCL 1.2 REQUIRED) | ||
|
||
include_directories(${PCL_INCLUDE_DIRS}) | ||
link_directories(${PCL_LIBRARY_DIRS}) | ||
add_definitions(${PCL_DEFINITIONS}) | ||
|
||
add_executable (concave_hull_2d concave_hull_2d.cpp) | ||
target_link_libraries (concave_hull_2d ${PCL_LIBRARIES}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
#include <pcl/ModelCoefficients.h> | ||
#include <pcl/io/pcd_io.h> | ||
#include <pcl/point_types.h> | ||
#include <pcl/sample_consensus/method_types.h> | ||
#include <pcl/sample_consensus/model_types.h> | ||
#include <pcl/filters/passthrough.h> | ||
#include <pcl/filters/project_inliers.h> | ||
#include <pcl/segmentation/sac_segmentation.h> | ||
#include <pcl/surface/concave_hull.h> | ||
|
||
int | ||
main (int argc, char** argv) | ||
{ | ||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>), | ||
cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>), | ||
cloud_projected (new pcl::PointCloud<pcl::PointXYZ>); | ||
pcl::PCDReader reader; | ||
|
||
reader.read ("table_scene_mug_stereo_textured.pcd", *cloud); | ||
// Build a filter to remove spurious NaNs | ||
pcl::PassThrough<pcl::PointXYZ> pass; | ||
pass.setInputCloud (cloud); | ||
pass.setFilterFieldName ("z"); | ||
pass.setFilterLimits (0, 1.1); | ||
pass.filter (*cloud_filtered); | ||
std::cerr << "PointCloud after filtering has: " | ||
<< cloud_filtered->points.size () << " data points." << std::endl; | ||
|
||
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); | ||
pcl::PointIndices::Ptr inliers (new pcl::PointIndices); | ||
// Create the segmentation object | ||
pcl::SACSegmentation<pcl::PointXYZ> seg; | ||
// Optional | ||
seg.setOptimizeCoefficients (true); | ||
// Mandatory | ||
seg.setModelType (pcl::SACMODEL_PLANE); | ||
seg.setMethodType (pcl::SAC_RANSAC); | ||
seg.setDistanceThreshold (0.01); | ||
|
||
seg.setInputCloud (cloud_filtered); | ||
seg.segment (*inliers, *coefficients); | ||
std::cerr << "PointCloud after segmentation has: " | ||
<< inliers->indices.size () << " inliers." << std::endl; | ||
|
||
// Project the model inliers | ||
pcl::ProjectInliers<pcl::PointXYZ> proj; | ||
proj.setModelType (pcl::SACMODEL_PLANE); | ||
proj.setInputCloud (cloud_filtered); | ||
proj.setModelCoefficients (coefficients); | ||
proj.filter (*cloud_projected); | ||
std::cerr << "PointCloud after projection has: " | ||
<< cloud_projected->points.size () << " data points." << std::endl; | ||
|
||
// Create a Concave Hull representation of the projected inliers | ||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_hull (new pcl::PointCloud<pcl::PointXYZ>); | ||
pcl::ConcaveHull<pcl::PointXYZ> chull; | ||
chull.setInputCloud (cloud_projected); | ||
chull.setAlpha (0.1); | ||
chull.reconstruct (*cloud_hull); | ||
|
||
std::cerr << "Concave hull has: " << cloud_hull->points.size () | ||
<< " data points." << std::endl; | ||
|
||
pcl::PCDWriter writer; | ||
writer.write ("table_scene_mug_stereo_textured_hull.pcd", *cloud_hull, false); | ||
|
||
return (0); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) | ||
|
||
project(greedy_projection) | ||
|
||
find_package(PCL 1.2 REQUIRED) | ||
|
||
include_directories(${PCL_INCLUDE_DIRS}) | ||
link_directories(${PCL_LIBRARY_DIRS}) | ||
add_definitions(${PCL_DEFINITIONS}) | ||
|
||
add_executable (greedy_projection greedy_projection.cpp) | ||
target_link_libraries (greedy_projection ${PCL_LIBRARIES}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
#include <pcl/point_types.h> | ||
#include <pcl/io/pcd_io.h> | ||
#include <pcl/kdtree/kdtree_flann.h> | ||
#include <pcl/features/normal_3d.h> | ||
#include <pcl/surface/gp3.h> | ||
#include <pcl/visualization/pcl_visualizer.h> | ||
#include <boost/thread/thread.hpp> | ||
|
||
|
||
int | ||
main (int argc, char** argv) | ||
{ | ||
// Load input file into a PointCloud<T> with an appropriate type | ||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); | ||
sensor_msgs::PointCloud2 cloud_blob; | ||
pcl::io::loadPCDFile ("table_scene_lms400_downsampled.pcd", cloud_blob); | ||
pcl::fromROSMsg (cloud_blob, *cloud); | ||
//* the data should be available in cloud | ||
|
||
// Normal estimation* | ||
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n; | ||
pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal>); | ||
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>); | ||
tree->setInputCloud (cloud); | ||
n.setInputCloud (cloud); | ||
n.setSearchMethod (tree); | ||
n.setKSearch (20); | ||
n.compute (*normals); | ||
//* normals should not contain the point normals + surface curvatures | ||
|
||
// Concatenate the XYZ and normal fields* | ||
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals (new pcl::PointCloud<pcl::PointNormal>); | ||
pcl::concatenateFields (*cloud, *normals, *cloud_with_normals); | ||
//* cloud_with_normals = cloud + normals | ||
|
||
// Create search tree* | ||
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2 (new pcl::search::KdTree<pcl::PointNormal>); | ||
tree2->setInputCloud (cloud_with_normals); | ||
|
||
// Initialize objects | ||
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3; | ||
pcl::PolygonMesh triangles; | ||
|
||
// Set the maximum distance between connected points (maximum edge length) | ||
gp3.setSearchRadius (0.025); | ||
|
||
// Set typical values for the parameters | ||
gp3.setMu (2.5); | ||
gp3.setMaximumNearestNeighbors (100); | ||
gp3.setMaximumSurfaceAngle(M_PI/4); // 45 degrees | ||
gp3.setMinimumAngle(M_PI/18); // 10 degrees | ||
gp3.setMaximumAngle(2*M_PI/3); // 120 degrees | ||
gp3.setNormalConsistency(false); | ||
|
||
// Get result | ||
gp3.setInputCloud (cloud_with_normals); | ||
gp3.setSearchMethod (tree2); | ||
gp3.reconstruct (triangles); | ||
// std::cout << triangles; | ||
// Additional vertex information | ||
std::vector<int> parts = gp3.getPartIDs(); | ||
std::vector<int> states = gp3.getPointStates(); | ||
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer")); | ||
viewer->setBackgroundColor (0, 0, 0); | ||
viewer->addPolygonMesh(triangles,"my"); | ||
|
||
viewer->addCoordinateSystem (1.0); | ||
viewer->initCameraParameters (); | ||
// Ö÷Ñ»· | ||
while (!viewer->wasStopped ()) | ||
{ | ||
viewer->spinOnce (100); | ||
boost::this_thread::sleep (boost::posix_time::microseconds (100000)); | ||
} | ||
// Finish | ||
return (0); | ||
} |
Oops, something went wrong.