环境:Ubuntu 16.04
当我们安装好PCL之后 (安装方法见:ubuntu16.04 安装 pcl),我们使用pcl来3D显示一个pcd文件内容
下载一个pcd文件 rabbit.pcd
将rabbit.pcd文件放在文件夹中,打开终端输入
pcl_viewer rabbit.pcd
滚动鼠标滚轮,可以看到兔子的3D点云
二、编写程序 读取pcd文件内容
1、在pcd文件同级目录下创建 pcl_test.cpp CMakeLists.txt
CMakeList.txt
cmake_minimum_required(VERSION 2.6)
project(pcl_test)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(pcl_test pcl_test.cpp)
target_link_libraries (pcl_test ${PCL_LIBRARIES})
install(TARGETS pcl_test RUNTIME DESTINATION bin)
pcl_test.cpp
#include
#include
#include
int main(int argc, char** argv)
{
//创建了一个名为cloud的指针,储存XYZ类型的点云数据
pcl::PointCloud<:pointxyz>::Ptr cloud(new pcl::PointCloud<:pointxyz>);
//*打开点云文件
if (pcl::io::loadPCDFile<:pointxyz>("rabbit.pcd", *cloud) == -1) {
PCL_ERROR("Couldn't read file rabbit.pcd\n");
return(-1);
}
std::cout << "Loaded:" << cloud->width*cloud->height<
//输出点云数据
for (size_t i = 0; i < cloud->points.size(); ++i) {
std::cout << " " << cloud->points[i].x << " " << cloud->points[i].y << " " << cloud->points[i].z << " " << std::endl;
}
return 0;
}
说明:
PointCloud是PCL中的一个基类,pcl::PointCloud<:pointxyz>::Ptr是一个Boost共享指针
PointCloud中的数据域
width(int),如果是无组织,无结构的点云数据,表示点云的个数;如果是有结构的点云数据,表示点云数据集一行的点数。
height(int),如果是无结构的点云数据,height=1;如果是有结构的点云数据,height表示点云总行数。
points(std::vector)存储了数据类型为PointT的一个动态数组。
PointXYZ 是最常见的一个点数据类型,它只包含三维X,Y,Z坐标信息
X:points[i].x
size_t 整型,保存一个整数,记录一个大小(size)
points.size() 表示点云数据大小
在终端中输入
cmake .
make
生成可执行程序pcl_test
运行 pcl_test 可看到点云数据
2、 数据可视化
pcl_test.cpp
#include
#include
#include
#include
int main(int argc, char** argv) {
pcl::PointCloud<:pointxyz>::Ptr cloud(new pcl::PointCloud<:pointxyz>);
//*打开点云文件
if (pcl::io::loadPCDFile<:pointxyz>("rabbit.pcd", *cloud) == -1) {
PCL_ERROR("Couldn't read file rabbit.pcd\n");
return(-1);
}
std::cout << cloud->points.size() << std::endl;
pcl::visualization::CloudViewer viewer("cloud viewer");
viewer.showCloud(cloud);
while (!viewer.wasStopped()) {
}
return 0;
}
终端中重新编译
make
./pcl_test
3、修改背景
pcl_test.cpp
#include
#include
#include
#include
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer) {
viewer.setBackgroundColor(1.0f, 0.5f, 1.0f);
}
int main(int argc, char** argv) {
pcl::PointCloud<:pointxyz>::Ptr cloud(new pcl::PointCloud<:pointxyz>);
//*打开点云文件
if (pcl::io::loadPCDFile<:pointxyz>("rabbit.pcd", *cloud) == -1) {
PCL_ERROR("Couldn't read file rabbit.pcd\n");
return(-1);
}
std::cout << cloud->points.size() << std::endl;
pcl::visualization::CloudViewer viewer("cloud viewer");
viewer.showCloud(cloud);
viewer.runOnVisualizationThreadOnce(viewerOneOff);
while (!viewer.wasStopped()) {
}
return 0;
}
4、
pcl_test.cpp
#include
#include
#include
#include
int user_data;
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer) {
viewer.setBackgroundColor(1.0f, 0.5f, 1.0f);
}
void
viewerPsycho(pcl::visualization::PCLVisualizer& viewer)
{
static unsigned count = 0;
std::stringstream ss;
ss << "Once per viewer loop: " << count++;
viewer.removeShape("text", 0);
viewer.addText(ss.str(), 20, 100, "text", 0);//this is to set the coordination of text "Once per viewer loop:"
user_data++;
}
int main(int argc, char** argv) {
pcl::PointCloud<:pointxyz>::Ptr cloud(new pcl::PointCloud<:pointxyz>);
//*打开点云文件
if (pcl::io::loadPCDFile<:pointxyz>("rabbit.pcd", *cloud) == -1) {
PCL_ERROR("Couldn't read file rabbit.pcd\n");
return(-1);
}
std::cout << cloud->points.size() << std::endl;
pcl::visualization::CloudViewer viewer("cloud viewer");
viewer.showCloud(cloud);
viewer.runOnVisualizationThreadOnce(viewerOneOff);
viewer.runOnVisualizationThread(viewerPsycho);
while (!viewer.wasStopped()) {
}
return 0;
}
标签:PCL,test,pcl,ubuntu,点云,include,pcd
来源: https://www.cnblogs.com/birdBull/p/14467655.html