栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

「Point Cloud」用彩色图像和深度图像生成点云图像

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

「Point Cloud」用彩色图像和深度图像生成点云图像

文章目录
    • 生成的点云图像
    • 详细注释实践代码
    • 编译环境和文件

生成的点云图像

详细注释实践代码
// C++ 标准库
#include 
#include 
using namespace std;

// OpenCV 库
#include 
#include 

// PCL 库
#include 
#include 
#include 

// 定义点云数据类型
typedef pcl::PointXYZRGBA PointT;
// 定义点云
typedef pcl::PointCloud PointCloud; 

// 相机内参
const double camera_factor = 1000;
const double camera_cx = 325.5;
const double camera_cy = 253.5;
const double camera_fx = 518.0;
const double camera_fy = 519.0;

// 主函数 
int main( int argc, char** argv )
{
    // 读取./data/rgb.png和./data/depth.png,并转化为点云
    // 图像矩阵
    cv::Mat rgb, depth;
    // 使用cv::imread()来读取图像
    // 关注公众号"小秋SLAM笔记或者小秋SLAM代码实践笔记"添加小秋微信获取图像
    rgb = cv::imread( "../data/rgb.png" );
    // rgb 图像是8UC3的彩色图像
    // depth 是16UC1的单通道图像,注意flags设置-1,表示读取原始数据不做任何修改
    // 关注公众号"小秋SLAM笔记或者小秋SLAM代码实践笔记"添加小秋微信获取图像
    depth = cv::imread( "../data/depth.png", -1 );

    // 点云变量 使用智能指针,创建一个空点云,这种指针用完会自动释放。
    PointCloud::Ptr cloud ( new PointCloud );
    // 遍历深度图 行优先
    for (int m = 0; m < depth.rows; m++)
        for (int n=0; n < depth.cols; n++)
        {
            // 获取深度图中(m,n)处的值
            ushort d = depth.ptr(m)[n];
            // d 可能没有值,若如此,跳过此点
            if (d == 0)
                continue;
            // d 存在值,则向点云增加一个点
            PointT p;

            // 计算这个点的空间坐标
            p.z = double(d) / camera_factor;
            p.x = (n - camera_cx) * p.z / camera_fx;
            p.y = -((m - camera_cy) * p.z / camera_fy);
            
            // 从rgb图像中获取它的颜色
            // rgb是三通道的BGR格式图,所以按下面的顺序获取颜色
            p.b = rgb.ptr(m)[n*3];
            p.g = rgb.ptr(m)[n*3+1];
            p.r = rgb.ptr(m)[n*3+2];

            // 把p加入到点云中
            cloud->points.push_back( p );
        }
    // 设置并保存点云
    cloud->height = 1;
    cloud->width = cloud->points.size();
    cout<<"point cloud size = "<points.size()<is_dense = false;
    // 保存点云
    pcl::io::savePCDFile( "../data/pointcloud.pcd", *cloud );
    cout<<"Point cloud saved."< 
编译环境和文件 
# 编译环境
# ubuntu 16.04
# OpenCV 3.4.0
# pcl 1.7

CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
PROJECT( slam )

SET(CMAKE_CXX_COMPILER "g++")
SET( CMAKE_BUILD_TYPE Debug  )
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include )
link_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)

# 增加PCL库的依赖
FIND_PACKAGE( PCL REQUIRED )

# 增加opencv的依赖
FIND_PACKAGE( OpenCV REQUIRED )

# 添加头文件和库文件
ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS}  )
link_LIBRARIES( ${PCL_LIBRARY_DIRS} )

# 增加一个可执行的二进制
ADD_EXECUTABLE( generate_pointcloud generatePointCloud.cpp )
TARGET_link_LIBRARIES( generate_pointcloud ${OpenCV_LIBS} ${PCL_LIBRARIES} )
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号