rgbd slam_RGB模型

rgbd slam_RGB模型本文采用高博大佬的代码来跑kinectv1获取的彩色图和深度图。首先是获取彩色图和深度图的代码:#include<windows.h>#include<iostream>#include<NuiApi.h>#include<opencv2/opencv.hpp>#include<string.h>usin…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文采用高博大佬的代码来跑kinect v1获取的彩色图和深度图。

首先是获取彩色图和深度图的代码:

#include <windows.h>
#include <iostream> 
#include <NuiApi.h>
#include <opencv2/opencv.hpp>
#include<string.h>

using namespace std;
using namespace cv;

void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage);
void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage);

int i = 0;
string rgb = "./rgb/";
string title = ".png";
string depth = "./depth/";
int main(int argc, char *argv[])
{
	Mat colorImage;
	colorImage.create(480, 640, CV_8UC3);
	Mat depthImage;
	depthImage.create(480, 640, CV_8UC1);


	HANDLE colorEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	HANDLE depthEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	HANDLE colorStreamHandle = NULL;
	HANDLE depthStreamHandle = NULL;

	HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH);
	if (hr != S_OK)
	{
		cout << "NuiInitialize failed" << endl;
		return hr;
	}

	hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NULL, 4, colorEvent, &colorStreamHandle);
	if (hr != S_OK)
	{
		cout << "Open the color Stream failed" << endl;
		NuiShutdown();
		return hr;
	}
	hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480, NULL, 2, depthEvent, &depthStreamHandle);
	if (hr != S_OK)
	{
		cout << "Open the depth Stream failed" << endl;
		NuiShutdown();
		return hr;
	}
	namedWindow("colorImage", CV_WINDOW_AUTOSIZE);
	namedWindow("depthImage", CV_WINDOW_AUTOSIZE);

	while (1)
	{
		if (WaitForSingleObject(colorEvent, 0) == 0)
			getColorImage(colorEvent, colorStreamHandle, colorImage);
		if (WaitForSingleObject(depthEvent, 0) == 0)
			getDepthImage(depthEvent, depthStreamHandle, depthImage);
		
		imshow("colorImage", colorImage);
		imshow("depthImage", depthImage);
		imwrite(rgb + to_string(i) + title, colorImage);
		imwrite( depth + to_string(i) + title, depthImage);
		i++;
		if (cvWaitKey(1) == 27)
			break;
	}

	NuiShutdown();
	return 0;
}


void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage)
{
	const NUI_IMAGE_FRAME *colorFrame = NULL;

	NuiImageStreamGetNextFrame(colorStreamHandle, 0, &colorFrame);
	INuiFrameTexture *pTexture = colorFrame->pFrameTexture;

	NUI_LOCKED_RECT LockedRect;
	pTexture->LockRect(0, &LockedRect, NULL, 0);

	if (LockedRect.Pitch != 0)
	{
		for (int i = 0; i<colorImage.rows; i++)
		{
			uchar *ptr = colorImage.ptr<uchar>(i);  //第i行的指针                    
													//每个字节代表一个颜色信息,直接使用uchar
			uchar *pBuffer = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;
			for (int j = 0; j<colorImage.cols; j++)
			{
				ptr[3 * j] = pBuffer[4 * j];  //内部数据是4个字节,0-1-2是BGR,第4个现在未使用 
				ptr[3 * j + 1] = pBuffer[4 * j + 1];
				ptr[3 * j + 2] = pBuffer[4 * j + 2];
			}
		}
	}
	else
	{
		cout << "捕捉色彩图像出现错误" << endl;
	}

	pTexture->UnlockRect(0);
	NuiImageStreamReleaseFrame(colorStreamHandle, colorFrame);
}

