realsense D4xx红外图像的某个像素点转化到彩色图像中的对应像素点

RealSense D435i深度相机介绍 D435i硬件结构及各个组件原理详解 阅读详情

一般是深度图像素和彩色图像素能对齐即匹配,如果是红外摄像头拍的原始左右眼红外图像呢?
其实深度图像素和单眼红外图像像素有个默认的对应关系:一般是跟左眼红外图像相同,也有跟右眼红外图像相同的,realsense是跟左眼的像素相同,即一一对应。
思路:通过以上关系,可以根据左眼红外图中的UV坐标获得其空间坐标即深度图中像素的空间坐标(这里的算法realsense没有公布,虽然是左右眼匹配fb/d公式算深度,但怎么匹配的没公布,这是我目前唯一不了解的内容了),然后转到彩色图空间坐标,最后从彩色图空间坐标转到彩色图UV坐标。完成了红外原始图中指定点在彩色图中的标示。
其实我是要用红外图指定UV点的空间坐标(如果不知道深度图像素与红外图像素的对应关系,是不可能拿到红外像素的深度继而计算空间点坐标的,只能靠自己匹配该点的左右眼图像坐标,然后根据f
b/d求其空间点坐标),后续的只是验证和显示用而已。
程序名:realsenseIRtoColor
代码如下:
#include
#include <math.h>
#include <opencv2/opencv.hpp> // Include OpenCV API
#include <librealsense2/rs.hpp> // Include RealSense Cross Platform API
#include<librealsense2/rsutil.h>
#include “example.hpp” // Include short list of convenience functions for rendering
#include “cv-helpers.hpp”

