彩色图像和深度图像合成点云

article/2025/8/4 23:07:31

 彩色图像

更改浏览器试一下

深度图像

更改浏览器试一下

 点云图

从2D到3D(数学部分)

  • 上面两个图像给出了机器人外部世界的一个局部的信息.
  • 假设这个世界由一个点云来描述:X={x1,…,xn}.其中每一个点,有r,g,b,x,y,z一共6个分量,表示它们颜色与空间位置。 颜色方面,主要由彩色图像记录; 而空间位置,可以由图像和相机模型、姿态一起计算出来。
  • 对于常规相机,SLAM里使用针孔相机模型:

简而言之,一个空间点[x,y,z]和它在图像中的像素坐标[u,v,d] (d指深度数据) 的对应关系是这样的:

 这个公式是从(x,y,z)推到(u,v,d)的。反之,我们也可以把它写成已知(u,v,d),推导(x,y,z)的方式.公式如下:

根据这个公式就可以构建点云

如果相机发生了位移和旋转,那么只要对这些点进行位移和旋转操作即可

从2D到3D (编程部分)

  • 代码根目录/src/ 文件夹中新建一个generatePointCloud.cpp文件
    touch src/generatePointCloud.cpp

    内容如下:

  • // C++ 标准库
    #include <iostream>
    #include <string>
    using namespace std;// OpenCV 库
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>// PCL 库
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>// 定义点云类型
    typedef pcl::PointXYZRGBA PointT;
    typedef pcl::PointCloud<PointT> 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()来读取图像// API: http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imread#cv2.imreadrgb = cv::imread( "../data/rgb.png" );// rgb 图像是8UC3的彩色图像// depth 是16UC1的单通道图像,注意flags设置-1,表示读取原始数据不做任何修改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<ushort>(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<uchar>(m)[n*3];p.g = rgb.ptr<uchar>(m)[n*3+1];p.r = rgb.ptr<uchar>(m)[n*3+2];// 把p加入到点云中cloud->points.push_back( p );}// 设置并保存点云cloud->height = 1;cloud->width = cloud->points.size();cout<<"point cloud size = "<<cloud->points.size()<<endl;cloud->is_dense = false;pcl::io::savePCDFile( "../data/pointcloud.pcd", *cloud );// 清除数据并退出cloud->points.clear();cout<<"Point cloud saved."<<endl;return 0;
    }

    程序运行需要数据。请把上面的那两个图存放在工程根目录/data下。

  • OpenCV的imread函数读取图片。在OpenCV2里,图像是以矩阵(cv::MAt)作为基本的数据结构。
  • Mat结构既可以帮你管理内存、像素信息,还支持一些常见的矩阵运算,是非常方便的结构。
  • 彩色图像含有R,G,B三个通道,每个通道占8个bit(也就是unsigned char),故称为8UC3(8位unsigend char, 3通道)结构。
  • 而深度图则是单通道的图像,每个像素由16个bit组成(也就是C++里的unsigned short),像素的值代表该点离传感器的距离。通常1000的值代表1米,所以我们把camera_factor设置成1000. 这样,深度图里每个像素点的读数除以1000,就是它离你的真实距离了
  • 我们按照“先列后行”的顺序,遍历了整张深度图。在这个双重循环中:
for (int m = 0; m < depth.rows; m++)for (int n=0; n < depth.cols; n++)
  • m指图像的行,n是图像的列。它和空间点的坐标系关系是这样的:
  • 深度图第m行,第n行的数据可以使用depth.ptr(m) [n]来获取。其中,cv::Mat的ptr函数会返回指向该图像第m行数据的头指针。然后加上位移n后,这个指针指向的数据就是我们需要读取的数据啦
  • 编译并运行
  • 最后,我们在src/CMakeLists.txt里加入几行代码,告诉编译器我们希望编译这个程序。请在此文件中加入以下几行:
  • # 增加PCL库的依赖
    FIND_PACKAGE( PCL REQUIRED COMPONENTS common io )# 增加opencv的依赖
    FIND_PACKAGE( OpenCV REQUIRED )# 添加头文件和库文件
    ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
    INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS}  )
    LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} )ADD_EXECUTABLE( generate_pointcloud src/generatePointCloud.cpp )
    TARGET_LINK_LIBRARIES( generate_pointcloud ${OpenCV_LIBS} ${PCL_LIBRARIES} )
  • 计算三维点坐标的公式我们已经给出过了,代码里原封不动地实现了一遍。我们根据这个公式,新增了一个空间点,并放入了点云中。最后,把整个点云存储为 ./data/pointcloud.pcd 文件

  • cd build
    cmake ..
    make
    cd ..

    如果编译通过,就可在build目录下找到新写的二进制:generate_pointcloud 运行它:

  • ./generate_pointcloud
  • 即可在data目录下生成点云文件。
  • 现在,你肯定希望查看一下新生成的点云了。如果已经安装了pcl,就可以通过:
