Environment: Window 8.1, OpenCV 2.4.9, OpenNI 1.5.4
這問題我解了好久 Orz...
參照其他人在網路上分享的一些 Code 總是會有一些 Bug 出現
目前還找不到有一版是完整的可以從 .oni 檔轉到 avi 檔並且還能同時儲存 RGB 與 Depth 圖片!
但是我今天終於弄出來了,感動 >< !
下面是我要跟大家分享的 Code ,還附帶 Slash Rotation XDD
#include < fstream > #include < iostream > #include < time.h > using namespace std;
// OpenCV Header #include<opencv\cv.h> #include<opencv\cxcore.h> #include<opencv\highgui.h> // OpenNI Header #include < XnOpenNI.h > #include < XnTypes.h > #include < XnLog.h > #include < XnCppWrapper.h > #include < XnPropNames.h > #define mydelay 50 void delay(int m) { clock_t wait = m+ clock(); while (wait > clock()); } inline std::string printfstring(const char *message, ...) { static char buf[8*1024]; va_list va; va_start(va, message); vsprintf(buf, message, va); va_end(va); std::string str(buf); return str; } /// convert depth map to OpenCV void xdepth2opencv(xn::DepthMetaData &xDepthMap, cv::Mat &im) { int h=xDepthMap.YRes(); int w=xDepthMap.XRes(); const cv::Mat tmp(h, w, CV_16U, ( void *)xDepthMap.Data()); tmp.copyTo(im); } /// convert image map to OpenCV void ximage2opencv(xn::ImageMetaData &xImageMap, cv::Mat &im) { int h=xImageMap.YRes(); int w=xImageMap.XRes(); const XnRGB24Pixel * xx=xImageMap.RGB24Data(); const cv::Mat tmp(h, w, CV_8UC3, ( void *)xx); tmp.copyTo(im); } int main( int argc, char** argv ) { // Initial OpenNI Context xn::Context xContext; xContext.Init(); // Read .oni File xn::Player xPlayer; xContext.OpenFileRecording("D:\\S15_C13_U10_B1.oni", xPlayer ); xPlayer.SetRepeat( false ); xn::ImageGenerator g_image; xn::ImageMetaData g_imageMD; xn::DepthGenerator g_depth; xn::DepthMetaData g_depthMD; g_depth.Create( xContext ); g_image.Create( xContext ); // get total frame number XnUInt32 depthFrames; xPlayer.GetNumFrames( g_depth.GetName(), depthFrames); std::cout << "Depth Frame: " << depthFrames << std::endl; XnMapOutputMode imageMapMode; g_image.GetMapOutputMode(imageMapMode); int c = imageMapMode.nXRes; int r = imageMapMode.nYRes; XnUInt32 uFrames; xPlayer.GetNumFrames( g_depth.GetName(), uFrames ); const XnRGB24Pixel* pImageMap; CvVideoWriter *vdo = cvCreateVideoWriter("file.avi", CV_FOURCC('P' , 'I' , 'M' , '1'), 30 , cvSize(c,r) , 1); xContext.StartGeneratingAll(); std::cout << "Waiting For Processing "; for( unsigned int i = 0; i < uFrames; ++ i ) { g_depth.WaitAndUpdateData(); g_image.WaitAndUpdateData(); g_image.GetMetaData(g_imageMD); cv::Mat im; std::string RGBfile = "C:\\Users\\matt-pc\\Desktop\\Photo\\RGB\\" + printfstring("image%05d.png", i); ximage2opencv(g_imageMD, im); IplImage* rgbi = cvCreateImage(cvSize(im.cols,im.rows), IPL_DEPTH_8U, 3); IplImage image_temp = im; cvCopy(&image_temp, rgbi); cv::Mat rgb_image(&image_temp); cv::imshow( "Example2", rgb_image ); cvWaitKey(10); cv::imwrite(RGBfile.c_str(), im ); cvWriteFrame(vdo, &image_temp); std::string Depthfile = "C:\\Users\\matt-pc\\Desktop\\Photo\\Depth\\" + printfstring("depth%05d.png", i); g_depth.GetMetaData(g_depthMD); cv::Mat dim; xdepth2opencv(g_depthMD, dim); cv::imwrite(Depthfile.c_str(), dim ); if ( i % 100 == 0) std::cout << "."; std::cout << "_\b"; delay(mydelay); std::cout << "\\\b"; delay(mydelay); std::cout << "|\b"; delay(mydelay); std::cout << "/\b"; delay(mydelay); i++; } cvReleaseVideoWriter(&vdo); return 0; }
下面是另外一種寫法,另外還有 resize image 的功能
#include < fstream > #include < stdlib.h > #include < iostream > #include < string > #include < fstream > #include < XnCppWrapper.h > #include "opencv/cv.h" #include "opencv/highgui.h" using namespace std; using namespace cv;
#define WIDTH 640
#define HEIGHT 480 #define PROCESS_WIDTH 320 #define PROCESS_HEIGHT 240 #define ONI_TYPE_DEPTH 0 inline std::string printfstring(const char *message, ...) { static char buf[8*1024]; va_list va; va_start(va, message); vsprintf(buf, message, va); va_end(va); std::string str(buf); return str; } 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; // context xn::Context context; result = context.Init(); CheckOpenNIError( result, "initialize context" ); const char *csFileName = "C:\\Users\\matt-pc\\Desktop\\Photo\\S15_C13_U10_B1.oni"; // Read .oni File xn::Player xPlayer; context.OpenFileRecording(csFileName, xPlayer ); xPlayer.SetRepeat( false ); // 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" ); // correct view port //depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator ); CvVideoWriter *vdo = cvCreateVideoWriter("C:\\Users\\matt-pc\\Desktop\\Photo\\file.avi", 0, 30 , cvSize(640,480) , 1); //read data result = context.StartGeneratingAll(); result = context.WaitNoneUpdateAll(); int i = 0; while((key!=27) && !(result = context.WaitNoneUpdateAll()) ) { //get meta data depthGenerator.GetMetaData(depthMD); imageGenerator.GetMetaData(imageMD); std::string RGBfile = "C:\\Users\\matt-pc\\Desktop\\Photo\\RGB\\" + printfstring("image%05d.png", i); std::string Depthfile = "C:\\Users\\matt-pc\\Desktop\\Photo\\Depth\\" + printfstring("depth%05d.png", i); //OpenCV output 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); //IplImage *srcImg = NULL; //IplImage *dstImg = NULL; //dstImg = cvCreateImage(cvSize(imageShow->width/2,imageShow->height/2),imageShow->depth,3); //cvResize(imageShow, dstImg, CV_INTER_LINEAR); //cvShowImage("Raw_image",imageShow); //cvShowImage("Resize_image", dstImg); cvShowImage("RGB Image", imageShow); cvShowImage("Depth Image", depthShow); //cv::imwrite(RGBfile.c_str(), imageShow ); //cv::imwrite(Depthfile.c_str(), depthShow ); key=cvWaitKey(20); i++; cvWriteFrame(vdo, imageShow); } }
全站熱搜
留言列表