从分割后的深度图像生成点云

这篇具有很好参考价值的文章主要介绍了从分割后的深度图像生成点云。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

前一段时间忙着秋招和修改论文意见反稿,就没有接着做关于Azure Kinect DK相关的探索总结,现在有时间就慢慢补起来。上一篇是利用PP-Humanseg模型分割出color图和深度图中的人像,这一篇紧接着上一篇的工作,从人像分割后的图像结果获得人体的点云数据(也可以直接先生成点云再作点云的分割,等后续探索)。

一、深度图转点云

1.1 原理

关于这部分的原理很多博客和文章都已经有详细的叙述,这里就作一个简单的记录。

首先,我们需知道相机成像原理中的一些映射过程:
从分割后的深度图像生成点云
上图中有四个坐标系分别为世界坐标系( X w X_w Xw, Y w Y_w Yw, Z w Z_w Zw),相机坐标系( X c X_c Xc, X c X_c Xc, X c X_c Xc),像素坐标系( u u u, v v v)和图像物理坐标系( x x x, y y y)。

图像中任意一个像素点m在世界坐标系坐标为( x w x_w xw, y w y_w yw, z w z_w zw),在摄像机坐标系坐标为( x c x_c xc, y c y_c yc, z c z_c zc),在像素坐标系坐标为( u m u_m um, v m v_m vm),在图像物理坐标系坐标为( x m x_m xm, y m y_m ym)。

图像物理坐标系的原点在图像坐标系中的原点为( u 0 u_0 u0, v 0 v_0 v0),图像上每个点在 x x x y y y轴方向上的物理尺寸是 d x d_x dx d y d_y dy。则图像中任意一个像素点m在( u u u, v v v)坐标系中满足如下关系:
[ u m v m 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x m y m 1 ] \begin{bmatrix} u_m \\ v_m \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{d_x}&0&u_0 \\ 0&\frac{1}{d_y} &v_0 \\ 0&0&1 \end{bmatrix} \begin{bmatrix} x_m \\ y_m \\ 1 \end{bmatrix} umvm1 = dx1000dy10u0v01 xmym1

根据刚体变换的过程,世界坐标系中的一点到相机坐标系中的点,可以由一个旋转矩阵R和平移矩阵T来描述:
[ x c y c z c 1 ] = [ R T 0 3 T 1 ] [ x w y w z w 1 ] \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} = \begin{bmatrix} R & T \\ 0_3^T&1\end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} xcyczc1 =[R03TT1] xwywzw1
又因为:
x m = f x c z c , y m = f y c z c , − − − > z c [ x m y m 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ x c y c z c 1 ] x_m = f\frac{x_c}{z_c}, \qquad y_m = f\frac{y_c}{z_c}, \qquad ---> \quad z_c \begin{bmatrix} x_m \\ y_m \\ 1 \end{bmatrix} = \begin{bmatrix} f&0&0&0 \\ 0&f&0&0 \\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} xm=fzcxc,ym=fzcyc,>zc xmym1 = f000f0001000 xcyczc1
由上述描述的三个矩阵等式变换可得:
z c [ u m v m 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R T 0 3 T 1 ] [ x w y w z w 1 ] z_c \begin{bmatrix} u_m \\ v_m \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{d_x}&0&u_0 \\ 0&\frac{1}{d_y} &v_0 \\ 0&0&1 \end{bmatrix} \begin{bmatrix} f&0&0&0 \\ 0&f&0&0 \\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} R & T \\ 0_3^T&1\end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} zc umvm1 = dx1000dy10u0v01 f000f0001000 [R03TT1] xwywzw1
= [ f d x 0 u 0 0 0 f d y v 0 0 0 0 1 0 ] [ R T 0 3 T 1 ] [ x w y w z w 1 ] = \begin{bmatrix} \frac{f}{d_x}&0&u_0&0 \\ 0&\frac{f}{d_y} &v_0&0 \\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} R & T \\ 0_3^T&1\end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} = dxf000dyf0u0v01000 [R03TT1] xwywzw1
其中等式右边的第一个矩阵是相机标定的内参矩阵,第二个矩阵是相机的外参矩阵。

1.2 关键部分

对于单个相机来说,由于世界坐标原点和相机原点重合,也就无旋转和平移,所以有:
z c [ u m v m 1 ] = [ f d x 0 u 0 0 0 f d y v 0 0 0 0 1 0 ] [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] [ x w y w z w 1 ] z_c \begin{bmatrix} u_m \\ v_m \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{f}{d_x}&0&u_0&0 \\ 0&\frac{f}{d_y} &v_0&0 \\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} zc umvm1 = dxf000dyf0u0v01000 1000010000100001 xwywzw1
从以上的矩阵变换可以得到像素点到世界坐标点的变换,即:

z w = z c x w = z c ⋅ ( u m − u 0 ) ⋅ d x / f y w = z c ⋅ ( v m − v 0 ) ⋅ d y / f z_w=z_c \qquad x_w = z_c \cdot (u_m -u_0) \cdot dx / f \qquad y_w = z_c \cdot (v_m -v_0) \cdot dy / f zw=zcxw=zc(umu0)dx/fyw=zc(vmv0)dy/f

1.3 关键代码

