描述
假设我们正在使用某款相机,仅仅能读出它每一帧点云数据的xyz值,但是无法使用接口让数据自动记录成想要的格式,可以看看这篇博客
放在指定位置,调用下面的接口代码,就能生成想要的点云数据了
代码
pcl::PointCloud<pcl::PointXYZ>::Ptr readPointCloud_camera(int width, int height, std::vector<int> x, std::vector<int> y, std::vector<int> z)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
cloud->width = width;
cloud->height = height;
cloud->points.resize(width*height);
for (int i = 0 ; i < width*height; i++)
{
cloud->points[i].x = x[i];
cloud->points[i].y = y[i];
cloud->points[i].z = z[i];
}
return cloud;
}
- 附赠CMakeLists.txt
cmake_minimum_required(VERSION 2.8.7)
project(test)
find_package(PCL 1.5 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fexceptions -frtti -pthread -O3 -march=core2")
set(ROOT "${CMAKE_CURRENT_SOURCE_DIR}/")
include_directories(
${ROOT}
${ROOT}/include
)
file(GLOB SOURCES
"*.cpp"
)
link_directories(
${ROOT}/lib
)
add_executable(test ${SOURCES})
target_link_libraries(test ${PCL_LIBRARIES})
使用例子
随机生成了10000个三维点,然后赋值给一片点云,并且完成显示
#include <iostream>
//点云需要的头文件
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
void drawPointCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, std::string titleName)
{
pcl::visualization::PCLVisualizer viewer (titleName);
int v (0);
viewer.createViewPort (0.0, 0.0, 1.0, 1.0, v);
viewer.addCoordinateSystem(0.5);
float bckgr_gray_level = 0.0; // Black
float txt_gray_lvl = 1.0 - bckgr_gray_level;
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_in_color_h (cloud, (int) 255 * txt_gray_lvl, (int) 255 * txt_gray_lvl, (int) 255 * txt_gray_lvl);
viewer.addPointCloud (cloud, cloud_in_color_h, "cloud_in_v1", v);
viewer.addText (titleName, 10, 15, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "icp_info_1", v);
viewer.setBackgroundColor (bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v);
viewer.setCameraPosition (-3.68332, 2.94092, 5.71266, 0.289847, 0.921947, -0.256907, 0);
viewer.setSize (1280, 1024);
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
}
pcl::PointCloud<pcl::PointXYZ>::Ptr readPointCloud_camera(int width, int height, std::vector<int> x, std::vector<int> y, std::vector<int> z)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
cloud->width = width;
cloud->height = height;
cloud->points.resize(width*height);
for (int i = 0 ; i < width*height; i++)
{
cloud->points[i].x = x[i];
cloud->points[i].y = y[i];
cloud->points[i].z = z[i];
}
return cloud;
}
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
std::vector<int> x, y, z;
for (int i = 0 ; i < 10000; i ++)
{
x.push_back(i);
y.push_back(i + 2);
z.push_back(i+10);
}
cloud = readPointCloud_camera(100, 100, x, y, z);
drawPointCloud(cloud, "user defined pointcloud");
return 1;
}