rgbd slam_RGB模型
模型 SLAM rgb rgbd
2023-06-13 09:13:40 时间
大家好,又见面了,我是你们的朋友全栈君。
本文采用高博大佬的代码来跑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运行结果:
采用pcl_viewer查看生成的result.pcd
效果不怎么好,还是要继续提高姿势水平啊。
最后再次感谢高博大佬,RGB-D SLAM代码可参考我的GitHub。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192169.html原文链接:https://javaforall.cn
相关文章
- Unity 导入原神人物模型
- PyTorch JIT 模型部署常见错误
- 数据库模型建模工具_数据库设计工具有哪些
- 09 模型的增删查改《ThinkPHP6 入门到电商实战》
- irr模型不足_SVM模型
- 独家 | Gen-1——可以改变视频风格的AI模型
- 论文速递 | 模型训练加速、文本生成框架、强化学习、知识图谱(NeurIPS2022)
- 最懂中国传统文化的AI绘画模型,画作有形更有神,传达儒释道思想
- 智能体觉醒自我意识?DeepMind警告:当心模型「阳奉阴违」
- R语言用Copulas模型的尾部相依性分析损失赔偿费用|附代码数据
- 语言模型生成了自然界不存在的蛋白质,图灵奖得主LeCun:蛋白质编程来了
- Unsupervised NMT、PBSMT、coarse-to-fine...你都掌握了吗?一文总结机器翻译必备经典模型(二)
- 王炸!微软发布Visual ChatGPT:视觉模型加持ChatGPT实现丝滑聊天
- 浪潮信息AIStation与FlagAI项目完成兼容性认证 为大模型开发提质增效
- Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型|附代码数据