pcl::PointCloud<pcl::PointXYZRGB>::Ptr ImageToPointcloud(cv::Mat& color, cv::Mat& depth){
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointcloud( new pcl::PointCloud<pcl::PointXYZRGB>() );
    for (int v = 0; v < depth.rows; v++){
        for (int u = 0; u < depth.cols; u++){
            unsigned int d = depth.ptr<unsigned short>(v)[u];
            pcl::PointXYZRGB point;

            point.z = double(d) / _depthScale;
            point.x = (u - _cx) * point.z / _fx;  // _cx, _cy是摄像头光学中心
            point.y = (v - _cy) * point.z / _fy;  // _fx, _fy是摄像头焦距
            
            point.b = color.data[v*color.step+u*color.channels()];
            point.g = color.data[v*color.step+u*color.channels() + 1];
            point.r = color.data[v*color.step+u*color.channels() + 2];

            pointcloud->points.push_back(point);
        }
    }
    pointcloud->height = 1;
    pointcloud->width = pointcloud->points.size();
    pointcloud->is_dense = false;

    return pointcloud;
}

二、结果展示

这里放出分割后的color图和对应生成的点云:
从分割后的深度图像生成点云
从分割后的深度图像生成点云

总结

关于从深度图像生成点云,就是坐标系点的转换,只要明白其中的原理,代码还是很好写的,后续还会进行相机标定和点云拼接等操作。文章来源地址https://www.toymoban.com/news/detail-462443.html

到了这里,关于从分割后的深度图像生成点云的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于深度学习的图像分割

    摘要 遥感图像分割是利用遥感技术获取的高分辨率图像进行像素级别的分类,将图像中的不同物体或不同地物提取出来的过程。这个过程对于遥感应用具有重要意义,因为它能够提取出地物和地表特征,如河流、道路、建筑、植被、水体等,并且这些特征是地面实际存在的。

    2024年02月06日
    浏览(30)
  • 【深度学习】图像分割概述

    与目标检测不同,语义分割可以识别并理解图像中每一个像素的内容:其语义区域的标注和预测是像素级的。与目标检测相比,语义分割中图像有关狗、猫和背景的标签,语义分割标注的像素级的边框显然更加精细。 本文主要梳理基于深度学习的图像分割方法。按照任务不同

    2024年02月04日
    浏览(24)
  • 【深度学习:图像分割指南】计算机视觉中的图像分割指南:最佳实践

    图像分割是计算机视觉中的一项关键任务,其目标是将图像划分为不同的有意义且可区分的区域或对象。这是物体识别、跟踪和检测、医学成像和机器人等各种应用中的一项基本任务。 许多技术可用于图像分割,从传统方法到基于深度学习的方法。随着深度学习的出现,图像

    2024年01月23日
    浏览(73)
  • 深度学习实验-3d医学图像分割

    实验四 基于nnU-Net模型的3D医学图像分割实验 腹部多器官分割一直是医学图像分析领域最活跃的研究领域之一,其作为一项基础技术,在支持疾病诊断,治疗规划等计算机辅助技术发挥着重要作用。近年来,基于深度学习的方法在该领域中获得了巨大成功。本实验数据集为多

    2024年02月07日
    浏览(40)
  • 深度学习图像分类、目标检测、图像分割源码小项目

    ​demo仓库和视频演示: 到此一游7758258的个人空间_哔哩哔哩_bilibili 卷积网路CNN分类的模型一般使用包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型 目标检测包括yolov3、yolov4、yolov5、yolox、faster rcnn、SDD等 图像分割包

    2024年02月09日
    浏览(36)
  • 深度学习中语义分割、实例分割、目标检测和图像分类区别

    语义分割 实例分割 目标检测 语义分割:需要判断每个像素属于哪一个类别,属于像素级别分类标注 实例分割:相较于语义分割 会将同一类别的不同物体进行分离标注   目标检测:输入图像通常包含多个物体,对物体的位置与类别进行标注  图像分类:输入图像通常包含一

    2024年02月08日
    浏览(42)
  • 基于深度学习的图像分割技术探究

    导言: 图像分割是计算机视觉领域的重要任务,旨在将图像划分为不同的语义区域,实现对图像中感兴趣物体的定位和提取。深度学习作为图像分割的新兴技术,通过卷积神经网络(CNN)等模型,取得了显著的分割效果。本文将探究基于深度学习的图像分割技术的原理、应用

    2024年02月15日
    浏览(28)
  • Open3D 点云数据转深度图像(二,Python版本)

    之前使用过PCL中的生成深度图像功能,就想着使用MATLAB也实现一下类似的功能,整个过程是一个旋转水平和竖直角度的采样过程,如下图所示(具体内容也可以参考深度图像转点云数据(激光雷达数据)),最终的结果可以通过行号和列号就可以确定俯仰角patch和偏航角yaw的

    2024年02月12日
    浏览(35)
  • Open3D 点云数据转深度图像(一,python版本)

    由于对深度图像也是感觉比较好奇,所以就简单的使用正投影的方式来生成一个深度图像来看一下效果,深度值这里采用了z值的差值(高差),具体的代码与效果如下所示。 这里是将点云投影到xoy平面上,使用高差作为深度值。

    2024年02月15日
    浏览(29)
  • 深度学习——制作自己的VOC图像分割数据集

    1、数据集介绍 COCO数据集有80个类别,VOC数据集有20个类别。当这些数据集类别中没有自己需要的时候,就需要自己动手做自己的数据集了。 我自己在做数据集的时候主要使用到了labelme和labelImg两个工具。labelme主要是制作语义分割数据集(ImageSets,JPEGImages,SegmentationClass,Segmenta

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包