pcl_viewer pointcloud.pcd
  • 提示:
如果你打开点云,只看到红绿蓝三个方块,请按R重置视角。刚才你是站在原点盯着坐标轴看呢。
如果点云没有颜色,请按5显示颜色。
cmake过程可能有PCL的警告,如果你编译成功了,无视它即可。这是程序员的本能。

 


http://chatgpt.dhexx.cn/article/6G7cwwOj.shtml

相关文章

matlab灰度图孔洞填充,一种深度图像空洞的自动填充方法与流程

本发明涉及深度图像空洞填充技术,从彩色图像的结构相似性出发,求解空洞像素点的多尺度结构相似性,将空洞像素分为平滑区域空洞像素和非平滑区域空洞像素,并针对不同的空洞像素,采用不同的填充算法。在平滑区域空洞的填充过程中,利用最短距离聚类算法对深度图像的像素深度…

动态捕捉(四)深度图像基础知识

第一部分&#xff1a; 深度图像&#xff08;depth image)也被称为距离影像&#xff08;range image&#xff09;&#xff0c;是指将从图像采集器到场景中各点的距离&#xff08;深度&#xff09;作为像素值的图像&#xff0c;它直接反映了景物可见表面的几何形状。深度图像经过…

【论文精读】Unsupervised Deep Image Stitching: Reconstructing Stitched Features to Images(无监督的深度图像拼接)

论文下载链接 文章目录 前言摘要一、介绍二、相关工作2.1 基于特征的图像拼接2.2 基于学习的图像拼接2.3深度单应方法 》研究动机三、无监督图像拼接Ⅰ、无监督图像对齐Ⅱ、无监督图像重建 四、实验Ⅰ、数据集Ⅱ、实验细节 五、总结和未来工作Ⅰ、总结Ⅱ、局限和未来工作 前言 …

如何从点云创建深度图像,看这篇你就懂了(附详细代码)

作者I Roar冷颜CSDN 编辑I 3D视觉开发者社区 前言 目前&#xff0c;深度图像的获取方法有&#xff1a;激光雷达深度成像法、计算机立体视觉成像、坐标测量机法、莫尔条纹法、结构光法等。针对深度图像的研究重点主要集中在以下几个方面&#xff1a;深度图像的分割技术&#xff…

深度图像的获取原理

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 转载| 机器人配视觉 今天介绍一下深度图像的获取方法主要有哪些&#xff0c;以及这些方法会导致深度图像中存在什么样的问题。 在计算机视觉系统中&#xff0c;三维场景…

二维ICP配准

二维ICP配准 1. 理论1.1 ICP算法1.2 目标函数1.3 简化目标函数1.4 变换矩阵求解 2. Python实现2.1 导入模块2.2. 定义相关函数2.2.1 求解二维点间距函数2.2.2 求解二维点距离点集最近点函数2.2.3 求解二维点集间平均距离函数 2.3. 定义ICP_2D2.4. 定义点云2.5. ICP 配准 1. 理论…

CloudCompare——实现点云由粗到精的配准

目录 1.粗配准2.精配准3.合并点云4.去除重叠点5.附&#xff1a;手算配准精度5.1 精确选取同名点5.2 计算配准误差 6.相关链接 1.粗配准 使用Tools-> Registration -> Align (point pairs picking)工具手动选取匹配点对。此工具允许用户通过在两个实体中拾取至少三个等效点…

