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.pswp.cn/news/208496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208496.shtml
英文地址,請注明出處:http://en.pswp.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…