using namespace cv;
using namespace std;
using namespace rs2;
int U=0, V=0;
bool flag = false;
void on_mouse(int EVENT, int x, int y, int flags, void* userdata)
{
Mat hh;
hh = (Mat)userdata;
Point p(x, y);
switch (EVENT)
{
case EVENT_LBUTTONDOWN:
{
// printf(“b=%d\t”, hh.at§[0]);
// printf(“g=%d\t”, hh.at§[1]);
// printf(“r=%d\n”, hh.at§[2]);
printf(“x=%d\t”, x);
printf(“y=%d\n”, y);
U = x; V = y;
flag = true;
// std::cout << “x:” << x << “;” <<y ;
}
break;

}

}
int main(int argc, char * argv[]) try
{

int width = 640, height = 480;
int fps = 30;
char LName[100];//left 
char RName[100];//right 
char DName[100];//depth
char CName[100];//color
long long  i = 0;//counter
rs2::align align_to(RS2_STREAM_COLOR);
rs2::pipeline pipe;//Pipeline
rs2::config pipe_config;
pipe_config.enable_stream(RS2_STREAM_DEPTH, width, height, RS2_FORMAT_Z16, fps);
pipe_config.enable_stream(RS2_STREAM_INFRARED, 1, width, height, RS2_FORMAT_Y8, fps);
pipe_config.enable_stream(RS2_STREAM_INFRARED, 2, width, height, RS2_FORMAT_Y8, fps);
pipe_config.enable_stream(RS2_STREAM_COLOR, width, height, RS2_FORMAT_BGR8, fps);

rs2::pipeline_profile profile = pipe.start(pipe_config);


while (1)
{
	//堵塞程序直到新的一帧捕获
	rs2::frameset frameset = pipe.wait_for_frames();

// frameset = align_to.process(frameset);//经测试,此句一定不能要,深度与彩色对齐后,深度坐标对应点会产生空洞(彩色图不受影响,每个坐标都有深度)导致定位出现明显偏差。
/*
rs2::depth_frame depth = frameset.get_depth_frame(); ///获取深度图像数据
rs2::video_frame color = frameset.get_color_frame(); ///获取彩色图像数据
rs2::video_frame ir_frame_left = frameset.get_infrared_frame(1);
rs2::video_frame ir_frame_right = frameset.get_infrared_frame(2);

	Mat dMat_left(Size(width, height), CV_8UC1, (void*)ir_frame_left.get_data());
	Mat dMat_right(Size(width, height), CV_8UC1, (void*)ir_frame_right.get_data());
	Mat depth_image(Size(width, height), CV_16U, (void*)depth.get_data(), Mat::AUTO_STEP);
	Mat color_image(Size(width, height), CV_8UC3, (void*)color.get_data(), Mat::AUTO_STEP);
	///将彩色图像和深度图像转换为Opencv格式
	cv::Mat image(cv::Size(width, height), CV_8UC3, (void*)color.get_data(), cv::Mat::AUTO_STEP);
	cv::Mat depthmat(cv::Size(width, height), CV_16U, (void*)depth.get_data(), cv::Mat::AUTO_STEP);
	///显示
	cv::imshow("image", image);
	cv::imshow("depth", depthmat);

*/
//取深度图和彩色图
depth_frame depth = frameset.get_depth_frame();
video_frame ir_frame_left = frameset.get_infrared_frame(1);
video_frame ir_frame_right = frameset.get_infrared_frame(2);
frame color_frame = frameset.get_color_frame();

	auto depth_stream = profile.get_stream(RS2_STREAM_DEPTH).as<rs2::video_stream_profile>();
	auto color_stream = profile.get_stream(RS2_STREAM_COLOR).as<rs2::video_stream_profile>();

	//获取内参
	const auto intrinDepth = depth_stream.get_intrinsics();
	const auto intrinColor = color_stream.get_intrinsics();
	//直接获取从深度摄像头坐标系到彩色摄像头坐标系的欧式变换矩阵
	//auto  extrinDepth2Color=depth_stream.get_extrinsics_to(color_stream);
	rs2_extrinsics  extrinDepth2Color;
	rs2_error *error;
	rs2_get_extrinsics(depth_stream, color_stream, &extrinDepth2Color, &error);
	

	Mat dMat_left(Size(width, height), CV_8UC1, (void*)ir_frame_left.get_data());
	Mat dMat_right(Size(width, height), CV_8UC1, (void*)ir_frame_right.get_data());
	Mat depth_image(Size(width, height), CV_16U, (void*)depth.get_data(), Mat::AUTO_STEP);
	Mat color_image(Size(width, height), CV_8UC3, (void*)color_frame.get_data(), Mat::AUTO_STEP);
	imshow("红外1", dMat_left);
	
	setMouseCallback("红外1", on_mouse, &dMat_left);
	if (flag)
	{
		float udist = depth.get_distance(U, V);

// printf(“z=%f\n”, udist);
Point pinfrared,pcolor;
pinfrared.x = U;
pinfrared.y = V;
//画实心点
circle(depth_image, pinfrared, 3, Scalar(255, 0, 0), -1); //第五个参数我设为-1,表明这是个实点。
//平面点定义
float pd_uv[2], pc_uv[2], depth_m;
//空间点定义
float Pdc3[3], Pcc3[3];

		pd_uv[0] = U; pd_uv[1] = V; depth_m = udist;
		//将深度图的像素点根据内参转换到深度摄像头坐标系下的三维点
		rs2_deproject_pixel_to_point(Pdc3, &intrinDepth, pd_uv, depth_m);
		//将深度摄像头坐标系的三维点转化到彩色摄像头坐标系下
		rs2_transform_point_to_point(Pcc3, &extrinDepth2Color, Pdc3);
		//将彩色摄像头坐标系下的深度三维点映射到二维平面上
		rs2_project_point_to_pixel(pc_uv, &intrinColor, Pcc3);
		pcolor.x = pc_uv[0]; pcolor.y = pc_uv[1];
		circle(color_image, pcolor, 3, Scalar(255, 0, 0), -1); //第五个参数我设为-1,表明这是个实点。

// flag = false;

	}


	imshow("红外2", dMat_right);
	imshow("深度图", depth_image);
	imshow("彩图", color_image);
	char c = waitKey(1);
	if (c == 'p')
	{

/*
sprintf_s(LName, “C:\cpppractice\D435iimshow\x64\Debug\left_eye\%d.png”, i);
imwrite(LName, dMat_left);
sprintf_s(RName, “C:\cpppractice\D435iimshow\x64\Debug\right_eye\%d.png”, i);
imwrite(RName, dMat_right);
sprintf_s(DName, “C:\cpppractice\D435iimshow\x64\Debug\depth\%d.png”, i);
imwrite(DName, depth_image);
sprintf_s(CName, “C:\cpppractice\D435iimshow\x64\Debug\color\%d.png”, i);
imwrite(CName, color_image);
*/
sprintf_s(LName, “left_eye%d.png”, i);
imwrite(LName, dMat_left);
sprintf_s(RName, “right_eye%d.png”, i);
imwrite(RName, dMat_right);
sprintf_s(DName, “depth%d.png”, i);
imwrite(DName, depth_image);
sprintf_s(CName, “color%d.png”, i);
imwrite(CName, color_image);
i++;
}
else if (c == ‘q’)
break;

}
i = 0;
return EXIT_SUCCESS;

}
catch (const rs2::error & e)
{
///捕获相机设备的异常
std::cerr << "RealSense error calling " << e.get_failed_function() << “(” << e.get_failed_args() << "):\n " << e.what() << std::endl;
return EXIT_FAILURE;
}
catch (const std::exception& e)
{
std::cerr << "Other error : " << e.what() << std::endl;
return EXIT_FAILURE;
}

【图像融合】自适应参考图像的可见光与热红外彩色图像融合算法 图像融合论文笔记:基于多特征的红外与可见光图像融合 阅读详情

相关推荐

Realsense D435i RGB+IMU标定

Realsense D435i RGB+IMU标定准备工作:一、IMU标定1.修改rs_camera.launch部分参数2.配置港科大IMU标定程序的环境(1)安装ceres(2)创建ros工作空间(3)下载code_utils并编译(4) 下载imu_utils并编译3.写标定参数文件4.录制IMU数据包5.使用imu标定工具进行标定二、使用kalibr标定相机1.安装Kalibr2.下载&a...

追 1万+

intel realsense D400系列相机介绍(一)

intel realsense D400系列介绍

qq_30150579的博客 6073

IntelRealsense获取IR图像

IntelRealsense获取IR图像 环境:VS2017 + windows10 + opencv + librealsense2 + D435i 获取realsense IR图像 #include <iostream> #include <opencv.hpp> #include <librealsense2/rs.hpp> int main() { rs2::pipeline pipe; rs2::config cfg; cfg.enable_stream

weixin_48010114的博客 2354

intel realsense 深度视野范围与模组硬件说明

intel realsense 深度视野范围与模组硬件说明

qq_30150579的博客 3846

Window10 intel realsense D435安装并实现opencv显示realsense读取的彩色和深度数据(QT+openCV+rsD35)

(1)点击"官方指南" 来到下载页,-&gt;最新的稳定版本发布 (本人下的2.16.5,现在最新2.17.0) 不需要做开发,只要下载Intel RealSense Viewer就好,这个就是相机的可视化界面,简洁明了。对应的安装包是Intel.RealSense.Viewer.exe。 本人的毕设要用到深度图做开发,所以安装Intel.RealSense.SDK.exe,SDK...

Pabebe的博客 1万+

intel深度相机 D455及D4系列入门教程(逐行代码讲解)

Intel RealSense D435、D455等D4系列:Intel D4系列深度相机是由英特尔(Intel)公司推出的一款深度感知摄像头,专为实现计算机视觉和深度学习应用而设计。这款相机使用了英特尔的深度感知技术,结合了摄像头和红外(IR)传感器,可以提供高质量的深度图像和 RGB 彩色图像,为开发者提供了丰富的数据源,用于各种应用,包括虚拟现实(VR)、增强现实(AR)、手势识别、人脸识别、姿势识别、3D 扫描等。

weixin_45303602的博客 5489

图像彩色化方法(基于颜色传递、颜色扩展)

图像彩色化的研究主要有基于参考图像的颜色传递方法和基于人工着色的局部颜色扩展方法。一般来说,基于参考图像的颜色传递方法首要采取图像处理方法,例如:借助图像融合技术的红外图像彩色化、基于图像分割技术、图像分类技术的图像彩色化方法;基于人工着色的局部颜色扩展方法主要依赖于偏微分方程将彩色化问题转化为最优解问题。 基于颜色传递、颜色扩展 1)基于颜色转移的彩色化 图像色彩迁移是以一幅彩色图像作...

