做移动网站优化网站建设过程中要怎么打开速度
news/
2025/9/25 16:37:52/
文章来源:
做移动网站优化,网站建设过程中要怎么打开速度,网站空间ftp连接失败,长沙建设信息中心网站这次我们将学着怎么从一个深度图里面导出边界。我们对3种不同种类的点很感兴趣:物体的边框的点#xff0c;阴影边框点#xff0c;和面纱点(在障碍物边界和阴影边界)#xff0c;这是一个很典型的现象在通过雷达获取的3D深度。 下面是代码
/* \author Bastian Steder */#incl…这次我们将学着怎么从一个深度图里面导出边界。我们对3种不同种类的点很感兴趣:物体的边框的点阴影边框点和面纱点(在障碍物边界和阴影边界)这是一个很典型的现象在通过雷达获取的3D深度。 下面是代码
/* \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;
// --------------------
// -----Parameters-----
// --------------------
float angular_resolution 0.5f;
pcl::RangeImage::CoordinateFrame coordinate_frame pcl::RangeImage::CAMERA_FRAME;
bool setUnseenToMaxRange false;
// --------------
// -----Help-----
// --------------
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;
}
// --------------
// -----Main-----
// --------------
int
main (int argc, char** argv)
{
// --------------------------------------
// -----Parse Command Line Arguments-----
// --------------------------------------
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_resolutiondeg.\n;
angular_resolution pcl::deg2rad (angular_resolution);
// ------------------------------------------------------------------
// -----Read pcd file or create example point cloud if not given-----
// ------------------------------------------------------------------
pcl::PointCloudPointType::Ptr point_cloud_ptr (new pcl::PointCloudPointType);
pcl::PointCloudPointType point_cloud *point_cloud_ptr;
pcl::PointCloudpcl::PointWithViewpoint far_ranges;
Eigen::Affine3f scene_sensor_pose (Eigen::Affine3f::Identity ());
std::vectorint 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; x0.5f; x0.01f)
{
for (float y-0.5f; y0.5f; y0.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;
}
// -----------------------------------------------
// -----Create RangeImage from the PointCloud-----
// -----------------------------------------------
float noise_level 0.0;
float min_range 0.0f;
int border_size 1;
boost::shared_ptrpcl::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 ();
// --------------------------------------------
// -----Open 3D viewer and add point cloud-----
// --------------------------------------------
pcl::visualization::PCLVisualizer viewer (3D Viewer);
viewer.setBackgroundColor (1, 1, 1);
viewer.addCoordinateSystem (1.0f, global);
pcl::visualization::PointCloudColorHandlerCustomPointType point_cloud_color_handler (point_cloud_ptr, 0, 0, 0);
viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, original point cloud);
//PointCloudColorHandlerCustompcl::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);
// -------------------------
// -----Extract borders-----
// -------------------------
pcl::RangeImageBorderExtractor border_extractor (range_image);
pcl::PointCloudpcl::BorderDescription border_descriptions;
border_extractor.compute (border_descriptions);
// ----------------------------------
// -----Show points in 3D viewer-----
// ----------------------------------
pcl::PointCloudpcl::PointWithRange::Ptr border_points_ptr(new pcl::PointCloudpcl::PointWithRange),
veil_points_ptr(new pcl::PointCloudpcl::PointWithRange),
shadow_points_ptr(new pcl::PointCloudpcl::PointWithRange);
pcl::PointCloudpcl::PointWithRange border_points *border_points_ptr,
veil_points * veil_points_ptr,
shadow_points *shadow_points_ptr;
for (int y0; y (int)range_image.height; y)
{
for (int x0; 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::PointCloudColorHandlerCustompcl::PointWithRange border_points_color_handler (border_points_ptr, 0, 255, 0);
viewer.addPointCloudpcl::PointWithRange (border_points_ptr, border_points_color_handler, border points);
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, border points);
pcl::visualization::PointCloudColorHandlerCustompcl::PointWithRange veil_points_color_handler (veil_points_ptr, 255, 0, 0);
viewer.addPointCloudpcl::PointWithRange (veil_points_ptr, veil_points_color_handler, veil points);
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, veil points);
pcl::visualization::PointCloudColorHandlerCustompcl::PointWithRange shadow_points_color_handler (shadow_points_ptr, 0, 255, 255);
viewer.addPointCloudpcl::PointWithRange (shadow_points_ptr, shadow_points_color_handler, shadow points);
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, shadow points);
//-------------------------------------
// -----Show points on range image-----
// ------------------------------------
pcl::visualization::RangeImageVisualizer* range_image_borders_widget NULL;
range_image_borders_widget
pcl::visualization::RangeImageVisualizer::getRangeImageBordersWidget (range_image, -std::numeric_limitsfloat::infinity (), std::numeric_limitsfloat::infinity (), false,
border_descriptions, Range image with borders);
// -------------------------------------
//--------------------
// -----Main loop-----
//--------------------
while (!viewer.wasStopped ())
{
range_image_borders_widget-spinOnce ();
viewer.spinOnce ();
pcl_sleep(0.01);
}
}
代码解释
在刚开始我们做命令行解析从一个磁盘里面读取点云我们创造了一个深度图并把它进行可视化。所有的这些步骤在Range Image Visualization里面有讲。
这里只有一小点偏差。为了导出边缘信息我们要区别出无法到的深度点和超出观察范围之外的深度点。接着我们标记一个边框观察不到的点不用标记。因此提供一些测量参数是很重要的。我们将找到一个额外的pcd文件包含如下的值。
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;
他们等一下将融入深度图里面
range_image.integrateFarRanges (far_ranges);
如果这些值没有提供命令行参数-m将被用来赋值所有不能观测到地点都被认为很远距离的点。
if (setUnseenToMaxRange)
range_image.setUnseenToMaxRange ();
接下去我们将来到与边缘导出相关的部分
pcl::RangeImageBorderExtractor border_extractor (range_image);
pcl::PointCloudpcl::BorderDescription border_descriptions;
border_extractor.compute (border_descriptions);
上面将会创建RangeImageBorderExtractor这个类给一个深度图计算边缘信息并把它存在border_descriptions里面。
最后 viewer.addCoordinateSystem (1.0f, global);可能会出现错误把代码改成viewer.addCoordinateSystem (1.0f);
直接运行它
/range_image_border_extraction -m
使用一个点云文件
./range_image_border_extraction point_cloud.pcd
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917236.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!