1. 程式人生 > >win10+VS2017+PCL1.8.1+CMake

win10+VS2017+PCL1.8.1+CMake

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