-
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
0abc9c8
commit 709a1a7
Showing
7 changed files
with
319 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.6 FATAL_ERROR) | ||
project(range_image_creation) | ||
find_package(PCL 1.2 REQUIRED) | ||
include_directories(${PCL_INCLUDE_DIRS}) | ||
link_directories(${PCL_LIBRARY_DIRS}) | ||
add_definitions(${PCL_DEFINITIONS}) | ||
add_executable (range_image_creation range_image_creation.cpp) | ||
target_link_libraries (range_image_creation ${PCL_LIBRARIES}) |
31 changes: 31 additions & 0 deletions
31
第七章/1 range_image_creation/source/range_image_creation.cpp
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,31 @@ | ||
#include <pcl/range_image/range_image.h> | ||
int main (int argc, char** argv) { | ||
pcl::PointCloud<pcl::PointXYZ> pointCloud; | ||
//生成数据 | ||
for (float y=-0.5f; y<=0.5f; y+=0.01f) { | ||
for (float z=-0.5f; z<=0.5f; z+=0.01f) { | ||
pcl::PointXYZ point; | ||
point.x = 2.0f - y; | ||
point.y = y; | ||
point.z = z; | ||
pointCloud.points.push_back(point); | ||
} | ||
} | ||
pointCloud.width = (uint32_t) pointCloud.points.size(); | ||
pointCloud.height = 1; | ||
//以1度为角分辨率,从上面创建的点云创建深度图像。 | ||
float angularResolution = (float) ( 1.0f * (M_PI/180.0f)); | ||
// 1度转弧度 | ||
float maxAngleWidth = (float) (360.0f * (M_PI/180.0f)); | ||
// 360.0度转弧度 | ||
float maxAngleHeight = (float) (180.0f * (M_PI/180.0f)); | ||
// 180.0度转弧度 | ||
Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f); | ||
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME; | ||
float noiseLevel=0.00; | ||
float minRange = 0.0f; | ||
int borderSize = 1; | ||
pcl::RangeImage rangeImage; | ||
rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize); | ||
std::cout << rangeImage << "\n"; | ||
} |
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.6 FATAL_ERROR) | ||
project(range_image_border_extraction) | ||
find_package(PCL 1.3 REQUIRED) | ||
include_directories(${PCL_INCLUDE_DIRS}) | ||
link_directories(${PCL_LIBRARY_DIRS}) | ||
add_definitions(${PCL_DEFINITIONS}) | ||
add_executable (range_image_border_extraction range_image_border_extraction.cpp) | ||
target_link_libraries (range_image_border_extraction ${PCL_LIBRARIES}) |
166 changes: 166 additions & 0 deletions
166
第七章/2 range_image_border_extraction/source/range_image_border_extraction.cpp
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,166 @@ | ||
/* \author Bastian Steder */ | ||
#include <iostream> | ||
#include <boost/thread/thread.hpp> | ||
#include <pcl/range_image/range_image.h> | ||
#include <pcl/io/pcd_io.h> | ||
#include <pcl/visualization/range_image_visualizer.h> | ||
#include <pcl/visualization/pcl_visualizer.h> | ||
#include <pcl/features/range_image_border_extractor.h> | ||
#include <pcl/console/parse.h> | ||
typedef pcl::PointXYZ PointType; | ||
// -------------------- | ||
// -----参数----- | ||
// -------------------- | ||
float angular_resolution = 0.5f; | ||
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME; | ||
bool setUnseenToMaxRange = false; | ||
// -------------- | ||
// -----帮助----- | ||
// -------------- | ||
void | ||
printUsage (const char* progName) | ||
{ | ||
std::cout << "\n\nUsage: "<<progName<<" [options] <scene.pcd>\n\n" | ||
<< "Options:\n" | ||
<< "-------------------------------------------\n" | ||
<< "-r <float> angular resolution in degrees (default "<<angular_resolution<<")\n" | ||
<< "-c <int> coordinate frame (default "<< (int)coordinate_frame<<")\n" | ||
<< "-m Treat all unseen points to max range\n" | ||
<< "-h this help\n" | ||
<< "\n\n"; | ||
} | ||
// -------------- | ||
// -----主函数----- | ||
// -------------- | ||
int | ||
main (int argc, char** argv) | ||
{ | ||
// -------------------------------------- | ||
// -----解析命令行参数----- | ||
// -------------------------------------- | ||
if (pcl::console::find_argument (argc, argv, "-h") >= 0) | ||
{ | ||
printUsage (argv[0]); | ||
return 0; | ||
} | ||
if (pcl::console::find_argument (argc, argv, "-m") >= 0) | ||
{ | ||
setUnseenToMaxRange = true; | ||
cout << "Setting unseen values in range image to maximum range readings.\n"; | ||
} | ||
int tmp_coordinate_frame; | ||
if (pcl::console::parse (argc, argv, "-c", tmp_coordinate_frame) >= 0) | ||
{ | ||
coordinate_frame = pcl::RangeImage::CoordinateFrame (tmp_coordinate_frame); | ||
cout << "Using coordinate frame "<< (int)coordinate_frame<<".\n"; | ||
} | ||
if (pcl::console::parse (argc, argv, "-r", angular_resolution) >= 0) | ||
cout << "Setting angular resolution to "<<angular_resolution<<"deg.\n"; | ||
angular_resolution = pcl::deg2rad (angular_resolution); | ||
// ------------------------------------------------------------------ | ||
// -----读取pcd文件,如果没有给出pcd文件则创建一个示例点云----- | ||
// ------------------------------------------------------------------ | ||
pcl::PointCloud<PointType>::Ptr point_cloud_ptr (new pcl::PointCloud<PointType>); | ||
pcl::PointCloud<PointType>& point_cloud = *point_cloud_ptr; | ||
pcl::PointCloud<pcl::PointWithViewpoint> far_ranges; | ||
Eigen::Affine3f scene_sensor_pose (Eigen::Affine3f::Identity ()); | ||
std::vector<int> pcd_filename_indices = pcl::console::parse_file_extension_argument (argc, argv, "pcd"); | ||
if (!pcd_filename_indices.empty ()) | ||
{ | ||
std::string filename = argv[pcd_filename_indices[0]]; | ||
if (pcl::io::loadPCDFile (filename, point_cloud) == -1) | ||
{ | ||
cout << "Was not able to open file \""<<filename<<"\".\n"; | ||
printUsage (argv[0]); | ||
return 0; | ||
} | ||
scene_sensor_pose = Eigen::Affine3f (Eigen::Translation3f (point_cloud.sensor_origin_[0], point_cloud.sensor_origin_[1], point_cloud.sensor_origin_[2])) *Eigen::Affine3f (point_cloud.sensor_orientation_); | ||
std::string far_ranges_filename = pcl::getFilenameWithoutExtension (filename)+"_far_ranges.pcd"; | ||
if (pcl::io::loadPCDFile(far_ranges_filename.c_str(), far_ranges) == -1) | ||
std::cout << "Far ranges file \""<<far_ranges_filename<<"\" does not exists.\n"; | ||
} | ||
else | ||
{ | ||
cout << "\nNo *.pcd file given => Genarating example point cloud.\n\n"; | ||
for (float x=-0.5f; x<=0.5f; x+=0.01f) | ||
{ | ||
for (float y=-0.5f; y<=0.5f; y+=0.01f) | ||
{ | ||
PointType point; point.x = x; point.y = y; point.z = 2.0f - y; | ||
point_cloud.points.push_back (point); | ||
} | ||
} | ||
point_cloud.width = (int) point_cloud.points.size (); point_cloud.height = 1; | ||
} | ||
// ----------------------------------------------- | ||
// -----从点云创建深度图像----- | ||
// ----------------------------------------------- | ||
float noise_level = 0.0; | ||
float min_range = 0.0f; | ||
int border_size = 1; | ||
boost::shared_ptr<pcl::RangeImage> range_image_ptr (new pcl::RangeImage); | ||
pcl::RangeImage& range_image = *range_image_ptr; | ||
range_image.createFromPointCloud (point_cloud, angular_resolution, pcl::deg2rad (360.0f), pcl::deg2rad (180.0f), scene_sensor_pose, coordinate_frame, noise_level, min_range, border_size); | ||
range_image.integrateFarRanges (far_ranges); | ||
if (setUnseenToMaxRange) | ||
range_image.setUnseenToMaxRange (); | ||
// -------------------------------------------- | ||
// -----打开三维浏览器并添加点云----- | ||
// -------------------------------------------- | ||
pcl::visualization::PCLVisualizer viewer ("3D Viewer"); | ||
viewer.setBackgroundColor (1, 1, 1); | ||
viewer.addCoordinateSystem (1.0f); | ||
pcl::visualization::PointCloudColorHandlerCustom<PointType> point_cloud_color_handler (point_cloud_ptr, 0, 0, 0); | ||
viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, "original point cloud"); | ||
//PointCloudColorHandlerCustom<pcl::PointWithRange> range_image_color_handler (range_image_ptr, 150, 150, 150); | ||
//viewer.addPointCloud (range_image_ptr, range_image_color_handler, "range image"); | ||
//viewer.setPointCloudRenderingProperties (PCL_VISUALIZER_POINT_SIZE, 2, "range image"); | ||
// ------------------------- | ||
// -----提取边界----- | ||
// ------------------------- | ||
pcl::RangeImageBorderExtractor border_extractor (&range_image); | ||
pcl::PointCloud<pcl::BorderDescription> border_descriptions; | ||
border_extractor.compute (border_descriptions); | ||
// ---------------------------------- | ||
// -----在三维浏览器中显示点集----- | ||
// ---------------------------------- | ||
pcl::PointCloud<pcl::PointWithRange>::Ptr border_points_ptr(new pcl::PointCloud<pcl::PointWithRange>), veil_points_ptr(new pcl::PointCloud<pcl::PointWithRange>), shadow_points_ptr(new pcl::PointCloud<pcl::PointWithRange>); | ||
pcl::PointCloud<pcl::PointWithRange>& border_points = *border_points_ptr, & veil_points = * veil_points_ptr, & shadow_points = *shadow_points_ptr; | ||
for (int y=0; y< (int)range_image.height; ++y) | ||
{ | ||
for (int x=0; x< (int)range_image.width; ++x) | ||
{ | ||
if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__OBSTACLE_BORDER]) | ||
border_points.points.push_back (range_image.points[y*range_image.width + x]); | ||
if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__VEIL_POINT]) | ||
veil_points.points.push_back (range_image.points[y*range_image.width + x]); | ||
if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__SHADOW_BORDER]) | ||
shadow_points.points.push_back (range_image.points[y*range_image.width + x]); | ||
} | ||
} | ||
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> border_points_color_handler (border_points_ptr, 0, 255, 0); | ||
viewer.addPointCloud<pcl::PointWithRange> (border_points_ptr, border_points_color_handler, "border points"); | ||
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "border points"); | ||
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> veil_points_color_handler (veil_points_ptr, 255, 0, 0); | ||
viewer.addPointCloud<pcl::PointWithRange> (veil_points_ptr, veil_points_color_handler, "veil points"); | ||
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "veil points"); | ||
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> shadow_points_color_handler (shadow_points_ptr, 0, 255, 255); | ||
viewer.addPointCloud<pcl::PointWithRange> (shadow_points_ptr, shadow_points_color_handler, "shadow points"); | ||
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "shadow points"); | ||
//------------------------------------- | ||
// -----在深度图像中显示点集----- | ||
// ------------------------------------ | ||
pcl::visualization::RangeImageVisualizer* range_image_borders_widget = NULL; | ||
range_image_borders_widget = | ||
pcl::visualization::RangeImageVisualizer::getRangeImageBordersWidget (range_image, -std::numeric_limits<float>::infinity (), std::numeric_limits<float>::infinity (), false, border_descriptions, "Range image with borders" ); | ||
// ------------------------------------- | ||
//-------------------- | ||
// -----主循环----- | ||
//-------------------- | ||
while (!viewer.wasStopped ()) | ||
{ | ||
range_image_borders_widget->spinOnce (); | ||
viewer.spinOnce (); | ||
pcl_sleep(0.01); | ||
} | ||
} |
Binary file not shown.
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,14 @@ | ||
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) | ||
set(PCL_DIR "C:/Program\ Files/PCL/cmake/PCLConfig.cmake") | ||
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,92 @@ | ||
#include <pcl/range_image/range_image.h> | ||
#include <pcl/range_image/range_image_planar.h> | ||
#include <pcl/io/io.h> | ||
#include <pcl/io/pcd_io.h> | ||
#include <pcl/features/integral_image_normal.h> | ||
#include <pcl/visualization/cloud_viewer.h> | ||
#include <pcl/point_types.h> | ||
#include <pcl/features/normal_3d.h> | ||
#include <pcl/console/print.h> | ||
#include <pcl/surface/organized_fast_mesh.h> | ||
#include <pcl/console/time.h> | ||
#include <Eigen/StdVector> | ||
#include <Eigen/Geometry> | ||
#include <iostream> | ||
#include <pcl/surface/impl/organized_fast_mesh.hpp> | ||
#include <boost/thread/thread.hpp> | ||
|
||
#include <pcl/common/common_headers.h> | ||
|
||
#include <pcl/visualization/range_image_visualizer.h> | ||
#include <pcl/visualization/pcl_visualizer.h> | ||
#include <pcl/console/parse.h> | ||
using namespace pcl::console; | ||
int main (int argc, char** argv) { | ||
|
||
|
||
// Generate the data | ||
if (argc<2) | ||
{ | ||
|
||
print_error ("Syntax is: %s input.pcd -w 640 -h 480 -cx 320 -cy 240 -fx 525 -fy 525 -type 0 -size 2\n", argv[0]); | ||
print_info (" where options are:\n"); | ||
print_info (" -w X = width of detph iamge "); | ||
|
||
return -1; | ||
} | ||
std::string filename = argv[1]; | ||
|
||
int width=640,height=480,size=2,type=0; | ||
float fx=525,fy=525,cx=320,cy=240; | ||
|
||
parse_argument (argc, argv, "-w", width); | ||
parse_argument (argc, argv, "-h", height); | ||
parse_argument (argc, argv, "-cx", cx); | ||
parse_argument (argc, argv, "-cy", cy); | ||
parse_argument (argc, argv, "-fx", fx); | ||
parse_argument (argc, argv, "-fy", fy); | ||
parse_argument (argc, argv, "-type", type); | ||
parse_argument (argc, argv, "-size", size); | ||
//convert unorignized point cloud to orginized point cloud begin | ||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); | ||
pcl::io::loadPCDFile (filename, *cloud); | ||
print_info ("Read pcd file successfully\n"); | ||
Eigen::Affine3f sensorPose; | ||
sensorPose.setIdentity(); | ||
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME; | ||
float noiseLevel=0.00; | ||
float minRange = 0.0f; | ||
|
||
pcl::RangeImagePlanar::Ptr rangeImage(new pcl::RangeImagePlanar); | ||
rangeImage->createFromPointCloudWithFixedSize(*cloud,width,height,cx,cy,fx,fy,sensorPose,coordinate_frame); | ||
std::cout << rangeImage << "\n"; | ||
//convert unorignized point cloud to orginized point cloud end | ||
|
||
|
||
//viusalization of range image | ||
pcl::visualization::RangeImageVisualizer range_image_widget ("点云库PCL从入门到精通"); | ||
range_image_widget.showRangeImage (*rangeImage); | ||
range_image_widget.setWindowTitle("点云库PCL从入门到精通"); | ||
//triangulation based on range image | ||
pcl::OrganizedFastMesh<pcl::PointWithRange>::Ptr tri(new pcl::OrganizedFastMesh<pcl::PointWithRange>); | ||
pcl::search::KdTree<pcl::PointWithRange>::Ptr tree (new pcl::search::KdTree<pcl::PointWithRange>); | ||
tree->setInputCloud(rangeImage); | ||
pcl::PolygonMesh triangles; | ||
tri->setTrianglePixelSize(size); | ||
tri->setInputCloud(rangeImage); | ||
tri->setSearchMethod(tree); | ||
tri->setTriangulationType((pcl::OrganizedFastMesh<pcl::PointWithRange>::TriangulationType)type); | ||
tri->reconstruct(triangles); | ||
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("点云库PCL从入门到精通")); | ||
viewer->setBackgroundColor(0.5,0.5,0.5); | ||
viewer->addPolygonMesh(triangles,"tin"); | ||
viewer->addCoordinateSystem(); | ||
while (!range_image_widget.wasStopped ()&&!viewer->wasStopped()) | ||
{ | ||
range_image_widget.spinOnce (); | ||
|
||
pcl_sleep (0.01); | ||
viewer->spinOnce (); | ||
|
||
} | ||
} |