pcl-3 pcl结合opencv做svm分类(法向量特征数据)

后续使用了fpfh特征作为训练数据,遇到了一些困难
首先是flann冲突,这个将opcv中的flann都改成了flann2就可以运行
后面在将得到的33特征值进行训练的时候一直内存超限,传输的不太好,到现在还是不行,改了三天还是没有改好,先放这里吧,等后续有时间进行修改,我感觉是传输的问题。

#pragma warning(disable:4996)
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
//点云显示
#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>
#include<flann/flann.h>
#include <thread>
#include <pcl/search/kdtree.h>
//
#include <omp.h>
//补充点云特征
#include <pcl/features/normal_3d.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/features/shot_omp.h>
#include <pcl/features/shot.h>
#include <pcl/features/fpfh_omp.h>
#include <pcl/features/pfh.h>
#include <pcl/features/normal_3d.h>#include <opencv2/opencv.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;// 计算法线pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);pcl::NormalEstimation<pcl::PointXYZL, pcl::Normal> normalEstimation;normalEstimation.setInputCloud(labeledCloud);pcl::search::KdTree<pcl::PointXYZL>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZL>);normalEstimation.setSearchMethod(kdtree);normalEstimation.setKSearch(20);  // 设置法线估计时近邻点的数量normalEstimation.compute(*normals); cout << "发线计算完成" << endl;将法线和原始点云拼接起来//pcl::PointCloud<pcl::PointNormal>::Ptr cloudWithNormals(new pcl::PointCloud<pcl::PointNormal>);//pcl::concatenateFields(*cloud, *normals, *cloudWithNormals);// 将法线和原始点云拼接起来//pcl::PointCloud<pcl::PointNormal>::Ptr cloudWithNormals(new pcl::PointCloud<pcl::PointNormal>);pcl::PointCloud<pcl::PointXYZLNormal>::Ptr cloudWithNormals(new pcl::PointCloud<pcl::PointXYZLNormal>);cloudWithNormals->resize(cloud->size());for (size_t i = 0; i < cloud->size(); ++i) {cloudWithNormals->points[i].x = cloud->points[i].x;cloudWithNormals->points[i].y = cloud->points[i].y;cloudWithNormals->points[i].z = cloud->points[i].z;cloudWithNormals->points[i].normal_x = normals->points[i].normal_x;cloudWithNormals->points[i].normal_y = normals->points[i].normal_y;cloudWithNormals->points[i].normal_z = normals->points[i].normal_z;}cout << "cloudWithNormals的点云数量为" << cloudWithNormals->size() << endl;cout << "法线和原始点云合并完成" << endl;// 读取法线和曲率特征// pcl::PointCloud<pcl::FPFHSignature33>::Ptr features(new pcl::PointCloud<pcl::FPFHSignature33>);// 计算带标签点云的FPFH特征pcl::FPFHEstimationOMP<pcl::PointXYZL, pcl::Normal, pcl::FPFHSignature33> fpfh_src;fpfh_src.setInputCloud(labeledCloud);fpfh_src.setInputNormals(normals);fpfh_src.setNumberOfThreads(10);pcl::search::KdTree<pcl::PointXYZL>::Ptr kdtree2(new pcl::search::KdTree<pcl::PointXYZL>);fpfh_src.setSearchMethod(kdtree2);cout << "开始计算点云特征" << endl;pcl::PointCloud<pcl::FPFHSignature33>::Ptr features(new pcl::PointCloud<pcl::FPFHSignature33>());fpfh_src.setKSearch(20);fpfh_src.compute(*features);// 开始计算前上锁omp_lock_t lock;omp_init_lock(&lock);// 使用 OpenMP 设置锁
#pragma omp parallel{
#pragma omp single{
#pragma omp task{fpfh_src.compute(*features);}}}// 计算完成后解锁omp_destroy_lock(&lock);cout << "读取法线和曲率特征完成" << endl;// 准备训练数据和标签cv::Mat trainingData(labeledCloud->size(), 33, CV_32FC1);  // 注意特征的维度cv::Mat labels(labeledCloud->size(), 1, CV_32SC1);std::cout << "labeledCloud size: " << labeledCloud->size() << std::endl;std::cout << "features size: " << features->size() << std::endl;for (size_t i = 0; i < labeledCloud->size(); ++i){// 使用法线和曲率特征for (int j = 0; j < 33; ++j){if (i < features->size()){  // 添加索引范围检查trainingData.at<float>(i, j) = features->points[i].histogram[j];}else {std::cerr << "Index out of range for features at i=" << i << " and j=" << j << std::endl;}}// 根据点的标签设置标签数据if (i < labeledCloud->size()) {  // 添加索引范围检查labels.at<int>(i, 0) = labeledCloud->points[i].label;}else {std::cerr << "Index out of range for labeledCloud at i=" << i << std::endl;}}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 testData(cloud->size(), 33, CV_32FC1);for (size_t i = 0; i < cloud->size(); ++i){for (int j = 0; j < 33; ++j) {testData.at<float>(i, j) = features->points[i].histogram[j];}}cv::Mat predictedLabels;/* svm->predict(testData, predictedLabels);*/try {svm->predict(testData, predictedLabels);}catch (cv::Exception& e) {std::cerr << "OpenCV Exception: " << e.what() << std::endl;}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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink 系列文章汇总索引

