0
点赞
收藏
分享

微信扫一扫

pcl深度图像

墨春 2022-02-03 阅读 32

深度图像

#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>
#ifdef WIN32//64位Debug应该加上
#define pcl_sleep(x) Sleep(1000*(x))
#elif _WIN64
#define pcl_sleep(x) Sleep(1000*(x))
#else
#define pcl_sleep(x) sleep(x)
#endif
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);//光轴在深度图像上的x坐标
    parse_argument(argc, argv, "-cy", cy);//光轴在深度图像上的y坐标
    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("source.pcd", *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;//多边形mesh
    tri->setTrianglePixelSize(size);//曲面重建的精细程度
    tri->setInputCloud(rangeImage);//设置输入的深度图像
    tri->setSearchMethod(tree);//设置搜索方法
    tri->setTriangulationType((pcl::OrganizedFastMesh<pcl::PointWithRange>::TriangulationType)type);//设置三角化的类型
    tri->reconstruct(triangles);//重建结果到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();

    }
    return 0;
}

具体怎么应用后面再补充。

举报

相关推荐

0 条评论