精华内容
下载资源
问答
  • 深度图
    千次阅读
    2021-12-08 20:37:47


    我们在得到SFM线程传进来的稀疏点,要稠密重建,自然得对这些稀疏的三维点进行补全。也即我们需要根据稀疏点投影到当前帧的投影点的深度值去估计该投影点邻域像素点的深度值(在可用的稀疏点之间插值初始化深度图),从而得到更加准确的深度图。后续根据深度图去进行稠密重建。

    1. 初始化SFM得到的稀疏点

    /**
     * @brief depth计算,采用patchMatch方法 
            原理细节主要是参考论文"Accurate Multiple View 3D Reconstruction Using Patch-Based Stereo for Large-Scale Scenes", S. Shen, 2013
     *      代价计算分两种方式一种是上述论文里面的简单的直接使用NCC来作为匹配代价;
    		另一种是带权重的代价参考论文"PatchMatch Stereo - Stereo Matching with Slanted Support Windows"公式3
     *		以NCC为评价标准,使用传播和随机优化来估计深度图
    
     *      给定同一场景的两个视图,我们将重建深度图的视图记为“参考图像”,将另一个视图记为“目标图像”。
     *      第一步:在可用的稀疏点之间插值初
    更多相关内容
  • 深度图

    千次阅读 2019-07-03 09:59:53
    深度图表示 32 bits images should be in meters, and 16 bits should be in mm 深度图:32位的值表示米,16位的值表示mm. 因为16位置图像能表示的范围为:(-65535~65535)且是整数.为了表示带小数的深度值,16位...

    深度图

    深度图表示

    32 bits images should be in meters, and 16 bits should be in mm
    深度图:32位的值表示米,16位的值表示mm.
    因为无符型16位置图像能表示的范围为:(0~65535)且是整数.为了表示带小数的深度值,16位的值只能以mm为单位,即只能表示0m ~ 65.5m的范围.

    用16位存储深度图的方便是,它能够被存为png格式.而32位的图像只能被存为tif格式.
    如果用opencv导出的话,Mat类型为CV_32FC1或CV_16UC1(注意imwrite时不要用CV_16SC1,但在读取像素值时可以用at< short>())

    32位深度图与16位深度图的转换

    cv::Mat cvtDepthFromFloat(const cv::Mat & depth32F)
    {
    	UASSERT(depth32F.empty() || depth32F.type() == CV_32FC1);
    	cv::Mat depth16U;
    	if(!depth32F.empty())
    	{
    		depth16U = cv::Mat(depth32F.rows, depth32F.cols, CV_16UC1);
    		int countOverMax = 0;
    		for(int i=0; i<depth32F.rows; ++i)
    		{
    			for(int j=0; j<depth32F.cols; ++j)
    			{
    				float depth = (depth32F.at<float>(i,j)*1000.0f);
    				unsigned short depthMM = 0;
    				if(depth > 0 && depth <= (float)USHRT_MAX)
    				{
    					depthMM = (unsigned short)depth;
    				}
    				else if(depth > (float)USHRT_MAX)
    				{
    					++countOverMax;
    				}
    				depth16U.at<unsigned short>(i, j) = depthMM;
    			}
    		}
    		if(countOverMax)
    		{
    			UWARN("Depth conversion error, %d depth values ignored because "
    				  "they are over the maximum depth allowed (65535 mm). Is the depth "
    				  "image really in meters? 32 bits images should be in meters, "
    				  "and 16 bits should be in mm.", countOverMax);
    		}
    	}
    	return depth16U;
    }
    
    cv::Mat cvtDepthToFloat(const cv::Mat & depth16U)
    {
    	UASSERT(depth16U.empty() || depth16U.type() == CV_16UC1);
    	cv::Mat depth32F;
    	if(!depth16U.empty())
    	{
    		depth32F = cv::Mat(depth16U.rows, depth16U.cols, CV_32FC1);
    		for(int i=0; i<depth16U.rows; ++i)
    		{
    			for(int j=0; j<depth16U.cols; ++j)
    			{
    				float depth = float(depth16U.at<unsigned short>(i,j))/1000.0f;
    				depth32F.at<float>(i, j) = depth;
    			}
    		}
    	}
    	return depth32F;
    }
    

    视差图转深度图

    cv::Mat depthFromDisparity(const cv::Mat & disparity,
    		float fx, float baseline,
    		int type)
    {
    	UASSERT(!disparity.empty() && (disparity.type() == CV_32FC1 || disparity.type() == CV_16SC1));
    	UASSERT(type == CV_32FC1 || type == CV_16UC1);
    	cv::Mat depth = cv::Mat::zeros(disparity.rows, disparity.cols, type);
    	int countOverMax = 0;
    	for (int i = 0; i < disparity.rows; i++)
    	{
    		for (int j = 0; j < disparity.cols; j++)
    		{
    			float disparity_value = disparity.type() == CV_16SC1?float(disparity.at<short>(i,j))/16.0f:disparity.at<float>(i,j);
    			if (disparity_value > 0.0f)
    			{
    				// baseline * focal / disparity
    				float d = baseline * fx / disparity_value;
    				if(d>0)
    				{
    					if(depth.type() == CV_32FC1)
    					{
    						depth.at<float>(i,j) = d;
    					}
    					else
    					{
    						if(d*1000.0f <= (float)USHRT_MAX)
    						{
    							depth.at<unsigned short>(i,j) = (unsigned short)(d*1000.0f);
    						}
    						else
    						{
    							++countOverMax;
    						}
    					}
    				}
    			}
    		}
    	}
    	if(countOverMax)
    	{
    		UWARN("Depth conversion error, %d depth values ignored because they are over the maximum depth allowed (65535 mm).", countOverMax);
    	}
    	return depth;
    }
    
    

    opencv读取深度图

    因为深度图都是png或tiff的,所以要用IMREAD_ANYDEPTH

        cv::Mat result = cv::imread("1.png",cv::IMREAD_ANYDEPTH);
    
    展开全文
  • 视差图、深度图和点云

    本篇是比较简单的基础概念,刚入门的朋友可能是需要的。

    视差图
    三维点云

    首先,我们要介绍下这三个概念。

    视差(disparity)

    视差 d d d 等于同名点对在左视图的列坐标减去在右视图上的列坐标,是像素单位
    d = x l − x r d=x_l-x_r d=xlxr立体视觉里,视差概念在极线校正后的像对里使用。

    深度(depth)

    深度D等于像素在该视图相机坐标系下 Z Z Z坐标,是空间单位。深度并不特在校正后的图像对里使用,而是任意图像都可获取深度图。

    视差图(disparity map)

    视差图指存储立体校正后单视图所有像素视差值的二维图像。

    1. 视差图是一张二维图像,和原图等大小
    2. 视差图每个位置保存的以像素为单位的该位置像素的视差值
    3. 以左视图视差图为例,在像素位置p的视差值等于该像素在右图上的匹配点的列坐标减去其在左图上的列坐标

    深度图(depth map)

    深度图指存储单视图所有像素的深度值的二维图像,是空间单位,比如毫米。

    1. 深度图是一张二维图像,和原图等大小,也就和视差图等大小
    2. 深度图每个位置保存的是该位置像素的深度值
    3. 深度值就是相机坐标系下的Z坐标值

    点云(point cloud)

    点云指三维空间的三维点集合,坐标属性( X , Y , Z X,Y,Z X,Y,Z),法线属性( N x , N y , N z N_x,N_y,N_z Nx,Ny,Nz)(可选),颜色属性( R , G , B R,G,B R,G,B)(可选)

    其次,为什么会有视差图和深度图呢?

    我们知道,立体匹配一般是指逐像素的稠密匹配,这意味着每个像素都会得到一个视差值(包括无效值),如何存储这些视差值呢,显然以二维图的方式存储是很合适的,最大的两点优势是一方面可以通过像素坐标快速的在二维图中找到对应位置的视差值,而且和图像一样是有序的,邻域检索、视差滤波等将会变得非常方便;另一方面是可以直观的通过观察视差图和原图的对比,对视差图的质量有初步的判定。

    而深度图的意义则是以更少的存储空间、有序的表达图像匹配的三维成果。更少的存储空间是因为只保存了一个深度值,而不是三维点云的三个坐标值,而深度值是可以结合像素坐标计算三维点坐标值的。有序是因为深度图和原图像素是一一对应的,所以原图的邻域信息完全继承到了深度图里。

    这就是视差图和深度图的意义,视差图是立体匹配算法的产出,而深度图则是立体匹配到点云生成的中间桥梁。

    视差图和深度图中间,有着一对一的转换公式:
    D = B f d + ( x 0 r − x 0 l ) D=\frac {Bf}{d+(x_{0r}-x_{0l})} D=d+(x0rx0l)Bf
    其中, D D D为深度, d d d为视差, B B B为基线长度, f f f为焦距(像素单位), x 0 l x_{0l} x0l x 0 r x_{0r} x0r分别为左右视图主点的列坐标。,另一个较为熟知的公式是
    D = B f d D=\frac {Bf}{d} D=dBf
    这是在左右视图主点的列坐标相同的特殊情况,比如主点都在中心。

    深度图计算相机坐标系下的点云,也有着简单的公式:
    Z = D X = D ( x − x 0 l ) f Y = D ( y − y 0 l ) f \begin{aligned} Z &= D\\ X &= \frac {D(x-x_{0l})}{f}\\ Y &= \frac {D(y-y_{0l})}{f} \end{aligned} ZXY=D=fD(xx0l)=fD(yy0l)
    其中, x , y x,y x,y为像素的列坐标和行坐标, x 0 l x_{0l} x0l y 0 l y_{0l} y0l为主点的像素坐标。

    常见问答:
    问:为什么我从.png格式的视差图里读取到的视差值和真实值有很大差异?
    答: 我们要先搞清楚,视差图是如何存储的。通常而言,我们是把二维视差图以图像格式存储,常见的格式有png、tif、pfm等,但这些图像格式存储的数据类型是有区别的,其中png只能存储整数,而tif和pfm则可以存储小数。而显然准确的视差值必然是浮点型的小数,所以存储为tif和pfm可以原值无损存储,而存储为png必然会损失精度,所以有的代码比如opencv会把得到的浮点型视差值乘以16倍取整,存储到png里,这样存储视差值的精度变为1/16,对于这种情况我们在读取png后要先除以16才是真实视差值,且视差会有阶梯分层现象。

    那有同学就问,既然这样为什么要存储png呢?是因为目前主流的图像软件,不支持直接看浮点格式的tif和pfm,存储为png可以更好的观看视差图,当然要是实际生产使用,是必然不建议存储为png的,用来查看视差结果是可以的。

    还有人会直接把视差值拉伸或者压缩到0~255,存储到png或bmp等存储整数的格式中,这样的视差图只能用来观看视差效果,没有其他作用,比如我的代码里的存储方式。

    问:极线像对下的深度图和原图的深度图是一样的吗?如何转换?
    答: 不一样,因为深度图是在视图所在的相机坐标系下的,所以和相机坐标系强挂钩,极限校正后的左视图和原始的左视图是不一样的相机坐标系,所以它们的深度图是不一样的。

    1. 对于极线像对左视图某像素 p p p,通过单应变换 H H H 转换到原左视图上,得到原图上的像素坐标 q q q
    2. p p p的相机坐标系坐标通过一个旋转 R R R 变换到原左视图的相机坐标系坐标,得到 q q q 的深度。
    3. H H H R R R在极线校正步骤可以获取(极线校正的必然产出)。
    展开全文
  • OpenCV46:立体图像的深度图|Depth Map

    千次阅读 2021-12-27 18:09:27
    根据立体图像创建深度图 基础 在上一节中,看到了对极约束和其他相关术语等基本概念。如果有两个场景相同的图像,则可以通过直观的方式从中获取深度信息。下面是一张图片和一些简单的数学公式证明了这种想法。 上...

    目标

    在本节中,将学习

    • 根据立体图像创建深度图

    基础

    在上一节中,看到了对极约束和其他相关术语等基本概念。如果有两个场景相同的图像,则可以通过直观的方式从中获取深度信息。下面是一张图片和一些简单的数学公式证明了这种想法。

    stereo_depth.jpg

    上图包含等效三角形。编写它们的等式将产生以下结果:

    d i s p a r i t y = x − x ′ = B f Z disparity = x - x' = \frac{Bf}{Z} disparity=xx=ZBf

    x x x x ′ x' x是图像平面中与场景点3D相对应的点与其相机中心之间的距离。 B B B是两个摄像机之间的距离(已知), f f f是摄像机的焦距(已知)。简而言之,上述方程式表示场景中某个点的深度与相应图像点及其相机中心的距离差成反比。因此,利用此信息,可以得出图像中所有像素的深度。

    因此,可以在两个图像之间先找到对应的匹配项。一旦找到匹配项,就能获得深度(disparity)。

    代码

    下面的代码片段显示创建视差图的简单过程。

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    imgL = cv2.imread('tsukuba_l.png', 0)
    imgR = cv2.imread('tsukuba_r.png', 0)
    
    stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
    disparity = stereo.compute(imgL, imgR)
    plt.subplot(131)
    plt.imshow(imgL, 'gray')
    plt.title('imgL')
    plt.xticks([])
    plt.yticks([])
    plt.subplot(132)
    plt.imshow(imgR, 'gray')
    plt.title('imgR')
    plt.xticks([])
    plt.yticks([])
    plt.subplot(133)
    plt.imshow(disparity, 'gray')
    plt.title('disparity')
    plt.xticks([])
    plt.yticks([])
    
    plt.show()
    

    下面的图像包含原始图像(左)及其视差图(右)。如图所见,结果受到高度噪声的污染。通过

    调整numDisparitiesblockSize的值,可以获得更好的结果。

    在这里插入图片描述

    当熟悉StereoBM后,可以微调一些参数以获得更好、更平滑的结果。部分参数如下所示:

    • texture_threshold:过滤出没有足够纹理的区域以获得可靠匹配的区域

    • Speckle range 和 size:基于块的匹配器通常会在对象边界附近产生“斑点”,其中匹配窗口捕获一侧的前景和在另一场景中的背景,在此场景中,匹配器还在桌子上找到的小片虚假匹配。要摆脱这些问题,可以使用speckle_sizespeckle_range参数来控制后处理的深度图像。speckle_size是视差斑点下的像素数,speckle_range控制必须被视为相同斑点的一部分最近距离

    • Number of disparities:滑动窗口的像素数。越大表明可见深度的范围就越大,但是需要更多的计算代价,最大视差值与最小视差值之差, 窗口大小必须是16的整数倍,int 型

    • min_disparity:从开始搜索的左像素的x位置开始的偏移量

    • uniqueness_ratio:另一个后过滤步骤。如果最佳匹配视差不足够好于搜索范围中的所有其他视差,则将像素滤出。如果texture_threshold和斑点过滤仍在通过虚假匹配,则可以尝试进行调整

    • prefilter_size和prefilter_cap:预过滤阶段,可标准化图像亮度并增强纹理,以准备块匹配。通常,不需要调整这些参数

    附加资源

    展开全文
  • 视差Disparity与深度图

    千次阅读 2021-02-03 19:57:14
    双目立体视觉,在百度百科里的解释是这样解释的...一、视差Disparity与深度图 提到双目视觉就不得不提视差图:双目立体视觉融合两只眼睛获得的图像并观察它们之间的差别,使我们可以获得明显的深度感,建立特征间的对
  • RGBD图像和深度图对齐

    千次阅读 2021-11-19 16:16:54
    目的:获取同一坐标系下的深度图和RGB图像 首先根据给出的read_calibration sample把灰度相机改成RGB和TOF相机,得到两个相机的外参和内参 Stereo:彩色相机 Calibration: R:[0.999942, -0.0105642, 0.00221015, 0....
  • 图像转化为深度图深度图转化为图像,点云转化为深度图 原图像: 深度图像: 额外插图: 将点云数据转化为深度图像(上面点云三维图,下面深度图)不是一一对应关系 代码: from PIL import Image import numpy ...
  • 深度图转换成点云

    万次阅读 热门讨论 2019-08-22 12:47:58
    最近由于课题需要数据源,但是没有直接获取的方法,所以只能在周老师http://www.qianyi.info/的网站上自己下载深度图转换成点云数据,大概花了三点的时间,终于弄得差不多了,这里做个记录。 二、数据准备和环境配置...
  • 文章目录前言一、ROS实现深度值的获取代码解释二.使用方法三.调用官方API获取深度总结 前言 最近这段时间一直在研究intel的D435i相机,主要用来实现识别物体并反馈物体的深度值。特别强调一点,通常所说图片的深度...
  • 相对深度与绝对深度,深度图与真实距离

    千次阅读 多人点赞 2021-06-03 15:01:29
    绝对深度就是利用激光雷达等设备获取的相机与物体之间的距离,比如KITTI数据集就是利用360度雷达设备获取稀疏的深度图,图1就是雷达获得的原始深度图,很黑,什么都看不清,图2是KITTI数据集提供的标注过的深度图,...
  • 将灰度图与深度图合成彩图

    千次阅读 2022-01-15 11:59:18
    将灰度图和深度图结合起来,用灰度图显示产品上的图案,用颜色来显示深度。在后续处理的时候可以很直观。
  • krpano1.20 - 深度图支持,深度图建模

    千次阅读 2019-11-14 22:51:41
    什么是深度图深度图通常是图像,其中像素颜色(通常是灰度)定义到特定表面的距离(或“深度”)。 此处以球面全景图像为例,再加上相关的球面深度图图像-深度图图像中的灰色调越深,离表面越远: ...
  • 基于深度学习的深度图与位姿估计

    千次阅读 2021-11-09 20:37:10
    深度学习目前已经进入快速发展的时期。在深度学习之前,计算机视觉领域都是采用手工的方式提取图像特征,这些特征都比较明显。深度学习主要代表就是神经网络,尤其是卷积神经网络在数字图像处理中表现出了优越的性能...
  • 文章目录步骤参考文献1.1、匹配时间戳最相近的图片和点云文件(一张图片对于一个点云文件)1.2、匹配时间戳最相近的图片和点云文件(一张图片对于三个点云文件)2、将点云文件投影到图片上形成深度图。 步骤 1、...
  • dev_clear_window() dev_open_window (0, 0, 545, 400, 'black', WindowHandle) xResolution:=0.04 ...* list_files ('E:/SMT电容虚焊测高/12-3测试', ['files','follow_links'], ImageFiles) * tupl
  • android 深度图

    千次阅读 2018-09-18 15:59:07
    在 Android开发中自定义控件是一个范围很广的话题,讲起自定义控件,从广度上来划分的话,大体上可以划分为: ...深度图一般代表交易所当前买入和卖出的委托量(不是指成交),从这张图我们可以看出X轴代表价格,...
  • 在使用 AirSim 采集深度图的时候,如果图像类型选择:DepthPlannar(value = 1),并且 pixels_as_float = true,保存为 tiff 格式的深度图,经过测试,是正确的深度图。 而 open3D 的 tsdf demo 需要使用 16 位 png...
  • 深度图可视化

    千次阅读 2020-08-29 10:33:35
    之前一直以为深度图应该是黑灰色的,不清楚为什么还有彩色的深度图,直到今天才知道原来这是深度图可视化。 专门写篇博客纪念一下! 灰黑色的图片人眼很难识别出其中的物体,感知深度的变化。所以才需要可视化,...
  • 基于python实现激光点云投影为深度图/强度图/反强度图,提供了代码与数据集供测试。
  • Python可视化深度图

    千次阅读 2020-08-10 11:28:44
    深度图映射到颜色空间,是深度图更易查看,下面是颜色空间: 代码,需要做的就是把for循环里面的文件路径和转换后的输出文件夹改一下就可以直接使用python3运行,你可能需要先安装必要的python包,例如opencv-...
  • unity-shader-深度图及其应用

    千次阅读 2019-05-13 21:49:23
    title: unity-shader-深度图及其应用 categories: Unity3d-Shader tags: [unity, shader, 深度图, depth] date: 2019-05-13 20:44:51 comments: false unity-shader-深度图及其应用 前篇 Unity Shader - 深度图...
  • realsense深度图像保存方法

    千次阅读 2019-11-06 17:03:24
    一般使用realsense时会保存视频序列,当保存深度图像时,需要注意保存的图像矩阵的格式,不然可能造成深度值的丢失。 在众多图像库中,一般会使用opencv中的imwrite() 函数进行深度图像的保存。 一般深度图像中...
  • opencv python 深度图渲染

    千次阅读 2022-03-28 16:26:48
    深度图如果安按照灰色图显示时很白的,和一些鲜艳的颜色不是很搭配,可以显示为彩色的,就想MATLAB显示热图的时候可以设定colorbar一样。 # depth 为单通道 16bit位深的深度图像 # xmin和xmax可以通过图像的计算...
  • realsense深度图像读取对齐与保存

    千次阅读 2020-11-05 13:51:36
    realsense直接读取出来的彩色图片和深度图片是没有对齐的,读取出来的两张图片像素之间没有一一对应。但是一般使用两张图片是需要对齐的,并且直接利用深度信息。 以下程序为了更加方便的采集数据。 程序运行后q退出...
  • 视差图转为深度图

    千次阅读 热门讨论 2020-06-16 11:09:46
    有人容易把视差图跟深度图搞混,一切还是要从这个公式说起:Z=f*B/d Z是深度,B是双目相机的光心间距(基线长度),f是相机焦距,d就是视差(左右相机对应特征像素坐标差值)。 而我们说的视差图就是灰度图的灰度值...
  • 基于深度图像的多人姿态检测

    千次阅读 2021-11-16 16:14:11
    本文主要是对"Efficient Convolutional ...首先,本文的目标是在一副深度图像中获取出人体的关键点坐标,本文中认为有17个,结果实例如下所示。 本文采用的架构如下: 包含两个大的阶段,前一阶段使用CNN进行特征提
  • n++) { //获取深度图中(m,n)处的值 //cv::Mat的ptr函数会返回指向该图像第m行数据的头指针。然后加上位移n后,这个指针指向的数据就是我们需要读取的数据. ushort d = depth.ptr(m)[n]; // d 可能没有值,若如此,...
  • 利用open3d把成对的彩色图和深度图生成RGBD图并生成对应点云。
  • 点云转深度图:转化,保存,可视化三维数据的获取方式RGBD相机和深度图代码展示:在pcl中,把点云转为深度图,并保存和可视化 三维数据的获取方式 在计算机视觉和遥感领域,点云可以通过四种主要的技术获得, (1)...
  • Unity URP 获取深度图

    千次阅读 2021-04-14 11:08:50
    抓手 可能大家知道build-in管线的深度图如何获取了,但是URP管线下因为api不同了,所以需要移植一下。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 900,193
精华内容 360,077
关键字:

深度图

友情链接: Viterbidecoder.rar