- #include <iostream>
- #include <string>
- #include <XnCppWrapper.h>
- #include <vector>
- #include <C:\Program Files\PCL 1.6.0\include\pcl-1.6\pcl\io\pcd_io.h>
- #include <C:\Program Files\PCL 1.6.0\include\pcl-1.6\pcl\point_types.h>
- #include "opencv/cv.h"
- #include "opencv/highgui.h"
- using namespace xn;
- using namespace std;
- using namespace cv;
- //check error
- void CheckOpenNIError( XnStatus eResult, string sStatus )
- {
- if( eResult != XN_STATUS_OK )
- cout << sStatus << " Error: " << xnGetStatusString( eResult ) << endl;
- }
- //
- void GeneratePointCloud( xn::DepthGenerator& rDepthGen,
- const XnDepthPixel* pDepth,
- pcl::PointCloud<pcl::PointXYZI>& cloud )
- {
- // number of point is the number of 2D image pixel
- xn::DepthMetaData mDepthMD;
- rDepthGen.GetMetaData( mDepthMD );
- unsigned int uPointNum = mDepthMD.FullXRes() * mDepthMD.FullYRes();
- // build the data structure for convert
- XnPoint3D* pDepthPointSet = new XnPoint3D[ uPointNum ];
- unsigned int i, j, idxShift, idx;
- for( j = 0; j < mDepthMD.FullYRes(); ++j )
- {
- idxShift = j * mDepthMD.FullXRes();
- for( i = 0; i < mDepthMD.FullXRes(); ++i )
- {
- idx = idxShift + i;
- pDepthPointSet[idx].X = (float)i;
- pDepthPointSet[idx].Y = (float)j;
- pDepthPointSet[idx].Z = (float)pDepth[idx];
- }
- }
- // project points to real world
- XnPoint3D* p3DPointSet = new XnPoint3D[ uPointNum ];
- rDepthGen.ConvertProjectiveToRealWorld( uPointNum, pDepthPointSet, p3DPointSet );
- delete[] pDepthPointSet;
-
- // delete zero and count the nonzero
- int k=0;
- for( i = 0; i < uPointNum; ++ i )
- {
- // skip the depth 0 points
- if( p3DPointSet[i].Z !=0 )
- {
- k++;
- }
- }
- // build point cloud
- cloud.width=k;
- cloud.height=1;
- cloud.is_dense=false;
- cloud.points.resize(cloud.width);
- int l=0;
- for( i = 0; i < uPointNum; ++ i )
- {
- if(p3DPointSet[i].Z !=0 )
- {
- cloud.points[l].x=p3DPointSet[i].X;
- cloud.points[l].y=p3DPointSet[i].Y;
- cloud.points[l].z=p3DPointSet[i].Z;
- cloud.points[l].intensity=0;
- ++l;
- }
- }
- delete[] p3DPointSet;
-
- }
- int main (int argc, char** argv)
- {
- int m=0;
- int a=0;
- int b=0;
- int c=0;
- char key=0;
- pcl::PointCloud<pcl::PointXYZI> cloud;
- xn::DepthMetaData m_DepthMD;
- xn::ImageMetaData m_ImageMD;
- // for opencv Mat
- Mat m_depth16u( 480,640,CV_16UC1);
- Mat m_rgb8u( 480,640,CV_8UC3);
- Mat m_DepthShow( 480,640,CV_8UC1);
- Mat m_ImageShow( 480,640,CV_8UC3);
- //cvNamedWindow("depth");
- //cvNamedWindow("color");
- //Initialize Context
- XnStatus eResult;
- Context mContext;
- eResult=mContext.Init( );
- CheckOpenNIError( eResult,"Initialize Context" );
- //create depth generator
- DepthGenerator mDepthgenerator;
- mDepthgenerator.Create( mContext );
- CheckOpenNIError( eResult,"Create Depth generator" );
- //create image generator
- ImageGenerator mImagegenerator;
- mImagegenerator.Create( mContext );
- CheckOpenNIError( eResult,"Create Image generator" );
- //set MapOutputMode
- XnMapOutputMode mapmode;
- mapmode.nFPS=30;
- mapmode.nXRes=640;
- mapmode.nYRes=480;
- eResult = mDepthgenerator.SetMapOutputMode( mapmode );
- eResult = mImagegenerator.SetMapOutputMode( mapmode );
- mDepthgenerator.GetAlternativeViewPointCap().SetViewPoint( mImagegenerator );
- eResult= mDepthgenerator.StartGenerating( );
- eResult= mImagegenerator.StartGenerating( );
- while( ( key!=27 ) && !( eResult = mContext.WaitNoneUpdateAll( )) )
- {
- // get the depthmap and generate 3D point
- const XnDepthPixel* pDepthMap = mDepthgenerator.GetDepthMap();
- GeneratePointCloud( mDepthgenerator, pDepthMap,cloud );
- mDepthgenerator.GetMetaData( m_DepthMD );
- mImagegenerator.GetMetaData( m_ImageMD );
- memcpy(m_depth16u.data,m_DepthMD.Data(),640*480*2);
- memcpy(m_rgb8u.data,m_ImageMD.Data(),640*480*3);
- m_depth16u.convertTo(m_DepthShow,CV_8U,255/4096.0);
- cvtColor(m_rgb8u,m_ImageShow,CV_RGB2BGR);
- //imshow("depth", m_DepthShow);
- //imshow("color", m_ImageShow);
-
-
- /*char filename[100];
- sprintf(filename,"E://111//%d.pcd",m++);
- pcl::io::savePCDFile(filename,cloud);
- char filename1[100];
- char filename2[100];
- char filename3[100];
- sprintf(filename1,"E://111//%d_color.bmp",a++);
- sprintf(filename2,"E://111//%d_16depth.png",b++);
- sprintf(filename3,"E://111/%d_depth.bmp",c++);
- cv::imwrite(filename1,m_ImageShow);
- cv::imwrite(filename2,m_depth16u);
- cv::imwrite(filename3,m_DepthShow);*/
- key=cvWaitKey(20);
- }
- //cvDestroyWindow("depth");
- //cvDestroyWindow("color");
- mContext.StopGeneratingAll( );
- mContext.Shutdown( );
- return 0;
- }
复制代码 |