PCL学习
organized point cloud:具有某种结构的点云,例如来自立体视觉相机的点云。
projectable point cloud: 根据针孔相机模型,像素点与对应的3D点有如下关系, u=fx/z,v=fy/z
width:[1]点云中点的数量(unorganized point cloud); [2]点云中每行点的数量(organized point cloud)。
height:[1]被设置为1(unorganized point cloud);[2]点云的行数(organized point cloud)。
cloud.width=640; //每行有640个点
cloud.height=480; //点云有480行
pcl::PointCloud<pcl::PointXYZ> cloud; //定义点云
std::vector<pcl::PointXYZ> data=cloud.points; //点云存储
使用PCL的CMakeLists.txt的写法
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
//最小的cmake版本要求
project(MY_GRAND_PROJECT)
//项目名称
find_package(PCL 1.3 REQUIRED COMPONENTS common io)
//找到PCL1.3及以上的版本
//REQUIRED表示找不到,cmake失败
//COMPONENTS表示对PCL模块的要求
要求一个模块:find_package(PCL 1.3 REQUIRED COMPONENTS io)
要求多个模块:find_package(PCL 1.3 REQUIRED COMPONENTS io common)
要求所有模块:find_package(PCL 1.3 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
//如果PCL被找到的话,下面几个相关的变量就会被设置
PCL_FOUND:PCL找到后就设置为1,否则未设置
PCL_INCLUDE_DIRS:设置PCL头文件和依赖项头文件的安装路径
PCL_LIBRARIES:设置构建和已安装PCL库的文件名
PCL_LIBRARY_DIRS:设置PCL库和第三方依赖驻留的路径
PCL_VERSION:找到的PCL版本
PCL_COMPONENTS:列出所有的可用部分
PCL_DEFINITIONS:列出所有需要的预处理器定义和编译器标志
add_executable(pcd_write_test pcd_write.cpp)
target_link_libraries(pcd_write_test ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES})
如果PCL被以很奇怪的方式安装,可以通过在find_package之前加入set(PCL_DIR “/path/to/PCLConfig.cmake”)来帮助cmake找到PCL
使用点云的一个例子
// 定义点云使用的格式:这里用的是XYZRGB
typedef pcl::PointXYZRGB PointT;
typedef pcl::PointCloud<PointT> PointCloud;
// 新建一个点云
PointCloud::Ptr pointCloud( new PointCloud );
for ( int i=0; i<5; i++ )
{
cout<<"转换图像中: "<<i+1<<endl;
cv::Mat color = colorImgs[i];
cv::Mat depth = depthImgs[i];
Eigen::Isometry3d T = poses[i];
for ( int v=0; v<color.rows; v++ )
for ( int u=0; u<color.cols; u++ )
{
unsigned int d = depth.ptr<unsigned short> ( v )[u]; // 深度值
if ( d==0 ) continue; // 为0表示没有测量到
Eigen::Vector3d point;
point[2] = double(d)/depthScale;
point[0] = (u-cx)*point[2]/fx;
point[1] = (v-cy)*point[2]/fy;
Eigen::Vector3d pointWorld = T*point;
PointT p ;
p.x = pointWorld[0];
p.y = pointWorld[1];
p.z = pointWorld[2];
p.b = color.data[ v*color.step+u*color.channels() ];
p.g = color.data[ v*color.step+u*color.channels()+1 ];
p.r = color.data[ v*color.step+u*color.channels()+2 ];
pointCloud->points.push_back( p );
}
}
pointCloud->is_dense = false;
cout<<"点云共有"<<pointCloud->size()<<"个点."<<endl;
pcl::io::savePCDFileBinary("map.pcd", *pointCloud );