OpenNI的深度图显示有主要有两种方法:

1.深度值直接赋值方法(同上一篇):

缺点:深度图层次不明显,主要由于位移操作导致

#include <stdlib.h>
#include <iostream>
#include <string>#include <XnCppWrapper.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"using namespace std;
using namespace cv;void CheckOpenNIError( XnStatus result, string status )
{ if( result != XN_STATUS_OK ) cerr << status << " Error: " << xnGetStatusString( result ) << endl;
}int main( int argc, char** argv )
{XnStatus result = XN_STATUS_OK;  xn::DepthMetaData depthMD;xn::ImageMetaData imageMD;//OpenCVIplImage*  imgDepth16u=cvCreateImage(cvSize(640,480),IPL_DEPTH_16U,1);IplImage* imgRGB8u=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);IplImage*  depthShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);IplImage* imageShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);cvNamedWindow("depth",1);cvNamedWindow("image",1);char key=0;//【2】// context xn::Context context; result = context.Init(); CheckOpenNIError( result, "initialize context" );  // creategenerator  xn::DepthGenerator depthGenerator;  result = depthGenerator.Create( context ); CheckOpenNIError( result, "Create depth generator" );  xn::ImageGenerator imageGenerator;result = imageGenerator.Create( context ); CheckOpenNIError( result, "Create image generator" );//【3】//map mode  XnMapOutputMode mapMode; mapMode.nXRes = 640;  mapMode.nYRes = 480; mapMode.nFPS = 30; result = depthGenerator.SetMapOutputMode( mapMode );  result = imageGenerator.SetMapOutputMode( mapMode );  //【4】// correct view port  depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator ); //【5】//read dataresult = context.StartGeneratingAll();  //【6】result = context.WaitNoneUpdateAll();  while((key!=27) && !(result = context.WaitNoneUpdateAll()) ){//get meta datadepthGenerator.GetMetaData(depthMD); imageGenerator.GetMetaData(imageMD);
//----------------------------------------------------------------------
//---------------转换为Mat操作,3种方式----------------------------
//------------------------------------------------------------------------if(depthMD.Data()!=NULL){//方法【1】通过Mat定义//convert ImageMetaData to Matuchar *q = (uchar *) imageMD.Data();Mat rgbMat1(480,640,CV_8UC3,q);Mat rgbMatShow1;cvtColor(rgbMat1,rgbMatShow1,CV_RGB2BGR);imshow("testColorMat",rgbMatShow1);//convert DepthMetaData to Matunsigned short* p = (unsigned short*)  depthMD.Data();Mat depthMat1(480,640,CV_16SC1,p);Mat depthMatShow1(480,640,CV_8UC1);convertScaleAbs(depthMat1,depthMatShow1,255/4096.0);//这一步很重要;normalize(depthMatShow1,depthMatShow1,255,0,CV_MINMAX);imshow("testDepthMat",depthMatShow1);//方法【2】通过坐标(x,y),ImageMetaData貌似不太支持;Mat depthMat2(480,640,CV_16SC1);Mat depthMatShow2(480,640,CV_8UC1);UINT16* depth_p;for (int y=0; y<480; y++){depth_p = depthMat2.ptr<UINT16>(y);for (int x=0; x<640; x++){depth_p[x]=(UINT16)depthMD(x,y);//核心赋值}}convertScaleAbs(depthMat2,depthMatShow2,255/4096.0);//这一步很重要;normalize(depthMatShow2,depthMatShow2,255,0,CV_MINMAX);imshow("testDepthMat2",depthMatShow2);//方法【3】通过指针操作;//RGBMat rgbMat3(480,640,CV_8UC3);Mat rgbMatShow3;uchar *rgb_p;UINT8 *src_p;src_p = (UINT8*) imageMD.Data();for (int y=0; y<480; y++){rgb_p = rgbMat3.ptr<uchar>(y);for (int x=0; x<640; x++){*rgb_p++ =(uchar) *src_p++;*rgb_p++ =(uchar) *src_p++;*rgb_p++ =(uchar) *src_p++;}}cvtColor(rgbMat3,rgbMatShow3,CV_RGB2BGR);imshow("testColorMat3",rgbMatShow3);Mat depthMat3(480,640,CV_16SC1);Mat depthMatShow3(480,640,CV_8UC1);UINT16* depthSrc_p;uchar* depth3_p;depthSrc_p = (UINT16*)depthMD.Data();for (int y=0; y<480; y++){depth3_p = depthMatShow3.ptr<uchar>(y);for (int x=0; x<640; x++){depth3_p[x]= (uchar)((*depthSrc_p)*255/4096);//depthSrc_p++;}}//convertScaleAbs(depthMat3,depthMatShow3,255/4096.0);//这一步很重要;normalize(depthMatShow3,depthMatShow3,255,0,CV_MINMAX);imshow("testDepthMat3",depthMatShow3);}//OpenCV output
// ----------------------------------------------------------------------
// ---------------转换为IplImage操作----------------------------
// ------------------------------------------------------------------------memcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2);cvConvertScale(imgDepth16u,depthShow,255/4096.0,0);memcpy(imgRGB8u->imageData,imageMD.Data(),640*480*3);cvCvtColor(imgRGB8u,imageShow,CV_RGB2BGR);cvShowImage("depth", depthShow);cvShowImage("image",imageShow);key=cvWaitKey(20);}}

2.通过NiSample的直方图赋值方法:

优点:生成的深度图层次比较明显。

代码附带深度阈值分割

#include <stdlib.h>
#include <iostream>
#include <string>#include <XnCppWrapper.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"using namespace std;
using namespace cv;void CheckOpenNIError( XnStatus result, string status )
{ if( result != XN_STATUS_OK ) cerr << status << " Error: " << xnGetStatusString( result ) << endl;
}int main( int argc, char** argv )
{XnStatus result = XN_STATUS_OK;  xn::DepthMetaData depthMD;xn::ImageMetaData imageMD;//【2】// context xn::Context context; result = context.Init(); CheckOpenNIError( result, "initialize context" );  // creategenerator  xn::DepthGenerator depthGenerator;  result = depthGenerator.Create( context ); CheckOpenNIError( result, "Create depth generator" );  xn::ImageGenerator imageGenerator;result = imageGenerator.Create( context ); CheckOpenNIError( result, "Create image generator" );//【3】//map mode  XnMapOutputMode mapMode; mapMode.nXRes = 640;  mapMode.nYRes = 480; mapMode.nFPS = 30; result = depthGenerator.SetMapOutputMode( mapMode );  result = imageGenerator.SetMapOutputMode( mapMode );  //【4】// correct view port// 若使用imageGenerator则深度图有一圈黑depthGenerator.GetAlternativeViewPointCap().SetViewPoint( depthGenerator ); //【5】//read dataresult = context.StartGeneratingAll();  //【6】result = context.WaitNoneUpdateAll();  Mat depthMat1u(480,640,CV_8UC1);Mat depthMat3u(480,640,CV_8UC3);char key=0;while((key!=27) && !(result = context.WaitNoneUpdateAll()) ){//get meta datadepthGenerator.GetMetaData(depthMD); imageGenerator.GetMetaData(imageMD);//直接Mat赋值操作uchar *q = (uchar *) imageMD.Data();Mat rgbMat1(480,640,CV_8UC3,q);Mat rgbMatShow1;cvtColor(rgbMat1,rgbMatShow1,CV_RGB2BGR);imshow("testColorMat",rgbMatShow1);//通过OpenNI Sample 中 NUISampleViewer 的 pDepthHist[*pDepth]操作.XnDepthPixel nZRes = depthMD.ZRes();float* pDepthHist = (float*)malloc(nZRes * sizeof(float));const XnDepthPixel* pDepth = depthMD.Data();xnOSMemSet(pDepthHist, 0, nZRes*sizeof(float));unsigned int nNumberOfPoints = 0;for (XnUInt y = 0; y < depthMD.YRes(); ++y){for (XnUInt x = 0; x < depthMD.XRes(); ++x, ++pDepth){if (*pDepth != 0){pDepthHist[*pDepth]++;nNumberOfPoints++;}}}for (int nIndex=1; nIndex<nZRes; nIndex++){pDepthHist[nIndex] += pDepthHist[nIndex-1];}if (nNumberOfPoints){for (int nIndex=1; nIndex<nZRes; nIndex++){pDepthHist[nIndex] = (unsigned int)(256 * (1.0f - (pDepthHist[nIndex] / nNumberOfPoints)));}}const XnDepthPixel* pDepthRow = depthMD.Data();for (XnUInt y = 0; y < depthMD.YRes(); ++y){const XnDepthPixel* pDepth = pDepthRow;uchar* depthMat1u_p = depthMat1u.ptr<uchar>(y);for (XnUInt x = 0; x < depthMD.XRes(); ++x, ++pDepth){if (1/**pDepth != 0*/){uchar nHistValue =(uchar) pDepthHist[*pDepth];depthMat1u_p[x] = nHistValue;//NiSample是将B、G两个通道都赋值生成黄色深度图}}pDepthRow += depthMD.XRes();}//normalize(depthMat1u,depthMat1u,255,0,CV_MINMAX);Point maxLoc;double maxV;minMaxLoc(depthMat1u,0,&maxV,0,&maxLoc);Mat mask(480,640,CV_8UC1);threshold(depthMat1u,mask,0.9*maxV,255,THRESH_BINARY);imshow("mask",mask);cvtColor(depthMat1u,depthMat3u,CV_GRAY2BGR);circle(depthMat3u,maxLoc,5,Scalar(0,255,0),-1);imshow("depthMaxloc",depthMat3u);key=waitKey(20);}}

OpenNI:深度图显示方法相关推荐

  1. Latex 算法过长 分页显示方法

    参考: Algorithm tag and page break Latex 算法过长 分页显示方法 1.引用algorithm包: 2.在\begin{document}前加上以下Latex代码: ...

  2. 服务器中显示存储设备,服务器节点信息集中显示方法、系统、设备及存储介质...

    1. 一种服务器节点信息集中显示方法,其特征在于,应用于CMC,包括: 获取M个BMC各自收集的参数信息数据,得到目标数据: 将所述目标数据发送至N个BMC,以使所述N个BMC中的任一BMC显示所述目 ...

  3. ios html gif 显示,iOS中gif图的显示方法示例

    iOS中gif图的显示方法示例 发布时间:2020-09-19 06:15:42 来源:脚本之家 阅读:86 作者:蓝光95 一.前言 iOS开发中,大部分时候我们显示一张静态图就可以了,但是有的时候 ...

  4. c语言文件分屏显示,通用子目录文件显示方法

    通用子目录文件显示方法 在用CHKDS/V对磁盘子目录及子目录文件进行查找时,由于输出显示信息没有分屏显示,很容易错过需要的信息,并且显示信息没有标记出隐藏的子目录名及子目录文件名,这样就对进一步的子 ...

  5. html照片从模糊到清晰的渐变加载显示方法

    1.背景介绍 在网络相册应用中用户查看照片是最朴素的需求,当网络比较慢的时候查看照片等待的时间是比较长的,用户体验会很差. 2.现状 现在加载照片的方法主要有一下两种: (1)最原始的方式在html页 ...

  6. 单行文本和多行文本溢出以省略号显示方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Xna支持中文显示方法归纳

    Xna不同于DirectX,因其内部并未提供类似于D3DFont的机制(据说之所以会这样做,也是考虑到与Xbox360兼容的缘故),使得显示中文变得极为不便. 虽然如此,要实现Xna下的中文显示依然存 ...

  8. 车辆及其应用的车载语音识别显示方法及系统与流程

    本发明涉及车联网领域,特别是涉及车辆及其应用的车载语音识别显示方法及系统. 背景技术: 目前,道路上行驶的车辆之间的沟通还停留于仅依赖灯光或者喇叭的阶段,如:使用大灯闪灯.双跳灯.喇叭鸣笛等方式提醒前 ...

  9. WFDB软件包简介——ECG数据在Matlab下的读取/显示方法

    转载自 http://pfyu.bokee.com/6946657.html ECG数据在Matlab下的读取/显示方法 WFDB软件包包含两大组件: 1.WFDB库,支持心电信号读取及分析: 2.W ...

最新文章

  1. Boost 1.53.0 发布,可移植的C++标准库
  2. 从前台页面取参数到sql的like中比较时参数的预处理
  3. SPI及其工作原理浅析
  4. Jupiter黑客松——IPFS开发者大赛火热报名中!
  5. 在sqlserver中使用事务的注意事项
  6. 台式计算机年限怎么看,电脑使用年限_电脑使用年限查询
  7. Leetcode431.将N叉树编码为二叉树(golang)
  8. HttpModule和HttpHandler的常见用法
  9. 数据中心运营商Chayora公司获得渣打银行的战略投资
  10. 怎么看计算机版本号,如何查看电脑windows版本号(查看电脑版本信息的11种方法)...
  11. 浅析网站 APP 登录界面设计
  12. Jquery利用ajax调用asp.net webservice的各种数据类型(总结篇)
  13. HTML块级元素与行内元素的转变
  14. C++Builder 资料库 (转载)
  15. 计算机领域8月SCI/EI期刊列表已更新,是你在找的1区TOP审稿快刊吗?
  16. 设备驱动程序安装的重要文件
  17. 在python集成开发环境中、可使用快捷键运行程序_在Python集成开发环境中,可使用快捷键 运行程序。_学小易找答案...
  18. QA:xilinx系列verilog版出版事宜
  19. npm WARN vuex@3.6.2 requires a peer of vue@^2.0.0 but none is installed
  20. source insight 死活打不开问题解决

热门文章

  1. 安装程序无法继续,因为您的计算机上安装了更新的internet explorer
  2. 在米帝求学的你,知道每个州的圣诞节特色活动吗!
  3. Oracle批量清空表数据
  4. JAVA中JVM的重排序详细介绍(写得很明白)
  5. 神舟k610d i7 d2 黑苹果安装资源 10.15.x
  6. 07夯实基础之JavaEE基础
  7. background各个属性详解
  8. 阿尔法元秒杀阿法狗,人工智能时代开启了吗
  9. 系统体系结构-概念和框架
  10. IP协议 Header Checksum算法