OpenSceneGraph的博客 5778

Intel-RealSense-D400-Series-Datasheet

Intel RealSense D400系列摄像头使用文档 /Intel RealSense D400系列摄像头使用文档

红外图像和灰度图像、彩色图像 区别

最近看行人重识别论文,有些研究方向是红外和可见光图片的跨模态识别,对于红外图片不是很了解,于是去网上查了相关知识 红外图象 是获取物体红外光的强度,而成的图象 灰度图象 是获取物体可见光的强度 对于数据格式,是一样的,都是单通道图象 而彩色的是3通道图象 一般红外探测器送出来的是16位的单通道图像,因为要送显才被转化成8位单通道,如果说是24位的话其实相当于R=G=B各8位。 红外图像成像特点:由于红外图像是通过“测量”物体向外辐射的热量而获得的,故与可将光图像相比:分辨率差、对比度低、信噪比低、视觉效果模

深度菜鸡-达闻西的博客 1万+

PEMFC电化学入门:从电流密度到Tafel公式的实战计算指南

本文详细介绍了PEMFC电化学的基础知识,从电流密度计算到Tafel公式的应用,提供了实战计算指南。通过代码示例和常见问题排查,帮助工程师快速掌握燃料电池性能优化的关键参数,如交换电流密度和活化损失计算,适用于汽车动力和分布式发电等领域。

weixin_29229055的博客 551

IQA图像质量评价 数据集介绍(LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K)

LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K 数据集介绍

qq_37925923的博客 1万+

使用MLX90640自制红外热像仪(三):图像插值、图像彩色编码

  经过上一节,已经把MLX90640的32x24个像素点读出来了,可是使用32x24直接显示在屏幕上,显示区域显示太小了,于是就需要对图像就行放大。

qlexcel的专栏 1万+

深入解析安卓性能分析工具systrace/atrace的使用技巧与实战场景