图像配准综述

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自 | 新机器视觉 Image registration 图像配准 图像配准与相关 图像处理研究领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合针对同一对象在不同…

PCL教程-点云配准之成对逐步配准(两两配准)

原文链接&#xff1a;How to incrementally register pairs of cloudshttps://pcl.readthedocs.io/projects/tutorials/en/latest/pairwise_incremental_registration.html#pairwise-incremental-registrationhttps://pcl.readthedocs.io/projects/tutorials/en/latest/pairwis…

图像配准学习小结 (一)

图像配准学习小结 &#xff08;一&#xff09; 一、含义和意义 图像配准是找到一组变换参数&#xff0c;使得变换后的待配准图像与原始图像之间的相似度达到最高&#xff0c;目的在于将同一场景的不同图像转换到同样的坐标系中。待配准图像与原图像可能存在时间、捕获方式、角…

图像配准概述

图像配准在医学图像领域是一项重要的技术&#xff0c;在许多的临床诊断中&#xff0c;为了分析患者的状况&#xff0c;常常需要采集患者的扫描影像&#xff0c;例如&#xff0c;X线、MRI、CT和超声&#xff0c;这些扫描影像可以对患者的诊断提供依据&#xff0c;然而&#xff0…

基于MATLAB的医学图像配准算法仿真

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、部分MATLAB程序 四、仿真结论分析 五、算法相关应用 六、参考文献 一、理论基础 其中h表示二维空间坐标变换&#xff0c;g表示灰度或辐射变换&#xff0c;描述因传感器类型的不同或辐射变形所引入的图像变换…

图像配准简介

图像配准在目标检测、模型重建、运动估计、特征匹配,肿瘤检测、病变定位、血管造影、地质勘探、航空侦察等领域都有广泛的应用。 每一种配准方法通常都针对某个具体问题而设计的,众多方法中,唯一的共性就是每个配准问题最终都要在变换空间中寻找一种最有的变换,这种变换能…

基于深度学习的单模医学图像配准综述(附VoxelMorph配准实例)

本文是基于深度学习的单模态医学图像配准的综述&#xff0c;除了介绍配准任务、配准过程之外&#xff0c;还会从实际操作出发&#xff0c;以经典的VoxelMorph为例做详细介绍。如果有什么讲的不清楚的地方欢迎大家留言讨论&#xff0c;如果有什么错误的地方&#xff0c;也恳请大…

图像配准

1、定义 维基百科上的定义&#xff1a;图像配准与相关是图像处理研究领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合针对同一对象在不同条件下获取的图像&#xff0c;例如图像会来自不同的采集设备&#xff0c;取自不同的时间&#xff0c;不同的拍摄视角等等…

【Image Registration】图像配准综述

文章目录 一、图像配准定义二、图像配准应用场景2.1 医学图像领域2.2 其他领域 三、图像配准分类四、图像配准过程4.1 特征检测&#xff08;Feature detection&#xff09;4.2 特征匹配&#xff08;Feature matching&#xff09;4.2.1 基于区域的方法&#xff08;Area-based me…

计算机视觉 什么是图像配准?

一、图像配准概述 图像配准是叠加两个或多个来自不同来源、在不同时间和角度拍摄的图像的过程。图像配准过程是一种自动或手动操作,它试图发现两张照片之间的匹配点并在空间上对齐它们以最小化所需的误差,即两幅图像之间的统一邻近度测量。医学、遥感和计算机视觉都使用图像配…

1.图像配准简述

1.图像配准&#xff1a;作为图像融合的一个预处理步骤&#xff0c;图像配准是对两幅图像&#xff0c;通过寻找一种空间变换把一幅图像映射到另一幅图像&#xff0c;使得两图中对应于空间同一位置的点一一对应起来&#xff0c;从而达到信息融合的目的。 2.原理&#xff1a; 3.分…

机器视觉(九):图像配准

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

【图像处理】什么是图像配准?

一、图像配准概述 图像配准是叠加两个或多个来自不同来源、在不同时间和角度拍摄的图像的过程。图像配准过程是一种自动或手动操作&#xff0c;它试图发现两张照片之间的匹配点并在空间上对齐它们以最小化所需的误差&#xff0c;即两幅图像之间的统一邻近度测量。医学、遥感和计…