上一节讲述了搭环境时遇到的挫折,这一节我们来讲讲如何使用XtionProLive(XtionPro没有彩色摄像头,Live版才有)获取彩色图和数度图,以及彩色图的放大与水平镜像。(PS: 对比两代OpenNI,2真的比1要简洁得多,使用OpenNI2编程序,代码简单易懂。)
首先初始化环境:
OpenNI::initialize();
创建状态:
Status rc = STATUS_OK;接着声明并打开设备:
Device xtion;
const char * deviceURL = openni::ANY_DEVICE; //设备名
rc = xtion.open(deviceURL);
创建深度数据流和彩色数据流:
VideoStream streamDepth;
VideoStream streamColor;
打开数据流并对齐彩色/深度图像:
rc = streamDepth.start();
rc = streamColor.start();
// 图像模式注册,彩色图与深度图对齐
if (xtion.isImageRegistrationModeSupported(
<span style="white-space:pre"> </span>IMAGE_REGISTRATION_DEPTH_TO_COLOR))
{
xtion.setImageRegistrationMode(IMAGE_REGISTRATION_DEPTH_TO_COLOR);
}从数据流中读取数据保存到VideoFrameRef中并用opencv显示出来:
while (true)
{
// 读取数据流
rc = streamDepth.readFrame(&frameDepth);
if (rc == STATUS_OK)
{
// 将深度数据转换成OpenCV格式
const Mat mImageDepth(frameDepth.getHeight(), frameDepth.getWidth(), CV_16UC1, (void*)frameDepth.getData());
Mat mScaledDepth, hScaledDepth;
mImageDepth.convertTo(mScaledDepth, CV_8U, 255.0 / iMaxDepth);
// 显示出深度图像
<span style="white-space:pre"> </span>imshow("Depth Image", hScaledDepth);
}
rc = streamColor.readFrame(&frameColor);
if (rc == STATUS_OK)
{
// 同样的将彩色图像数据转化成OpenCV格式
const Mat mImageRGB(frameColor.getHeight(), frameColor.getWidth(), CV_8UC3, (void*)frameColor.getData());
// 首先将RGB格式转换为BGR格式
Mat cImageBGR,bImageBGR,hImageBGR;
cvtColor(mImageRGB, cImageBGR, CV_RGB2BGR);
// 然后显示彩色图像
imshow("Color Image", hImageBGR);
}
// 终止快捷键
if (waitKey(1) == 27)
break;
}
如

本文介绍了如何使用XtionProLive获取彩色图和深度图,包括初始化环境、读取数据、图像显示以及对彩色图进行放大、水平镜像处理。重点在于使用OpenNI2简化编程过程,以及对深度图和彩色图进行视频模式设置、镜像处理和尺寸调整。
最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



