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); } }
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 wrijLove 的頭像
    wrijLove

    宅宅情侶的成長日記

    wrijLove 發表在 痞客邦 留言(0) 人氣()