Flink 系列文章 一、Flink 专栏 本专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 本专栏的文章编号可能不是顺序的&#xff0c;主要是因为写的时候顺序没统一&#xff0c;但相关的文章又引入了&#xff0c;所以后面就没有调整了&#xff0c;按照写文章的顺…

OpenCL学习笔记(三)手动编译开发库(win10+mingw64)

前言 有的小伙伴仍然在使用mingw编译器&#xff0c;这时只能重新编译opencl的sdk库。本文档简单记录下win10下&#xff0c;使用mingw11.20编译的过程&#xff0c;有需要的小伙伴可以参考下 一、安装所需软件 1.安装git&#xff0c;教程比较多&#xff0c;不再重复 2.安装cm…

chrome安装jsonview

写在前面 通过jsonview可以实现&#xff0c;当http响应时application/json时直接在浏览器格式化显示&#xff0c;增加可读性。本文看下如何安装该插件到chrome中。 1&#xff1a;安装 首先在这里 下载插件包&#xff0c;然后解压备用。接着在chrome按照如下步骤操作&#xf…

千锋 Vue 详细笔记整理

视频笔记是根据B站 千锋 涛哥 - SpringBootvue前后端分离项目《锋迷商城》实战课-完结版 进行整理的 笔记可上 gitee仓库 自取 千锋 Vue 笔记整理 一、vue 的简介1.1 使用 JQuery 的复杂性问题1.2 VUE 简介1.2.1 前端框架1.2.2 MVVM 二、 vue 入门使用2.1 vue 的引入2.2 入门案…

WPF(Windows Presentation Foundation)的 StatusBar控件

WPF&#xff08;Windows Presentation Foundation&#xff09;的 StatusBar 是一种用于显示状态栏的控件。状态栏是用于向用户提供应用程序的状态信息或其他相关信息的区域。它通常位于应用程序窗口的底部&#xff0c;并提供一些常见的功能&#xff0c;如显示进度、状态文本、通…

