pcl-2 pcl结合opencv做svm分类(高程数据)

    pcl自动的ml文件夹内存在svm分类器,但是遗憾的是,我并不能掌握应用方法,因此借用opencv的cv空间进行了点云坐标的转移,使用opencv的svm功能进行调试。现在是最开始的版本
   仅仅使用了高程数据,并且没有做归一化等操作
 

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <opencv2/opencv.hpp>

#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/point_cloud_color_handlers.h>

#include <boost/thread/thread.hpp>
#include <boost/thread/thread_time.hpp>


int main() {
    // 读取初始点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PCDReader reader;
    reader.read("svmtest.pcd", *cloud);

    cout << "初始点云读取完成" << endl;

    // 读取带标签的点云
    pcl::PointCloud<pcl::PointXYZL>::Ptr labeledCloud(new pcl::PointCloud<pcl::PointXYZL>);
    reader.read("svmlearn_xyzl.pcd", *labeledCloud);

    cout << "标签点云读取完成" << endl;

    // 准备训练数据和标签
    cv::Mat trainingData(labeledCloud->size(), 3, CV_32FC1);
    cv::Mat labels(labeledCloud->size(), 1, CV_32SC1);

    for (size_t i = 0; i < labeledCloud->size(); ++i) {
        trainingData.at<float>(i, 0) = labeledCloud->points[i].x;
        trainingData.at<float>(i, 1) = labeledCloud->points[i].y;
        trainingData.at<float>(i, 2) = labeledCloud->points[i].z;

        // 根据点的标签设置标签数据
        labels.at<int>(i, 0) = labeledCloud->points[i].label;
    }

    cout << "根据点的标签设置标签数据完成" << endl;

    // 创建并训练SVM分类器
    cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
    svm->setType(cv::ml::SVM::C_SVC);
    svm->setKernel(cv::ml::SVM::RBF);
    svm->setC(10);
    svm->setGamma(0.001);
    svm->train(trainingData, cv::ml::ROW_SAMPLE, labels);


    cout << "创建并训练SVM分类器完成,正在开始对点云进行分类" << endl;

    // 对初始点云进行分类
    cv::Mat testData(cloud->size(), 3, CV_32FC1);

    for (size_t i = 0; i < cloud->size(); ++i) 
    {
        testData.at<float>(i, 0) = cloud->points[i].x;
        testData.at<float>(i, 1) = cloud->points[i].y;
        testData.at<float>(i, 2) = cloud->points[i].z;
    }

    cv::Mat predictedLabels;
    svm->predict(testData, predictedLabels);

    cout << "正在将分类结果添加到点云中" << endl;

    // 将分类结果添加到点云中
    pcl::PointCloud<pcl::PointXYZL>::Ptr classifiedCloud(new pcl::PointCloud<pcl::PointXYZL>);
    classifiedCloud->resize(cloud->size());

     

    for (size_t i = 0; i < cloud->size(); ++i) {
        classifiedCloud->points[i].x = cloud->points[i].x;
        classifiedCloud->points[i].y = cloud->points[i].y;
        classifiedCloud->points[i].z = cloud->points[i].z;

        // 修正标签值(假设标签是 0 或 1)
        classifiedCloud->points[i].label = static_cast<int>(predictedLabels.at<float>(i, 0)) + 1;
    }

    pcl::PCDWriter writer;

    writer.write("lable.pcd", *classifiedCloud);

    cout << "lable.pcd已完成储存,请查看" << endl;

   
        //----------------------------根据分类标签可视化-----------------------------
        boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
        pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZL>fildColor(classifiedCloud, "label");
        viewer->setBackgroundColor(0, 0, 0);
        viewer->setWindowName("点云按分类标签显示");
        viewer->addText("Point clouds are shown by label", 50, 50, 0, 1, 0, "v1_text");
        viewer->addPointCloud<pcl::PointXYZL>(classifiedCloud, fildColor, "sample cloud");
        viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");

        while (!viewer->wasStopped())
        {
            viewer->spinOnce(100);
            boost::this_thread::sleep(boost::posix_time::microseconds(100000));
        }


    return 0;
}

相关推荐

  1. pcl-2 pcl结合opencvsvm分类高程数据

    2023-12-07 23:22:01       57 阅读
  2. pcl-3 pcl结合opencvsvm分类(法向量特征数据

    2023-12-07 23:22:01       51 阅读
  3. <span style='color:red;'>PCL</span>_Write

    PCL_Write

    2023-12-07 23:22:01      40 阅读
  4. PCB2)-布局

    2023-12-07 23:22:01       20 阅读
  5. Ubuntu搭建环境Cmake-Libtorch-Torchvision-PCL-VTK-OpenCV

    2023-12-07 23:22:01       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-07 23:22:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-07 23:22:01       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-07 23:22:01       87 阅读
  4. Python语言-面向对象

    2023-12-07 23:22:01       96 阅读

热门阅读

  1. jdbc4.MySQLSyntaxErrorException: Query was empty

    2023-12-07 23:22:01       57 阅读
  2. TCP通讯

    TCP通讯

    2023-12-07 23:22:01      53 阅读
  3. Mysql事务隔离级别及其底层原理

    2023-12-07 23:22:01       66 阅读
  4. chrome issue -- list

    2023-12-07 23:22:01       65 阅读
  5. 【android开发-13】android中RecycleView的详细用法介绍

    2023-12-07 23:22:01       49 阅读
  6. 关于如何实现图片懒加载

    2023-12-07 23:22:01       64 阅读