图像处理技术之六:深度图像+彩色图像=点云图像

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <opencv2/opencv.hpp>

using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

int user_data;
const double u0 = 319.52883;
const double v0 = 271.61749;
const double fx = 528.57523;
const double fy = 527.57387;


void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
 viewer.setBackgroundColor(0.0, 0.0, 0.0);
}

int main()
{
 pcl::PointCloud<pcl::PointXYZRGB> cloud_a;
 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);

 cv::Mat color = cv::imread("co.jpg");
 cv::Mat depth1 = cv::imread("de.jpg");

 //add
 cv::Size dsize = cv::Size(color.cols, color.rows);
 cv::Mat depth = cv::Mat(dsize, CV_8UC3);
 resize(depth1,depth,dsize);
 //add

 int rowNumber = color.rows;
 int colNumber = color.cols;

 cloud_a.height = rowNumber;
 cloud_a.width = colNumber;
 cloud_a.points.resize(cloud_a.width * cloud_a.height);

 for (unsigned int u = 0; u < rowNumber; ++u)
 {
  for (unsigned int v = 0; v < colNumber; ++v)
  {
   unsigned int num = u*colNumber + v;
   double Xw = 0, Yw = 0, Zw = 0;

   //Zw = ((double)depth.at<uchar>(u, v)) / 255.0 * 10001.0;
   //Xw = (u - u0) * Zw / fx;
   //Yw = (v - v0) * Zw / fy;
   Zw = ((double)depth.at<uchar>(u, v));
   Xw = u;
      Yw = v;

   cloud_a.points[num].b = color.at<cv::Vec3b>(u, v)[0];
   cloud_a.points[num].g = color.at<cv::Vec3b>(u, v)[1];
   cloud_a.points[num].r = color.at<cv::Vec3b>(u, v)[2];

   cloud_a.points[num].x = Xw;
   cloud_a.points[num].y = Yw;
   cloud_a.points[num].z = Zw;
  }
 }

 *cloud = cloud_a;

 pcl::visualization::CloudViewer viewer("Cloud Viewer");

 viewer.showCloud(cloud);

 viewer.runOnVisualizationThreadOnce(viewerOneOff);

 while (!viewer.wasStopped())
 {
  user_data = 9;
 }

 return 0;
}



//要把深度图像转换成彩色图像一样的大小,不然会显示内存异常

 

http://blog.csdn.net/yongshengsilingsa/article/details/37935975

http://blog.csdn.net/kh1445291129/article/details/44636685

http://blog.csdn.net/morewindows/article/details/8239560

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 生成点云的方法通常涉及三维重建技术,可以使用彩色图和深度图进行点云生成。 首先,使用相机捕捉到场景的彩色图像深度图像深度图像记录了场景中每个像素到相机的距离,因此可以用于计算场景中物体的三维形状。 接下来,可以使用计算机视觉库(例如OpenCV)中的函数将彩色图像深度图像转换为点云数据。具体来说,可以使用以下步骤: 1. 根据相机的内部参数和深度图像中的像素值,计算每个像素对应的三维坐标。这可以通过相机标定和深度图像的反投影来实现。 2. 将计算出的三维坐标与彩色图像中的像素值进行匹配,从而将每个点的颜色信息与其三维坐标关联起来。 3. 将匹配后的点云数据保存为常见的三维点云格式,例如PLY或OBJ。 值得注意的是,点云的生成质量受到深度图像的质量和精度的限制。因此,在进行点云生成之前,需要对深度图像进行校准和滤波,以消除深度图像中的噪声和失真。 ### 回答2: 彩色图和深度图如何生成点云,需要通过相机获取彩色图和深度图的数据,并将其转化为点云表示。 首先,彩色图是由相机捕捉到的每个像素点的颜色信息组成的图像。我们可以通过相机的光学传感器来获取每个像素点的颜色值,并将其转化为RGB格式的数据。 其次,深度图是由相机测量到的每个像素点距离相机的距离信息组成的图像。我们可以通过相机的深度传感器来获取每个像素点到相机的距离,并将其转化为深度值或者相对距离值。 生成点云的过程可以分为以下几个步骤: 1. 根据相机的内参矩阵和外参矩阵,将彩色图和深度图中的每个像素点的坐标变换到世界坐标下。 2. 对于每个像素点,根据深度值和相机的投影模型,计算出其对应的三维坐标。 3. 将每个像素点的三维坐标和对应的彩色信息组成一个点(Point)。 4. 将所有生成的点组成一个点云(PointCloud),可以使用相应的数据结构进行存储和操作。 需要注意的是,生成点云的质量和精度会受到相机的质量、深度传感器的性能以及相机标定的准确度等因素的影响。在实际操作中,还可以采用点云滤波、点云配准等技术对生成的点云进行进一步处理和优化。 ### 回答3: 彩色图和深度图是通过不同的传感器获得的。彩色图是由RGB相机等传感器捕捉到的,它能够感知物体的颜色和纹理。而深度图则是由深度相机或者ToF(Time of Flight)相机获得的,它能够感知物体与相机之间的距离。 生成点云需要将这两种图像信息结合起来。首先,我们需要提取彩色图中的RGB信息和深度图中的深度信息。然后,将深度信息转化为三维坐标,即将每个像素的深度值映射到相应的空间位置上。 通常,由于深度图像素与RGB图像像素在空间上的对应关系是已知的,我们可以根据它们的像素索引进行匹配。通过将深度值与相应的图像坐标配对,我们可以将每个像素的深度信息转化为点的三维坐标。 在生成点云时,我们可以用每个点的坐标来表示物体在三维空间中的位置。此外,我们还可以将对应点在彩色图中的RGB值赋给该点的颜色属性,从而给点云赋予颜色信息。 总结来说,生成点云需要利用彩色图和深度图提取RGB信息和深度信息,并将深度信息转化为三维坐标。然后,通过将像素索引匹配并将颜色属性关联,可以得到带有颜色和三维位置信息的点云。这样的点云可以用于许多应用领域,如三维重建、虚拟现实和机器人视觉等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值