D455相机RGB与深度图像对齐,缓解相机无效区域的问题
前言
上一次我们介绍了深度相机D455的使用:intel深度相机D455的使用-CSDN博客,我们也看到了相机检测到的无效区域。
在使用Intel深度相机D455时,我们经常会遇到深度图中的无效区域。这些无效区域可能由于黑色物体、光滑表面、透明物体以及视差效应等原因引起。为了解决这些问题,我们可以采用图像修复与滤波结合的方法。具体步骤包括创建掩模图、使用插值方法填补缺失值,以及利用OpenCV的inpaint函数进行修复。本文详细介绍了如何根据不同的对齐方式(深度对齐到彩色或彩色对齐到深度)来处理无效区域,并展示了图像修复的实际代码和效果。这些方法能有效提升深度图质量,特别适用于深度加雾任务。
请注意本文中图像修复与滤波结合的方法处理无效区域的部分,仅仅只适用于我的需求,即根据深度图进行深度加雾的任务。
深度相机的缺点
D455原理
双目立体视觉系统通过视差计算来获得深度信息。相机系统捕捉到的两幅红外图像会有一个视差,即相同物体在两幅图像中的位置差异。通过视差计算,可以推算出物体到相机的距离(深度)。
缺点
黑色物体的影响
黑色物体对光线的反射率非常低,意味着它们吸收大部分入射光线,而不是反射回去。对于依赖反射光线来计算深度的双目立体视觉系统,这会导致反射信号不足,从而影响深度计算的精度和可靠性。并且黑色物体通常与背景之间的对比度较低,这使得双目相机难以在图像中识别和匹配这些物体的特征点,从而影响视差计算。
光滑物体表面反射的影响
光滑表面会产生镜面反射,这意味着光线会按照入射角以相同的角度反射出去。这种反射模式不同于漫反射,深度相机会因为接收到的光线方向不一致而无法准确计算深度信息。
图源:深度相机的坑_结构光相机深度信息缺失-CSDN博客
透明物体透射的影响
玻璃等透明物体对基于结构光的深度相机造成的问题尤其明显。因为这些相机依赖红外光的反射来测量深度,当光线穿过或在玻璃表面反射时,会导致深度信息不准确或完全丢失。这种情况会导致深度图像中出现大量的零值或无效值。
视差的影响
在物体边缘或细小结构上,视差效应会导致深度信息的不连续和噪声。由于深度相机的发射端和接收端之间存在间距,物体边缘会有视觉盲区。远处物体边缘受影响较小,但近距离物体边缘会显著受影响,产生无效深度值的阴影区域,导致深度图在这些区域中缺失和不准确。
RGB与深度图像对齐
深度对齐到彩色(ALIGN_WAY = 1): 这种方式通常用于彩色图像具有更高分辨率或更高精度的情况,将深度图像的像素对齐到彩色图像的像素上,便于在彩色图像中进行对象检测或其他处理。
彩色对齐到深度(ALIGN_WAY = 0): 这种方式通常用于深度图像的分辨率更高的情况,将彩色图像的像素对齐到深度图像的像素上,便于在深度图像中进行精确的距离测量。
import pyrealsense2 as rs
import os
import cv2
import numpy as np
from Depth_camera.utils import get_depth_camera_info, create_camera_save_pathsaved_count = 0
extend_num = 3
width = 640
height = 480
fps = 30# 0:彩色图像对齐到深度图;
# 1:深度图对齐到彩色图像
ALIGN_WAY = 1color_path, depth_path = create_camera_save_path()
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps)
config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, fps)profile = pipeline.start(config)
get_depth_camera_info(profile)# 设置对齐方式
align_to = rs.stream.color if ALIGN_WAY == 1 else rs.stream.depth
align = rs.align(align_to)
color_image2 = None
try:while True:frames = pipeline.wait_for_frames()# 对齐图像aligned_frames = align.process(frames)depth_frame = aligned_frames.get_depth_frame()color_frame = aligned_frames.get_color_frame()depth_image = np.asanyarray(depth_frame.get_data())if ALIGN_WAY == 0:color_frame2 = frames.get_color_frame()color_image2 = np.asanyarray(color_frame2.get_data())cv2.imshow("color_image2", color_image2)color_image = np.asanyarray(color_frame.get_data())# 获取深度信息,以米为单位depth_scale = profile.get_device().first_depth_sensor().get_depth_scale()depth_image_in_meters = depth_image * depth_scaledepth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)images = np.hstack((color_image, depth_colormap))cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)cv2.imshow('RealSense', images)cv2.imshow("depth_image_in_meters", depth_image_in_meters)key = cv2.waitKey(1)if key & 0xFF == ord('s'):saved_count += 1print(f"{saved_count} 已保存图像至 {color_path} 和 {depth_path}")if color_image2 is None:cv2.imwrite(os.path.join(color_path, "{}.png".format(saved_count)), color_image)else:cv2.imwrite(os.path.join(color_path, "{}.png".format(saved_count)), color_image2)# 深度信息保存为 .npy 格式,单位为米np.save(os.path.join(depth_path, "{}.npy".format(saved_count)), depth_image_in_meters)elif key & 0xFF == ord('q') or key == 27:cv2.destroyAllWindows()breakfinally:pipeline.stop()
当ALIGN_WAY = 1 的效果:
当ALIGN_WAY = 0 的效果:
这样拍摄的图片能缓解无效区域。
图像修复与滤波结合处理无效区域
采用图像修复来处理深度图像中的缺失值(深度值为0的像素)。具体而言,按照以下步骤:
- 创建一个掩模图,将深度图像中值为0的像素标记为需要修补的区域。
- 将深度图像中的值为0的像素替换为NaN,这样做是为了在后续处理中标记需要填充的区域。
- 使用最近邻插值方法填充NaN值,将其替换为周围已知深度值的平均值。
- 使用OpenCV中的cv2.inpaint函数进行修补,根据掩模图进行修复。
import cv2
import numpy as np
import osdef inpaint_depth_image(depth_image, inpaintRadius=3):mask = (depth_image == 0).astype(np.uint8)depth_image_fixed = np.where(depth_image == 0, np.nan, depth_image)nan_mask = np.isnan(depth_image_fixed)depth_image_fixed[nan_mask] = np.interp(np.flatnonzero(nan_mask), np.flatnonzero(~nan_mask),depth_image_fixed[~nan_mask])inpainted_depth_image = cv2.inpaint(depth_image_fixed.astype(np.float32), mask, inpaintRadius=inpaintRadius,flags=cv2.INPAINT_TELEA)return inpainted_depth_imagedef read_one_npy(path):depth_image = np.load(path)print(depth_image.shape)x = 1y = 1# 修补深度图像inpainted_depth_image = inpaint_depth_image(depth_image)print(np.unique(inpainted_depth_image))inpainted_depth_image = np.where(inpainted_depth_image <= 0, inpainted_depth_image + 1, inpainted_depth_image)print(np.unique(inpainted_depth_image))median_filtered_image = cv2.medianBlur(inpainted_depth_image, 3)truth_depth = median_filtered_image[x, y]print(truth_depth)cv2.imshow("depth", depth_image)cv2.imshow("inpainted_depth", median_filtered_image)cv2.waitKey(0)cv2.destroyAllWindows()def process_and_save_depth_images(input_folder, output_folder):os.makedirs(output_folder, exist_ok=True)for filename in os.listdir(input_folder):if filename.endswith(".npy"):file_path = os.path.join(input_folder, filename)depth_image = np.load(file_path)inpainted_depth_image = inpaint_depth_image(depth_image)inpainted_depth_image = np.where(inpainted_depth_image <= 0.5, inpainted_depth_image + 1,inpainted_depth_image)filtered_image = cv2.medianBlur(inpainted_depth_image, 5)## filtered_image = cv2.GaussianBlur(inpainted_depth_image, (5, 5), 0)filtered_image = cv2.bilateralFilter(filtered_image, 5, 75, 75)output_file_path = os.path.join(output_folder, filename)np.save(output_file_path, filtered_image)print(f"Processed and saved: {output_file_path}")if __name__ == "__main__":input_folder = r"D:\PythonProject\Githubproject\Depth_camera\2024_06_07_20_01_47\depth"output_folder = r"D:\PythonProject\Githubproject\Depth_camera\result\depth"im_path = r"D:\PythonProject\Githubproject\Depth_camera\2024_06_07_20_01_47\depth\1.npy"# process_and_save_depth_images(input_folder, output_folder)read_one_npy(im_path)
滤波处理能够有效的去除图像中的孤立噪点,平滑图像,这块使用何种滤波方式没有什么讲究,一般来说双边滤波能够边缘清晰的同时平滑图像,适用于保留图像细节的情况,但其实在仅使用中值滤波的效果也不错。可以根据个人任务需求组合。
可以增加修补函数的半径或者组合滤波,修改核的大小等进行改善
白色区域部分并不是没有信息,可以使用np.unique打印出来看看,此图经过处理后有15712个不同的值,相对来说比较合理
参考文章
Intel Realsense D435 深度图为什么会出现残影?(Invalid Depth Band 无效深度带)(黑洞)_realsense 深度图无效值-CSDN博客
Realsense相机在linux下的配置使用,RGB与depth图像对齐_librealsense-CSDN博客
深度相机的坑_结构光相机深度信息缺失-CSDN博客
相关文章:
D455相机RGB与深度图像对齐,缓解相机无效区域的问题
前言 上一次我们介绍了深度相机D455的使用:intel深度相机D455的使用-CSDN博客,我们也看到了相机检测到的无效区域。 在使用Intel深度相机D455时,我们经常会遇到深度图中的无效区域。这些无效区域可能由于黑色物体、光滑表面、透明物体以及视…...
2024 cicsn ezbuf
文章目录 参考protobuf逆向学习复原结构思路exp 参考 https://www.y4ng.cn/posts/pwn/protobuf/#ciscn-2024-ezbuf protobuf 当时压根不知道用了protobuf这个玩意,提取工具也没提取出来,还是做题做太少了,很多关键性的结构都没看出来是pro…...
地面站Mission planner
官方教程; Mission Planner地面站介绍 | Autopilot (gitbook.io) Mission Planner 功能/屏幕 — Mission Planner 文档 (ardupilot.org) 安卓或者windows软件下载地址: 地面站连接及使用 plane (cuav.net) 在完全装机后再进行各干器件的校准,没有组…...
常见的api: BigInteger
一.获取一个大的随机整数 1.代码: BigInteger bd1 new BigInteger(4, new Random());System.out.println(bd1); 2.打印的结果:2 3.注释获取的是0-16之间的随机整数 二.获取一个指定的大的数 1.代码: BigInteger bd2 new BigInteger("100");System.o…...
Overall timing accuracy 和Edge placement accuracy 理解
在电子设计自动化(EDA)、集成电路(IC)制造和高速数字电路设计领域,"Overall Timing Accuracy" 和 "Edge Placement Accuracy" 是两个关键的性能指标,它们对于确保电路的功能正确性和性能至关重要。 当涉及到“Overall timing accuracy”(总体时序精度)…...
2024 vite 静态 scp2 自动化部署
1、导入库 npm install scp2 // 自动化部署 npm install chalk // 控制台输出的语句 npm install ora2、核心代码 创建文件夹放在主目录下的 deploy/index.js 复制粘贴以下代码: import client from scp2; import chalk from chalk; import ora from ora;const s…...
【数据结构】AVLTree实现详解
目录 一.什么是AVLTree 二.AVLTree的实现 1.树结点的定义 2.类的定义 3.插入结点 ①按二叉搜索树规则插入结点 ②更新平衡因子 更新平衡因子情况分析 ③判断是否要旋转 左单旋 右单旋 左右单旋 右左双旋 4.删除、查找和修改函数 查找结点 三.测试 1.判断是否是搜索树 …...
深度学习——TensorBoard的使用
官方文档torch.utils.tensorboard — PyTorch 2.3 documentation TensorBoard简介 TensorBoard是一个可视化工具,它可以用来展示网络图、张量的指标变化、张量的分布情况等。特别是在训练网络的时候,我们可以设置不同的参数(比如࿱…...
【设计模式】观察者模式(行为型)⭐⭐⭐
文章目录 1.概念1.1 什么是观察者模式1.2 优点与缺点 2.实现方式3. Java 哪些地方用到了观察者模式4. Spring 哪些地方用到了观察者模式 1.概念 1.1 什么是观察者模式 观察者模式(Observer Pattern)是一种行为型设计模式,它允许对象在状态改…...
轻松搞定阿里云域名DNS解析
本文将会讲解如何设置阿里云域名DNS解析。在进行解析设置之前,你需要提前准备好需要设置的云服务器IP地址、域名以及CNAME记录。 如果你还没有云服务器和域名,可以参考下面的方法注册一个。 申请域名:《Namesilo域名注册》注册云服务器&…...
GAT1399协议分析(10)--单图像删除
一、官方接口 由于批量删除的接口,图像只能单独删除。 二、wireshark实例 这个接口比较简单,调用request delete即可 文本化: DELETE /VIID/Images/34078100001190001002012024060513561300065 HTTP/1.1 Host: 10.0.201.56:31400 User-Age…...
Hudi CLI 安装配置总结
前言 上篇文章 总结了Spark SQL Rollback, Hudi CLI 也能实现 Rollback,本文总结下 Hudi CLI 安装配置以及遇到的问题。 官方文档 https://hudi.apache.org/cn/docs/cli/ 版本 Hudi 0.13.0(发现有bug)、(然后升级)0.14.1Spark 3.2.3打包 mvn clean package -DskipTes…...
实验八、地址解析协议《计算机网络》
水逆退散,学业进步,祝我们都好,不止在夏天。 目录 一、实验目的 二、实验内容 (1)预备知识 (2)实验步骤 三、实验小结 一、实验目的 完成本练习之后,您应该能够确定给定 IP 地…...
Linux系统管理磁盘管理003
操作系统: CentOS Stream9 测试过程: 模拟磁盘被沾满, 创建文件 测试脚本 for i in seq 10do# echo $idd if/dev/zero of./$i-$RANDOM.txt bs1M count1024 Done[rootlocalhost ~]# vim 2.txt [rootlocalhost ~]# sh 2.txt 记录了10240 的…...
MLC工具是否适用AMD和ARM场景?如何测试内存性能?
MLC(Memory Latency Checker)主要是由Intel开发的工具,主要用于Intel平台上的内存性能测试,尤其是针对Intel处理器的内存延迟和带宽。尽管MLC主要针对Intel处理器设计,理论上它可以在任何支持Intel兼容指令集的系统上运…...
NodeJs实现脚本:将xlxs文件输出到json文件中
文章目录 前期工作和依赖笔记功能代码输出 最近有一个功能,将json文件里的内容抽取到一个xlxs中,然后维护xlxs文件。当要更新json文件时,就更新xlxs的内容并把它传回json中。这个脚本主要使用NodeJS写。 以下是完成此功能时做的一些笔记。 …...
【启程Golang之旅】网络编程与反射
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...
nginx location正则表达式+案例解析
1、nginx常用的正则表达式 ^ :匹配输入字符串的起始位置$ :匹配输入字符串的结束位置 *:匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” :匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”…...
【YOLO系列】YOLOv10论文超详细解读(翻译 +学习笔记)
前言 研究AI的同学们面对的一个普遍痛点是,刚开始深入研究一项新技术,没等明白透彻,就又迎来了新的更新版本——就像我还在忙着逐行分析2月份发布的YOLOv9代码,5月底清华的大佬们就推出了全新的v10。。。 在繁忙之余࿰…...
植物大战僵尸杂交版2024潜艇伟伟迷
在广受欢迎的游戏《植物大战僵尸》的基础上,我最近设计了一款创新的杂交版游戏,简直是太赞了!这款游戏结合了原有游戏的塔防机制,同时引入新的元素、角色和挑战,为玩家提供了全新的游戏体验。 植物大战僵尸杂交版最新绿…...
白话解读网络爬虫
网络爬虫(Web Crawler),也称为网络蜘蛛、网络机器人或网络蠕虫,是一种自动化程序或脚本,被用来浏览互联网并收集信息。网络爬虫的主要功能是在互联网上自动地浏览网页、抓取内容并将其存储在本地或远程服务器上供后续处…...
支持向量机(SVM): 从理论到实践的指南(1)
支持向量机(SVM)被誉为数据科学领域的重量级算法,是机器学习中不可或缺的工具之一。SVM以其优秀的泛化能力和对高维数据的管理而备受推崇。本文旨在梳理SVM的核心概念以及其在实际场景中的应用。 SVM的核心理念 SVM专注于为二分类问题找到最…...
万字长文|OpenAI模型规范(全文)
本文是继《OpenAI模型规范概览》之后对OpenAI Model Spec的详细描述,希望能对各位从事大模型及RLHF研究的朋友有帮助。万字长文,建议收藏后阅读。 一、概述 在AI的世界里,确保技术的行为符合我们的期望至关重要。OpenAI最近发布了一份名为Mo…...
微服务架构-正向治理与治理效果
目录 一、正向治理 1.1 概述 1.2 效率治理 1.2.1 概述 1.2.2 基于流量录制和回放的测试 1.2.3 基于仿真环境的测试 1.3 稳定性治理 1.3.1 概述 1.3.2 稳定性治理模型 1.3.3 基于容器化的稳定性治理 1.3.3.1 概述 1.3.3.2 测试 1.3.3.3 部署 1.3.3.3.1 概述 1.3.3…...
normalizing flows vs 直方图规定化
normalizing flows名字的由来 The base density P ( z ) P(z) P(z) is usually defined as a multivariate standard normal (i.e., with mean zero and identity covariance). Hence, the effect of each subsequent inverse layer is to gradually move or “flow” the da…...
vite打包优化常用的技巧及思路
面试题:vitevue项目如何进行优化? 什么情况下会去做打包优化?一种是在搭建项目的时候就根据自己的经验把vite相关配置给处理好,另外一种是开发的过程中发现打包出来的静态资源越来越大,导致用户访问的时候资源加载慢&a…...
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)HPA详细解释与案例应用
文章目录 前言HPA简介简单理解详细解释HPA 的工作原理监控系统负载模式HPA 的优势使用 HPA 的注意事项应用类型 应用环境1.metircs-server部署2.HPA演示示例(1)部署一个服务(2)创建HPA对象(3)执行压测 前言…...
台式机ubuntu22.04安装nvidia驱动
总结一个极简易的安装方法 正常安装ubuntu 22.04正常更新软件 sudo apt update sudo apt upgrade -y参考ubuntu官方网站的说明https://ubuntu.com/server/docs/nvidia-drivers-installation#/ # 首先检查系统支持驱动的版本号 sudo ubuntu-drivers list我显示的内容如下&…...
C++ 11 【线程库】【包装器】
💓博主CSDN主页:麻辣韭菜💓 ⏩专栏分类:C修炼之路⏪ 🚚代码仓库:C高阶🚚 🌹关注我🫵带你学习更多C知识 🔝🔝 目录 前言 一、thread类的简单介绍 get_id…...
可视化数据科学平台在信贷领域应用系列四:决策树策略挖掘
信贷行业的风控策略挖掘是一个综合过程,需要综合考虑风控规则分析结果、效果评估、线上实时监测和业务管理需求等多个方面,以发现和制定有效的信贷风险管理策略。这些策略可能涉及贷款审批标准的调整、贷款利率的制定、贷款额度的设定等,在贷…...
java web 做购物网站/网站优化师
倍压整流电路图(一)倍压整流,是把较低的交流电压,用耐压较低的整流二极管和电容器,“整”出一个较高的直流电压。在一些需用高电压、小电流的地方,常常使用倍压整流电路。倍压整流电路一般按输出电压是输入电压的多少倍࿰…...
潍坊网站建设套餐/谷歌浏览器下载官方正版
大家都会用$(div)来获取div并对其进行一些操作,今天用到一个函数发现$(div)与getElementBy系列函数得到的对象并不一样。 然后去查了下,发现$(div)得到的是一个数组,而getElementBy系统函数得到的是数组中的一个对象 然后。。。。$(div)[0]就…...
安徽网站建设公司/优秀网站网页设计
Masked AutoEncoders(MAE) Top-1准确率87.8% masked autoencoders(MAE) 是一种可扩展的计算机视觉自监督学习方法。 本文的MAE方法很简单:mask输入图像的随机patch,并重建丢失的像素 。它基于两个核心设计的。 首先…...
高校门户网站开发/兰州seo网站建设
给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点&…...
合作做网站的总结和心得/手机百度高级搜索入口
.第一,友好界面。高速公路收费管理系统开发设计,界面的友好性比较重要,满足这一要求才能体现出人性化设计特征,和用户应用系统便捷性相适应,动态的人机交互设计,用户应用系统的时候能感受到操作的便利&…...
在深圳做it的要做赌博网站吗/推广公司app主要做什么
夜光序言: 累,证明自己还没死 正文:...