最近打算重拾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;
}
kinect,openni,opencv 获取并显示深度与彩色图像
最新推荐文章于 2021-01-28 10:44:01 发布