void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage)
{
	const NUI_IMAGE_FRAME *depthFrame = NULL;

	NuiImageStreamGetNextFrame(depthStreamHandle, 0, &depthFrame);
	INuiFrameTexture *pTexture = depthFrame->pFrameTexture;

	NUI_LOCKED_RECT LockedRect;
	pTexture->LockRect(0, &LockedRect, NULL, 0);

	RGBQUAD q;

	if (LockedRect.Pitch != 0)
	{
		//4.5、将数据转换为OpenCV的Mat格式
		for (int i = 0; i < depthImage.rows; i++)
		{
			uchar *ptr = depthImage.ptr<uchar>(i);  //第i行的指针

											   //深度图像数据含有两种格式,这里像素的低12位表示一个深度值,高4位未使用;
											   //注意这里需要转换,因为每个数据是2个字节,存储的同上面的颜色信息不一样,
			uchar *pBufferRun = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;
			USHORT * pBuffer = (USHORT*)pBufferRun;

			for (int j = 0; j < depthImage.cols; j++)
			{

				ptr[j] = 255 - (uchar)(256 * pBuffer[j] / 0x0fff);  //直接将数据归一化处理
			}
		}
	}
	else
	{
		cout << "捕捉深度图像出现错误" << endl;
	}

	pTexture->UnlockRect(0);
	NuiImageStreamReleaseFrame(depthStreamHandle, depthFrame);
}

彩色图示例:

rgbd slam_RGB模型

深度图示例:

rgbd slam_RGB模型

RGBD-SLAM运行结果:

采用pcl_viewer查看生成的result.pcd 

rgbd slam_RGB模型

 

效果不怎么好,还是要继续提高姿势水平啊。

最后再次感谢高博大佬,RGB-D SLAM代码可参考我的GitHub

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192169.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux | awk 命令「建议收藏」

    Linux | awk 命令「建议收藏」awk命令简介awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得非常强大,awk其实是一门语言,”格式扫描和处理语言“,它允许您创建

    2022年7月1日
    25
  • DriversBackup[通俗易懂]

    DriversBackup[通俗易懂]备份驱动:提前建立好驱动存放的目录,例,G:\DriversBackup然后在cmd下执行以下命令dism/online/export-driver/destination:G:\Driv

    2022年7月2日
    35
  • vue cli 3 升级到 vue cli 4 方法步骤及升级点总结「建议收藏」

    vue cli 3 升级到 vue cli 4 方法步骤及升级点总结「建议收藏」vuecli3升级到vuecli4指南vuecli3升级到vuecli4方法步骤及升级点总结vue-cli3升级vue-cli4官方英文升级文档,中文滞后一.首先,在全局安装最新的VueCLI:npminstall-g@vue/cli#ORyarnglobaladd@vue/cli检查安装的版本vue-V#输出:@vue/cli4.x.x说明@vue/cli4安装成功(vuecli3的版本会输出3.x.x)

    2025年8月7日
    6
  • CSS3选择器 | 每个前端开发者必须要掌握的技术

    CSS3选择器 | 每个前端开发者必须要掌握的技术目录属性选择符伪类选择符CSS3属性CSS3自适应属性选择符如果能够灵活运用属性选择器,目前为止需要依靠id或class名才能实现的样式完全可以使用属性选择器来实现。E[att]{}:选择具有att属性的E元素E[att=”val”]{}:选择具有att属性且属性值等于val的E元素E[att~=”val”]{}:用于选取属性值中包含指定词汇的元素E[att|=”val…

    2022年7月27日
    9
  • 正则匹配数字,英文以及英文符号

    正则匹配数字,英文以及英文符号网上搜索很多正则验证方法,但都没有一个理想的解决方式。自己总结了下,对于这个问题目前是两种解决方式。1、通过循环字符串对每一个字符进行验证,这个方式简单就不做介绍了2、通过ASCII码匹对符合的次数来判断是否匹配(不要循环)第二种方式是不通过循环来进行正则的验证到达检测效果,这也是博主没找到合适的方法原因(总觉循环没必要)。newRegExp(“[\x20-\x7E]{“+str.length+”}”)通过数字,英文以及英文符号ASCII码的范围对字符串验证,并且加上其出现的次数,如果没有出现

    2022年6月22日
    166
  • 函数指针与block[通俗易懂]

    该文章同时发布在我的简书上author:OC中block的身影到处瞥见但不知道你是否和我一样开始动手时,发现摸不到它的脾气脑袋一空,眼睛圆溜的45°逆转构她的形,会她的意依旧不见其身想到大学…书上白净的指针一节或许怕被难住,竟连老师也放了你鸽子还好有我触摸你皮肤也变得干涸风也一直狠劲的吞并打圈的眼眶我保证,定不负年华不负你.拿起C语言书,认真查看了一…

    2022年4月13日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号