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

来源:互联网 发布:功能强大不为人知软件 编辑:程序博客网 时间:2024/04/20 04:18
最近打算重拾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 0
原创粉丝点击