kinect,openni,opencv 获取并显示深度与彩色图像

最近打算重拾kinect,研究骨骼、手势识别,做个备份,一年半前写的程序都找不到了
转自:http://blog.csdn.net/chenxin_130/article/details/6696187

#include <stdlib.h>
#include <iostream>
#include <string>
//【1】
#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;

    //OpenCV
    IplImage*  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  初始化上下文,用来管理整个OpenNI上下文的部分) 。在进行起始化的时候,所有OpenNI建立,设定所需要的生产节点
    xn::Context context;
    result = context.Init();
    CheckOpenNIError( result, "initialize context" );  

    // creategenerator  生产节点,上下文传入,要注意,有时还需要输出模式;而以Kinect的来说,是要设定成为640× 480,30 FPS。
    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 data,产生数据(generate data), context统一控制资料读取开关。StartGeneratingAll()开始,StopGeneratingAll()停止。
    result = context.StartGeneratingAll();  
    //【6】读取资料
    result = context.WaitNoneUpdateAll();  

    while( (key!=27) && !(result = context.WaitNoneUpdateAll( ))  )
    {  
        //get meta data
        // Depth Generator 是一个「XnDepthPixel」的 const指针,实际上是640*480的数组,每个点代表该像素的深度,类别是XnDepthPixel;
        //深度值Win 32平台上等同于usigned short,0代表看不到,此外越远,灰度值越高,越偏向白色。GetDepthMap()也可以
        //    
        //GetImageMap()可获取grb,默认是XnUInt8(实际上就是 unsigned char)的 const指针,而这个数组大小是 640 x 480 x 3,每三個為一組、分別代表 RGB的值。
        //也可以 GetRGB24ImageMap()取得 XnRGB24Pixel 这种格式,效果差异不大。image generator 也可以通过SetPixelFormat()修改每一個像素格式。
        depthGenerator.GetMetaData(depthMD); //XN_PIXEL_FORMAT_GRAYSCALE_16_BIT
        imageGenerator.GetMetaData(imageMD);//XN_PIXEL_FORMAT_RGB24
        memcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2);
        memcpy(imgRGB8u->imageData,imageMD.Data(),640*480*3);


        /*const XnDepthPixel*  pDepthMap = depthGenerator.GetDepthMap();
        const XnUInt8* pRgbMap = imageGenerator.GetImageMap();
        memcpy(imgDepth16u->imageData,pDepthMap,640*480*sizeof(XnDepthPixel));
        memcpy(imgRGB8u->imageData,pRgbMap,640*480*3);*/
        //【7】OpenCV output

        cvConvertScale(imgDepth16u,depthShow,255/4096.0,0);

        cvCvtColor(imgRGB8u,imageShow,CV_RGB2BGR);
        cvShowImage("depth", depthShow);
        cvShowImage("image",imageShow);
        key=cvWaitKey(20);
    }

    //destroy
    cvDestroyWindow("depth");
    cvDestroyWindow("image");
    cvReleaseImage(&imgDepth16u);
    cvReleaseImage(&imgRGB8u);
    cvReleaseImage(&depthShow);
    cvReleaseImage(&imageShow);
    context.StopGeneratingAll();
    context.Shutdown();
    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值