win10+VS2017+PCL1.8.1+CMake
阿新 • • 發佈:2018-11-03
1. 平臺
win10
VS2017:將CMake生成的專案檔案執行產生可執行檔案。
PCL1.8.1 :PCL是點雲演算法庫。
CMake:為編寫的程式進行環境配置及生成專案檔案。安裝CMake,就不會每次編寫專案是還要兼顧配置環境變數。
2. 資料包
集合包:PCL-1.8.1-AllInOne-msvc2017-win64.exe
Debug包:pcl-1.8.1-pdb-msvc2017-win64.zip
CMake:cmake-3.11.1-win64-x64.msi
3. 安裝
(1)安裝集合包,所有都預設,PATH新增為全部使用者即可
(2)解壓pdb包到安裝目錄下bin資料夾內
(3)安裝CMake,預設安裝,PATH新增為全部使用者即可
4. 建立專案
(1)新建專案目錄:test資料夾
(2)test資料夾下新建兩個檔案:source 和 build
(3)將下面兩個檔案儲存在source目錄下:
a. Cmakelists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) project(Kd_tree) find_package(PCL 1.2 REQUIRED) include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS}) add_executable (Kd_tree Kd_tree.cpp) target_link_libraries (Kd_tree ${PCL_LIBRARIES})
b. Kd_tree.cpp
#include <pcl/point_cloud.h> #include <pcl/kdtree/kdtree_flann.h> #include <iostream> #include <vector> #include <ctime> int main(int argc, char** argv) { srand(time(NULL)); //用系統時間初始化隨機種子 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // Generate pointcloud data 隨機點雲生成 cloud->width = 1000; //點雲數量 cloud->height = 1; //點云為無序點雲 cloud->points.resize(cloud->width * cloud->height); for (size_t i = 0; i < cloud->points.size(); ++i) //迴圈填充點雲資料 { cloud->points[i].x = 1024.0f * rand() / (RAND_MAX + 1.0f); cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f); cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f); } pcl::KdTreeFLANN<pcl::PointXYZ> kdtree; //建立kd-tree kdtree.setInputCloud(cloud); //設定搜尋空間 pcl::PointXYZ searchPoint; //定義查詢點並賦隨機值 searchPoint.x = 1024.0f * rand() / (RAND_MAX + 1.0f); searchPoint.y = 1024.0f * rand() / (RAND_MAX + 1.0f); searchPoint.z = 1024.0f * rand() / (RAND_MAX + 1.0f); // K nearest neighbor search k 近鄰搜尋 int K = 10; std::vector<int> pointIdxNKNSearch(K); std::vector<float> pointNKNSquaredDistance(K); std::cout << "K nearest neighbor search at (" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z << ") with K=" << K << std::endl; if (kdtree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0) //執行k近鄰搜尋 { for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i) std::cout << " " << cloud->points[pointIdxNKNSearch[i]].x << " " << cloud->points[pointIdxNKNSearch[i]].y << " " << cloud->points[pointIdxNKNSearch[i]].z << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl; } // Neighbors within radius search 半徑r內近鄰搜尋方式 std::vector<int> pointIdxRadiusSearch; //儲存近鄰索引 std::vector<float> pointRadiusSquaredDistance; //儲存近鄰對應的距離平方 float radius = 256.0f * rand() / (RAND_MAX + 1.0f); std::cout << "Neighbors within radius search at (" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z << ") with radius=" << radius << std::endl; if (kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0) { for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i) std::cout << " " << cloud->points[pointIdxRadiusSearch[i]].x << " " << cloud->points[pointIdxRadiusSearch[i]].y << " " << cloud->points[pointIdxRadiusSearch[i]].z << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl; } return 0; }
(4)開啟CMake的圖形介面,選擇原始碼資料夾source和目標資料夾build
(5)config 配置編譯器為VS 15 2017 win64
(6)config 一次,提示紅色,輸出顯示 done,再 config 一次,無紅色,輸出顯示 done
(7)generate 一次,提示 done
(8)open project