当前位置: 首页 > news >正文

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的像素)。具体而言,按照以下步骤:

  1. 创建一个掩模图,将深度图像中值为0的像素标记为需要修补的区域。
  2. 将深度图像中的值为0的像素替换为NaN,这样做是为了在后续处理中标记需要填充的区域。
  3. 使用最近邻插值方法填充NaN值,将其替换为周围已知深度值的平均值。
  4. 使用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的使用&#xff1a;intel深度相机D455的使用-CSDN博客&#xff0c;我们也看到了相机检测到的无效区域。 在使用Intel深度相机D455时&#xff0c;我们经常会遇到深度图中的无效区域。这些无效区域可能由于黑色物体、光滑表面、透明物体以及视…...

2024 cicsn ezbuf

文章目录 参考protobuf逆向学习复原结构思路exp 参考 https://www.y4ng.cn/posts/pwn/protobuf/#ciscn-2024-ezbuf protobuf 当时压根不知道用了protobuf这个玩意&#xff0c;提取工具也没提取出来&#xff0c;还是做题做太少了&#xff0c;很多关键性的结构都没看出来是pro…...

地面站Mission planner

官方教程; Mission Planner地面站介绍 | Autopilot (gitbook.io) Mission Planner 功能/屏幕 — Mission Planner 文档 (ardupilot.org) 安卓或者windows软件下载地址&#xff1a; 地面站连接及使用 plane (cuav.net) 在完全装机后再进行各干器件的校准&#xff0c;没有组…...

常见的api: BigInteger

一.获取一个大的随机整数 1.代码: BigInteger bd1 new BigInteger(4, new Random());System.out.println(bd1); 2.打印的结果:2 3.注释获取的是0-16之间的随机整数 二.获取一个指定的大的数 1.代码&#xff1a; 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 复制粘贴以下代码&#xff1a; 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是一个可视化工具&#xff0c;它可以用来展示网络图、张量的指标变化、张量的分布情况等。特别是在训练网络的时候&#xff0c;我们可以设置不同的参数&#xff08;比如&#xff1…...

【设计模式】观察者模式(行为型)⭐⭐⭐

文章目录 1.概念1.1 什么是观察者模式1.2 优点与缺点 2.实现方式3. Java 哪些地方用到了观察者模式4. Spring 哪些地方用到了观察者模式 1.概念 1.1 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在状态改…...

轻松搞定阿里云域名DNS解析

本文将会讲解如何设置阿里云域名DNS解析。在进行解析设置之前&#xff0c;你需要提前准备好需要设置的云服务器IP地址、域名以及CNAME记录。 如果你还没有云服务器和域名&#xff0c;可以参考下面的方法注册一个。 申请域名&#xff1a;《Namesilo域名注册》注册云服务器&…...

GAT1399协议分析(10)--单图像删除

一、官方接口 由于批量删除的接口&#xff0c;图像只能单独删除。 二、wireshark实例 这个接口比较简单&#xff0c;调用request delete即可 文本化&#xff1a; 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…...

实验八、地址解析协议《计算机网络》

水逆退散&#xff0c;学业进步&#xff0c;祝我们都好&#xff0c;不止在夏天。 目录 一、实验目的 二、实验内容 &#xff08;1&#xff09;预备知识 &#xff08;2&#xff09;实验步骤 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地…...

Linux系统管理磁盘管理003

操作系统&#xff1a; CentOS Stream9 测试过程&#xff1a; 模拟磁盘被沾满&#xff0c; 创建文件 测试脚本 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&#xff08;Memory Latency Checker&#xff09;主要是由Intel开发的工具&#xff0c;主要用于Intel平台上的内存性能测试&#xff0c;尤其是针对Intel处理器的内存延迟和带宽。尽管MLC主要针对Intel处理器设计&#xff0c;理论上它可以在任何支持Intel兼容指令集的系统上运…...

NodeJs实现脚本:将xlxs文件输出到json文件中

文章目录 前期工作和依赖笔记功能代码输出 最近有一个功能&#xff0c;将json文件里的内容抽取到一个xlxs中&#xff0c;然后维护xlxs文件。当要更新json文件时&#xff0c;就更新xlxs的内容并把它传回json中。这个脚本主要使用NodeJS写。 以下是完成此功能时做的一些笔记。 …...

【启程Golang之旅】网络编程与反射

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…...

nginx location正则表达式+案例解析

1、nginx常用的正则表达式 ^ &#xff1a;匹配输入字符串的起始位置$ &#xff1a;匹配输入字符串的结束位置 *&#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” &#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”…...

【YOLO系列】YOLOv10论文超详细解读(翻译 +学习笔记)

前言 研究AI的同学们面对的一个普遍痛点是&#xff0c;刚开始深入研究一项新技术&#xff0c;没等明白透彻&#xff0c;就又迎来了新的更新版本——就像我还在忙着逐行分析2月份发布的YOLOv9代码&#xff0c;5月底清华的大佬们就推出了全新的v10。。。 在繁忙之余&#xff0…...

植物大战僵尸杂交版2024潜艇伟伟迷

在广受欢迎的游戏《植物大战僵尸》的基础上&#xff0c;我最近设计了一款创新的杂交版游戏&#xff0c;简直是太赞了&#xff01;这款游戏结合了原有游戏的塔防机制&#xff0c;同时引入新的元素、角色和挑战&#xff0c;为玩家提供了全新的游戏体验。 植物大战僵尸杂交版最新绿…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...