OpenNI:深度图显示方法
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:深度图显示方法相关推荐
- Latex 算法过长 分页显示方法
参考: Algorithm tag and page break Latex 算法过长 分页显示方法 1.引用algorithm包: 2.在\begin{document}前加上以下Latex代码: ...
- 服务器中显示存储设备,服务器节点信息集中显示方法、系统、设备及存储介质...
1. 一种服务器节点信息集中显示方法,其特征在于,应用于CMC,包括: 获取M个BMC各自收集的参数信息数据,得到目标数据: 将所述目标数据发送至N个BMC,以使所述N个BMC中的任一BMC显示所述目 ...
- ios html gif 显示,iOS中gif图的显示方法示例
iOS中gif图的显示方法示例 发布时间:2020-09-19 06:15:42 来源:脚本之家 阅读:86 作者:蓝光95 一.前言 iOS开发中,大部分时候我们显示一张静态图就可以了,但是有的时候 ...
- c语言文件分屏显示,通用子目录文件显示方法
通用子目录文件显示方法 在用CHKDS/V对磁盘子目录及子目录文件进行查找时,由于输出显示信息没有分屏显示,很容易错过需要的信息,并且显示信息没有标记出隐藏的子目录名及子目录文件名,这样就对进一步的子 ...
- html照片从模糊到清晰的渐变加载显示方法
1.背景介绍 在网络相册应用中用户查看照片是最朴素的需求,当网络比较慢的时候查看照片等待的时间是比较长的,用户体验会很差. 2.现状 现在加载照片的方法主要有一下两种: (1)最原始的方式在html页 ...
- 单行文本和多行文本溢出以省略号显示方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Xna支持中文显示方法归纳
Xna不同于DirectX,因其内部并未提供类似于D3DFont的机制(据说之所以会这样做,也是考虑到与Xbox360兼容的缘故),使得显示中文变得极为不便. 虽然如此,要实现Xna下的中文显示依然存 ...
- 车辆及其应用的车载语音识别显示方法及系统与流程
本发明涉及车联网领域,特别是涉及车辆及其应用的车载语音识别显示方法及系统. 背景技术: 目前,道路上行驶的车辆之间的沟通还停留于仅依赖灯光或者喇叭的阶段,如:使用大灯闪灯.双跳灯.喇叭鸣笛等方式提醒前 ...
- WFDB软件包简介——ECG数据在Matlab下的读取/显示方法
转载自 http://pfyu.bokee.com/6946657.html ECG数据在Matlab下的读取/显示方法 WFDB软件包包含两大组件: 1.WFDB库,支持心电信号读取及分析: 2.W ...
最新文章
- Boost 1.53.0 发布,可移植的C++标准库
- 从前台页面取参数到sql的like中比较时参数的预处理
- SPI及其工作原理浅析
- Jupiter黑客松——IPFS开发者大赛火热报名中!
- 在sqlserver中使用事务的注意事项
- 台式计算机年限怎么看,电脑使用年限_电脑使用年限查询
- Leetcode431.将N叉树编码为二叉树(golang)
- HttpModule和HttpHandler的常见用法
- 数据中心运营商Chayora公司获得渣打银行的战略投资
- 怎么看计算机版本号,如何查看电脑windows版本号(查看电脑版本信息的11种方法)...
- 浅析网站 APP 登录界面设计
- Jquery利用ajax调用asp.net webservice的各种数据类型(总结篇)
- HTML块级元素与行内元素的转变
- C++Builder 资料库 (转载)
- 计算机领域8月SCI/EI期刊列表已更新,是你在找的1区TOP审稿快刊吗?
- 设备驱动程序安装的重要文件
- 在python集成开发环境中、可使用快捷键运行程序_在Python集成开发环境中,可使用快捷键 运行程序。_学小易找答案...
- QA:xilinx系列verilog版出版事宜
- npm WARN vuex@3.6.2 requires a peer of vue@^2.0.0 but none is installed
- source insight 死活打不开问题解决