[C#] 基于 yield 语句的迭代器逻辑懒执行

众所周知, C# 可以通过 yield 语句来快速向 IEnumerator 或者 IEnumerable 类型的方法返回值返回一个元素. 但它还有另外一个特性, 就是其内部逻辑的懒执行. 每两个 yield 语句之间的逻辑都是一个状态, 只有在调用迭代器的 MoveNext 方法后, 才会执行下一个状态的逻辑. 在文章中…

泽攸科技二维材料转移台的应用场景及优势

随着二维材料的广泛研究和各种潜在应用的开发&#xff0c;对于二维材料样品的精密操控与转移的需求日益增加。特别是一些新型二维材料的制备和器件集成制备中&#xff0c;需要在显微镜下对样品进行观察与定位&#xff0c;并能够在微米甚至纳米量级上精确移動和转移样品。 传统…

集简云 x 零售企业丨快速集成有赞商城和微盛企微管家,实现私域运营自动化

客户介绍 某公司是一家知名的饮料厂商&#xff0c;自1998年成立以来&#xff0c;一直致力于研发和生产各种热门饮品&#xff0c;如果汁、碳酸饮料、矿泉水等。因其独特的口感和健康的品质深受消费者的喜爱。企业拥有多个知名品牌&#xff0c;享有极高的品牌知名度和市场份额。该…

BGP综合

1、使用PreVal策略&#xff0c;确保R4通过R2到达192.168.10.0/24。 2、使用AS_Path策略&#xff0c;确保R4迪过R3到达192.168.11.0/24。 3、配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24。 4、使用Local Preference策略&#xff0c;确保R1通过R2到达192.168.1.0…

Mac电脑系统管理:iStat Menus中文 for Mac

iStat Menus是一款强大而灵活的系统监控工具&#xff0c;可以帮助Mac用户实时监控和管理自己的电脑。它提供了丰富的系统状态和性能指标&#xff0c;可自定义的菜单栏图标以及历史数据记录功能&#xff0c;让用户能够全面了解和掌握电脑的运行情况。 实时系统监控&#xff1a;i…

Django的Auth模块

Auth模块 我们在创建好一个Django项目后执行数据库迁移命令会自动生成很多表 其中有auth_user等表 Django在启动之后就可以直接访问admin路由&#xff0c;需要输入用户名和密码&#xff0c;数据参考的就是auth_user表&#xff0c;并且必须是管理员才能进入 依赖于a…

flink1.12.4消费kafka 报错 The coordinator is not available

报错 You should retry committing the latest consumed offsets. Caused by: org.apache.kafka.common.errors.CoordinatorNotAvailableException: The coordinator is not available. 但是任务还在正常跑. 开源bug [FLINK-28060] Kafka Commit on checkpointing fails rep…

12.8 作业 C++

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

一篇文章熟练掌握 Axios

Axios是什么 Axios是一个基于Promise的网络请求库&#xff0c;作用于node.js和浏览器中。在服务端使用原生node.js http模块&#xff0c;在客户端使用XMLHttpRequest。是基于Promise对Ajax的封装。 Axios的特性 从浏览器创建XMLHttpRequests从node.js创建http请求支持Promis…

基于OpenCV的人脸识别系统案例

基于OpenCV的人脸识别系统案例 人脸识别简介代码实现案例应用情况 下面将介绍如何使用Python和OpenCV库构建一个简单但强大的人脸识别系统。人脸识别是计算机视觉领域的一个重要应用&#xff0c;具有广泛的实际用途&#xff0c;从安全门禁到娱乐应用。 人脸识别简介 人脸识别是…

MySQL - 表达式With as 语句的使用及练习

目录 8.1 WITH AS 的含义 8.2 WITH AS语法的基本结构如下&#xff1a; 8.3 练习题1 8.4 牛客练习题 8.1 WITH AS 的含义 WITH AS 语法是MySQL中的一种临时结果集&#xff0c;它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句&#xff0c;可以将一个查…

量子芯片技术:未来的计算革命

量子芯片技术&#xff1a;未来的计算革命 一、引言 随着科技的不断发展&#xff0c;人类正在进入一个全新的技术时代&#xff0c;即量子时代。量子芯片技术作为这个时代的重要代表&#xff0c;正逐渐改变我们对计算和信息处理的理解。本文将深入探讨量子芯片技术的基本原理、…

Navicat 技术指引 | 适用于 GaussDB 分布式的服务器对象的创建/设计

Navicat Premium&#xff08;16.3.3 Windows版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构…

Java入门 EditPlus的安装与配置讲解

写Java程序不建议使用EditPlus&#xff0c;首选idea社区版&#xff0c;其次是vscode&#xff0c; 然后是eclipse 。editplus说实话排不上号。 但既然小伙伴想了解一下怎么配置&#xff0c;这里就简单说一下。 下载 首先是jdk&#xff0c;jdk是Java开发和运行的基础&#xff…

EVT_WDF_DEVICE_PREPARE_HARDWARE API

NTSTATUS EVT_WDF_DEVICE_PREPARE_HARDWARE(__inWDFDEVICE Device,__inWDFCMRESLIST ResourcesRaw,__inWDFCMRESLIST ResourcesTranslated); 上面API中ResourcesRaw和ResourcesTranslated类型相同&#xff0c;那他们的区别是啥&#xff1f; 答&#xff1a; EVT_WDF_DEVICE_P…