本文深入解析了安卓性能分析工具systrace/atrace的核心使用技巧与实战场景。文章澄清了环境搭建的常见误区,详细拆解了命令参数,并通过列表卡顿、启动优化等具体案例,手把手指导开发者利用这些工具精准定位性能瓶颈,提升应用流畅度。

yyy34的博客 239

体感摄像头 realsense 系列硬件资料

一、体感摄像头Intel的体感摄像机是具有深度图像采集能力的摄像机,目前已经出到了400系列。与kinect 2,ZED,leap motion比较,属于比较中庸。手势识别方面不如leap motion,leap motion的视角是120度,精度和速度都比intel高,缺点是leap motion不给深度图,只给最后的骨骼跟踪结果,也就是只能做手势识别应用,不能干别的。kinect 2采用了TO...

果匠 2万+

强网杯Web题ezphp解题全记录:利用PHP反序列化与条件竞争拿下服务器

本文详细解析了强网杯Web题目ezphp的解题过程,通过PHP反序列化与条件竞争漏洞的组合利用,成功获取服务器权限。文章深入剖析了反序列化链的构造、文件上传绕过技巧以及条件竞争的实际应用,为CTF选手和Web安全研究者提供了宝贵的实战经验。

weixin_29006187的博客 376

投第一篇SCIE英文期刊(详细步骤)

一个投稿SCIE英文期刊的过程

weixin_48849679的博客 1万+

realsense D4XX系列相机彩色图像素到空间点的转化原理

realsense D4XX系列相机代码,但原理是通用的。 RGB-D相机根据彩色图像素获得空间点 /* Given pixel coordinates and depth in an image with no distortion or inverse distortion coefficients, compute the corresponding point in 3D space re...

weixin_44345862的博客 1656

Redis+Unity 数据库搭建

游戏中需要存放排行榜等数据,而且是实时存放,所以就涉及到数据库的问题。这里找服务器大神了解到可以用Redis来做存储,免费的效率极高。

chaixinke的专栏 879

用OpenCV显示D435的左右ir图像

int D435_IR(){ int width = 1280; int height = 720; int fps = 30; rs2::config config; config.enable_stream(RS2_STREAM_INFRARED, 1, width, height, RS2_FORMAT_Y8, fps); config.enable_stream(RS2_STR...

3D Vision 3815

86、高斯过程:学习、应用与自动相关性确定

本文介绍了高斯过程回归的基本原理及其在实际应用中的关键技术,重点探讨了通过最大化对数似然函数来学习模型超参数的方法,并详细阐述了自动相关性确定(ARD)技术如何用于评估输入变量的重要性。文章涵盖了从协方差函数定义、梯度计算到优化算法的应用流程,并通过流程图和表格形式总结了核心步骤与公式。此外,还讨论了贝叶斯处理方式及异方差问题的建模策略,展示了高斯过程在复杂数据建模中的灵活性与强大能力。

android的专栏 114

AutoSAR MemMap模块概述及配置参数详解

这个模块是干啥的?它是用来配置Memory Mapping and Compiler Abstraction module。

4508

Realsense D435i 使用

工作之后才发现问题不是单线程地来找你,而是多线程并发地涌向你。        D435i是一款良心传感器,美中不足的是你拿不到广角图像。虽然现在不负责传感器测试了(老大布置什么,打工的就去做什么就好了),但我还是悄悄地拿来了新买了两个月的D435i,想要标定一波。不知道这个摄像头能在我手中用多久,反正先试试吧,能写多少是多少。 软硬件配置   CPU:Intel® Core™ i7-782...

文刀雨辰的SLAM奋斗之路 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

在Ubuntu 16.04下安装intel realsense D435摄像头(多次实测)

第一次安装realsense2及使用pyrealsense2时费了好大功夫,因为好多文档中都有坑,有的又是跳着写的,参考了几篇文档最后又参考官网上总算成功安装上librealsense2,其实英文比较好的同学可以直接参考官方文档,pyrealsense2我安装的时候是12月15号,中文文档反正我是没怎么见到,我去国外论坛及官方文档一看,12月1号才发布pyrealsense2,根据参考也调试成功,...

学习、记录、分享 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Intel RealSense(实感技术)概览

Intel RealSense(实感技术)概览 1 Reply 版权声明:本文系本站作者自己翻译整理,欢迎转载,但转载请以超链接形式注明文章来源(planckscale.info)、作者信息和本声明,否则将追究法律责任。 前段时间CES的报道满天飞,网上逛了几圈,感觉料最猛的还数Intel:老树开新花,推出14nm的第五代酷睿处理器;在智能可穿戴设备及物联网上雄起;RealS

Bryan_Zhang的专栏 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: Get Baseline和转换外参 (extrinsics)
下一篇: 一般双目相机空间定位原理
侯增涛
博客等级 码龄8年 195粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值