Image Component Library (ICL)
OpenNIUtils.h
Go to the documentation of this file.
1 /********************************************************************
2 ** Image Component Library (ICL) **
3 ** **
4 ** Copyright (C) 2006-2013 CITEC, University of Bielefeld **
5 ** Neuroinformatics Group **
6 ** Website: www.iclcv.org and **
7 ** http://opensource.cit-ec.de/projects/icl **
8 ** **
9 ** File : ICLIO/src/ICLIO/OpenNIUtils.h **
10 ** Module : ICLIO **
11 ** Authors: Viktor Richter **
12 ** **
13 ** **
14 ** GNU LESSER GENERAL PUBLIC LICENSE **
15 ** This file may be used under the terms of the GNU Lesser General **
16 ** Public License version 3.0 as published by the **
17 ** **
18 ** Free Software Foundation and appearing in the file LICENSE.LGPL **
19 ** included in the packaging of this file. Please review the **
20 ** following information to ensure the license requirements will **
21 ** be met: http://www.gnu.org/licenses/lgpl-3.0.txt **
22 ** **
23 ** The development of this software was supported by the **
24 ** Excellence Cluster EXC 277 Cognitive Interaction Technology. **
25 ** The Excellence Cluster EXC 277 is a grant of the Deutsche **
26 ** Forschungsgemeinschaft (DFG) in the context of the German **
27 ** Excellence Initiative. **
28 ** **
29 ********************************************************************/
30 
31 #pragma once
32 
33 #include <ICLCore/ImgBase.h>
34 #include <ICLUtils/Mutex.h>
35 #include <ICLUtils/Thread.h>
36 #include <ICLUtils/Configurable.h>
37 #include <ICLCore/CCFunctions.h>
38 
39 #include <ICLIO/OpenNIIncludes.h>
40 
41 #include <map>
42 #include <limits>
43 #include <set>
44 
45 namespace icl {
46  namespace io{
47 
48  namespace icl_openni {
49 
51  template<class T>
52  core::Img<T>* convertDepthImg(xn::DepthMetaData* src, core::Img<T>* dst){
53  float max = 0;
54  if (std::numeric_limits<T>::max() < src -> ZRes()){
55  max = ((float) std::numeric_limits<T>::max()) / ((float) src -> ZRes());
56  }
57 
58  dst -> setSize(utils::Size(src -> XRes(), src -> YRes()));
59  T* data = dst -> getData(0);
60  // draw DEPTH image
61  const XnDepthPixel* pDepthRow = src -> Data();
62  if(!max){
63  for (unsigned int y = 0; y < src -> YRes(); ++y){
64  for (unsigned int x = 0; x < src -> XRes(); ++x, ++pDepthRow, ++data){
65  *data = *pDepthRow;
66  }
67  }
68  } else {
69  for (unsigned int y = 0; y < src -> YRes(); ++y){
70  for (unsigned int x = 0; x < src -> XRes(); ++x, ++pDepthRow, ++data){
71  *data = *pDepthRow * max;
72  }
73  }
74  }
75  return dst;
76  }
77 
79  inline core::Img16s* convertIRImg(xn::IRMetaData* src, core::Img16s* dst){
80  dst -> setSize(utils::Size(src -> XRes(), src -> YRes()));
81  icl16s* data = dst -> getData(0);
82  const XnIRPixel* pIRRow = src -> Data();
83  // draw grayscale image
84  for (unsigned int y = 0; y < src -> YRes(); ++y){
85  for (unsigned int x = 0; x < src -> XRes(); ++x, ++pIRRow, ++data){
86  *data = *pIRRow;
87  }
88  }
89  return dst;
90  }
91 
96  inline core::Img8u* convertRGBImg(xn::ImageMetaData* src, core::Img8u* dst){
97  dst -> setSize(utils::Size(src -> XRes(), src -> YRes()));
98  dst -> setFormat(core::formatRGB);
99  // draw RGB image
100  icl8u* rChannel = dst -> getData(0);
101  icl8u* gChannel = dst -> getData(1);
102  icl8u* bChannel = dst -> getData(2);
103  const XnRGB24Pixel* rgbPixel = src -> RGB24Data();
104  for (unsigned int y = 0; y < src -> YRes(); ++y){
105  for (unsigned int x = 0; x < src -> XRes(); ++x, ++rgbPixel, ++rChannel,
106  ++gChannel, ++bChannel)
107  {
108  *rChannel = rgbPixel -> nRed;
109  *gChannel = rgbPixel -> nGreen;
110  *bChannel = rgbPixel -> nBlue;
111  }
112  }
113  return dst;
114  }
115 
116 
121  inline core::Img8u* convertYuv422Img(xn::ImageMetaData* src, core::Img8u* dst){
122  dst -> setSize(utils::Size(src -> XRes(), src -> YRes()));
123  dst -> setFormat(core::formatRGB);
124  // draw RGB image
125  icl8u* rChannel = dst -> getData(0);
126  icl8u* gChannel = dst -> getData(1);
127  icl8u* bChannel = dst -> getData(2);
128  const XnYUV422DoublePixel* yuvPixel = src -> YUV422Data();
129  icl32s r,g,b;
130  for (int i = 0; i < dst-> getDim()/2 ; ++i){
131  icl::core::cc_util_yuv_to_rgb(yuvPixel->nY1,yuvPixel->nU,yuvPixel->nV,r,g,b);
132  *rChannel = r; ++rChannel;
133  *gChannel = g; ++gChannel;
134  *bChannel = b; ++bChannel;
135  icl::core::cc_util_yuv_to_rgb(yuvPixel->nY2,yuvPixel->nU,yuvPixel->nV,r,g,b);
136  *rChannel = r; ++rChannel;
137  *gChannel = g; ++gChannel;
138  *bChannel = b; ++bChannel;
139  ++yuvPixel;
140  }
141  return dst;
142  }
143 
148  inline core::Img8u* convertGrayScale8Img(xn::ImageMetaData* src, core::Img8u* dst){
149  dst -> setSize(utils::Size(src -> XRes(), src -> YRes()));
150  dst -> setFormat(core::formatGray);
151  // draw RGB image
152  icl8u* gChannel = dst -> getData(0);
153  const XnGrayscale8Pixel* grayPixel = src -> Grayscale8Data();
154  for (int i = 0; i < dst-> getDim() ; ++i){
155  *gChannel = *grayPixel;
156  ++gChannel; ++grayPixel;
157  }
158  return dst;
159  }
160 
162  template<typename T>
164  public:
166  virtual T* initBuffer() = 0;
167  };
168 
170 
174  template<typename T>
176  public:
179  : m_Mutex(), m_Write(0), m_Next(1), m_Read(2)
180  {
182  m_BufferHandler = buffer_handler;
183  m_Buffers[0] = m_BufferHandler -> initBuffer();
184  m_Buffers[1] = m_BufferHandler -> initBuffer();
185  m_Buffers[2] = m_BufferHandler -> initBuffer();
186  m_ResetBuffers[0] = false;
187  m_ResetBuffers[1] = false;
188  m_ResetBuffers[2] = false;
189  }
190 
194  ICL_DELETE(m_Buffers[0]);
195  ICL_DELETE(m_Buffers[1]);
196  ICL_DELETE(m_Buffers[2]);
197  }
198 
200 
206  if(m_Avail){
207  // new buffer is available.
208  std::swap(m_Next, m_Read);
209  m_Avail = false;
210  }
211  return m_Buffers[m_Read];
212  }
213 
215 
229  T* getNextReadBuffer(bool omit_double_frames=false,
230  int omit_max_wait_millis=1000,
231  int omit_sleep_micros=1000){
232  T* tmp = NULL;
234  while (true){
235  m_Mutex.lock();
236  if(m_Avail){
237  // new buffer is available.
238  std::swap(m_Next, m_Read);
239  m_Avail = false;
240  tmp = m_Buffers[m_Read];
241  m_Mutex.unlock();
242  break;
243  } else if(!omit_double_frames){
244  tmp = m_Buffers[m_Read];
245  m_Mutex.unlock();
246  break;
247  }
248  m_Mutex.unlock();
249  if(t.age().toMilliSeconds() > omit_max_wait_millis){
250  break;
251  }
252  utils::Thread::usleep(omit_sleep_micros);
253  }
254  return tmp;
255  }
256 
258 
264  // swap write buffer and next buffer.
265  std::swap(m_Next, m_Write);
266  // new buffer is available for reading.
267  m_Avail = true;
268  // reset buffer when needed
269  if(m_ResetBuffers[m_Write]){
271  m_Buffers[m_Write] = m_BufferHandler -> initBuffer();
272  m_ResetBuffers[m_Write] = false;
273  }
274  // return new write buffer.
275  return m_Buffers[m_Write];
276  }
277 
279  void setReset(){
281  m_ResetBuffers[0] = true;
282  m_ResetBuffers[1] = true;
283  m_ResetBuffers[2] = true;
284  }
285 
289  m_BufferHandler = new_handler;
290  m_ResetBuffers[0] = true;
291  m_ResetBuffers[1] = true;
292  m_ResetBuffers[2] = true;
293  }
294 
296  bool newAvailable(){
298  return m_Avail;
299  }
300 
301  private:
305  T* m_Buffers[3];
307  bool m_ResetBuffers[3];
311  int m_Write;
313  int m_Next;
315  int m_Read;
317  bool m_Avail;
318  };
319 
322  private:
324  OpenNIContext();
325 
327  ~OpenNIContext();
328 
330  static OpenNIContext* getInst();
331 
332  public:
333 
335  static XnStatus waitAndUpdate();
336 
338  static XnStatus CreateProductionTree(xn::NodeInfo& Tree, xn::ProductionNode& node);
339 
341  static XnStatus EnumerateProductionTrees(XnProductionNodeType type,
342  const xn::Query* pQuery,
343  xn::NodeInfoList& TreesList,
344  xn::EnumerationErrors* pErrors = NULL);
345 
347  static XnStatus Create(xn::DepthGenerator* generator);
348 
349  private:
355  xn::Context m_Context;
356  };
357 
360  public:
362  MapGeneratorOptions(xn::MapGenerator* generator);
363 
366 
368  void addGeneralIntProperty(const std::string name);
369 
370  private:
372  xn::MapGenerator* m_Generator;
374  std::vector<std::string> m_Capabilities;
376  std::map<std::string, xn::ProductionNode> m_ProductionNodeMap;
377  };
378 
381  public:
383  DepthGeneratorOptions(xn::DepthGenerator* generator);
384 
387 
388  private:
390  xn::DepthGenerator* m_DepthGenerator;
391  };
392 
395  public:
397  ImageGeneratorOptions(xn::ImageGenerator* generator);
398 
401 
402  private:
404  xn::ImageGenerator* m_ImageGenerator;
405  };
406 
408  class OpenNIMapGenerator : public ReadWriteBufferHandler<core::ImgBase> {
409  public:
410 
412  enum Generators {
415  IR,
417  };
418 
420  virtual bool acquireImage(core::ImgBase* dest) = 0;
422  virtual bool newFrameAvailable() = 0;
424  virtual Generators getGeneratorType() = 0;
426  virtual xn::MapGenerator* getMapGenerator() = 0;
428  virtual core::ImgBase* initBuffer() = 0;
431 
432 
434  static OpenNIMapGenerator* createGenerator(std::string id);
436  static std::string getMapOutputModeInfo(xn::MapGenerator* gen);
438  static std::string getCurrentMapOutputMode(xn::MapGenerator* gen);
439  };
440 
443  public:
445  OpenNIDepthGenerator(int num);
448 
450  bool acquireImage(core::ImgBase* dest);
452  bool newFrameAvailable();
456  xn::MapGenerator* getMapGenerator();
461 
462  private:
464  xn::DepthGenerator* m_DepthGenerator;
466  xn::DepthMetaData m_DepthMD;
470  unsigned int m_FrameId;
471  };
472 
475  public:
477  OpenNIRgbGenerator(int num);
480 
482  bool acquireImage(core::ImgBase* dest);
484  bool newFrameAvailable();
488  xn::MapGenerator* getMapGenerator();
493 
494  private:
496  xn::NodeInfo* m_DeviceInfo = NULL;
498  xn::ImageGenerator* m_RgbGenerator = NULL;
500  unsigned int m_FrameId;
502 
506  xn::DepthGenerator* m_DepthGenerator = NULL;
507  xn::IRGenerator* m_IrGenerator = NULL;
509  xn::ImageMetaData m_RgbMD;
512  };
513 
516  public:
518  OpenNIIRGenerator(int num);
521 
523  bool acquireImage(core::ImgBase* dest);
525  bool newFrameAvailable();
529  xn::MapGenerator* getMapGenerator();
534 
535  private:
537  xn::NodeInfo* m_DeviceInfo;
539  xn::IRGenerator* m_IrGenerator;
541  xn::IRMetaData m_IrMD;
545  unsigned int m_FrameId;
546  };
547 
548  } // namespace icl_openni
549 
550  } // namespace io
551 } // namespace icl
552 
void setReset()
mark buffers to be reset on next write-access.
Definition: OpenNIUtils.h:279
static XnStatus EnumerateProductionTrees(XnProductionNodeType type, const xn::Query *pQuery, xn::NodeInfoList &TreesList, xn::EnumerationErrors *pErrors=NULL)
calls EnumerateProductionTrees on the internal OpenNI context.
IR Image Generator.
Definition: OpenNIUtils.h:515
This is used for concurrent writing and reading of Buffers.
Definition: OpenNIUtils.h:175
abstract super-class of all Image generators
Definition: OpenNIUtils.h:408
undocument this line if you encounter any issues!
Definition: Any.h:37
Class interface for un-copyable classes.
Definition: Uncopyable.h:64
static std::string getMapOutputModeInfo(xn::MapGenerator *gen)
creates an info string for MapOutputModes of MapGenerator gen.
void unlock()
unlocks the mutex
Definition: Mutex.h:111
~OpenNIDepthGenerator()
Destructor frees all resouurces.
value_type toMilliSeconds() const
Ipp8u icl8u
8Bit unsigned integer type for the ICL
Definition: BasicTypes.h:64
Generators getGeneratorType()
tells the type of the Generator
MapGeneratorOptions * getMapGeneratorOptions()
getter for MapGeneratorOptions
core::Img8u * convertGrayScale8Img(xn::ImageMetaData *src, core::Img8u *dst)
Definition: OpenNIUtils.h:148
Generators getGeneratorType()
tells the type of the Generator
virtual core::ImgBase * initBuffer()=0
Creates an core::ImgBase for ReadWriteBuffer.
unsigned int m_FrameId
the id of the last grabbed frame
Definition: OpenNIUtils.h:545
xn::NodeInfo * m_DeviceInfo
A NodeInfo for the used device.
Definition: OpenNIUtils.h:496
ICLCore_API void cc_util_yuv_to_rgb(const icl32s y, const icl32s u, const icl32s v, icl32s &r, icl32s &g, icl32s &b)
converts given (y,u,v) pixel into the rgb format
T * m_Buffers[3]
current objects which alternately are read and written.
Definition: OpenNIUtils.h:305
xn::IRGenerator * m_IrGenerator
the underlying it-image generator
Definition: OpenNIUtils.h:539
this class interprets and sets Properties of OpenNI DepthGenerators
Definition: OpenNIUtils.h:380
ReadWriteBufferHandler< T > * m_BufferHandler
the handler used to create new buffers
Definition: OpenNIUtils.h:303
ICL Time class (taken from the Ice lib)
Definition: Time.h:52
static void usleep(unsigned int usec)
just calling usleep
MapGeneratorOptions * m_Options
pointer to internally used MapGeneratorOptions
Definition: OpenNIUtils.h:511
bool acquireImage(core::ImgBase *dest)
grab function grabs an image returns whether grabbing worked
xn::Context m_Context
The internal context object.
Definition: OpenNIUtils.h:355
xn::IRGenerator * m_IrGenerator
Definition: OpenNIUtils.h:507
ReadWriteBuffer(ReadWriteBufferHandler< T > *buffer_handler)
Constructor creates and initializes resources.
Definition: OpenNIUtils.h:178
core::Img8u * convertYuv422Img(xn::ImageMetaData *src, core::Img8u *dst)
Definition: OpenNIUtils.h:121
bool acquireImage(core::ImgBase *dest)
grab function grabs an image returns whether grabbing worked
A Context object encapsulating the OpenNI-Context-object.
Definition: OpenNIUtils.h:321
~OpenNIRgbGenerator()
Destructor frees all resouurces.
std::vector< std::string > m_Capabilities
A vector holding all capabilities of the MapGenerator.
Definition: OpenNIUtils.h:374
void addGeneralIntProperty(const std::string name)
adds a general int capability as property
OpenNIContext()
This is a singleton class so Constructor is private.
xn::ImageMetaData m_RgbMD
a ImagehMetaData object holding image information
Definition: OpenNIUtils.h:509
~OpenNIContext()
releases the corresponding OpenNI context object.
std::map< std::string, xn::ProductionNode > m_ProductionNodeMap
A Map Holding all used ProductionNodes.
Definition: OpenNIUtils.h:376
virtual xn::MapGenerator * getMapGenerator()=0
returns underlying xn::MapGenerator instance
bool acquireImage(core::ImgBase *dest)
grab function grabs an image returns whether grabbing worked
T * getNextWriteBuffer()
returns a pointer to the next write Buffer.
Definition: OpenNIUtils.h:262
Time age() const
Definition: Time.h:99
~OpenNIIRGenerator()
Destructor frees all resouurces.
core::ImgBase * initBuffer()
Creates an core::Img16s for ReadWriteBuffer.
xn::MapGenerator * getMapGenerator()
returns underlying xn::MapGenerator instance
bool m_Initialized
Tells whether the internal context in initialized or not.
Definition: OpenNIUtils.h:353
void processPropertyChange(const utils::Configurable::Property &prop)
callback for changed configurable properties
~ReadWriteBuffer()
Destructor frees allocated memory.
Definition: OpenNIUtils.h:192
T * getNextReadBuffer()
returns a pointer to the most recent actualized buffer.
Definition: OpenNIUtils.h:204
virtual MapGeneratorOptions * getMapGeneratorOptions()=0
getter for MapGeneratorOptions
Generators
an enum listing all supported data generators
Definition: OpenNIUtils.h:412
static XnStatus waitAndUpdate()
calls waitAnyUpdateAll on the internal OpenNI context.
static Time now()
xn::DepthGenerator * m_DepthGenerator
the underlying core::depth generator
Definition: OpenNIUtils.h:464
ICLQt_API ImgROI data(ImgQ &r)
creates full ROI ROI-struct
Generators getGeneratorType()
tells the type of the Generator
Ipp32s icl32s
32bit signed integer type for the ICL
Definition: BasicTypes.h:58
static OpenNIMapGenerator * createGenerator(std::string id)
Creates the corresponding Generator.
core::Img8u * convertRGBImg(xn::ImageMetaData *src, core::Img8u *dst)
Definition: OpenNIUtils.h:96
MapGeneratorOptions * getMapGeneratorOptions()
getter for MapGeneratorOptions
xn::MapGenerator * getMapGenerator()
returns underlying xn::MapGenerator instance
unsigned int m_FrameId
the id of the last grabbed frame
Definition: OpenNIUtils.h:470
MapGeneratorOptions * m_Options
pointer to internally used MapGeneratorOptions
Definition: OpenNIUtils.h:468
int m_Write
the object currently written to.
Definition: OpenNIUtils.h:311
bool newAvailable()
tells whether a new ConvBuffers is available
Definition: OpenNIUtils.h:296
Depth Image Generator.
Definition: OpenNIUtils.h:442
MapGeneratorOptions * m_Options
pointer to internally used MapGeneratorOptions
Definition: OpenNIUtils.h:543
virtual bool acquireImage(core::ImgBase *dest)=0
grab function grabs an image returns whether grabbing worked
Size class of the ICL.
Definition: Size.h:61
core::Img16s * convertIRImg(xn::IRMetaData *src, core::Img16s *dst)
fills an core::Img16s from OpenNI IRMetaData
Definition: OpenNIUtils.h:79
this class interprets and sets Properties of OpenNI MapGenerators
Definition: OpenNIUtils.h:359
bool newFrameAvailable()
checks whether a new frame is available
xn::ImageGenerator * m_ImageGenerator
the used ImageGenerator
Definition: OpenNIUtils.h:404
bool m_ResetBuffers[3]
a bool for every buffer telling whether it needs a reset
Definition: OpenNIUtils.h:307
RGB Image Generator.
Definition: OpenNIUtils.h:474
xn::DepthGenerator * m_DepthGenerator
the underlying core::depth generator
Definition: OpenNIUtils.h:506
core::Img8u * initBuffer()
Creates an core::Img8u for ReadWriteBuffer.
xn::DepthMetaData m_DepthMD
a DepthMetaData object holding image information
Definition: OpenNIUtils.h:466
virtual bool newFrameAvailable()=0
checks whether a new frame is available
void processPropertyChange(const utils::Configurable::Property &prop)
callback for changed configurable properties
virtual Generators getGeneratorType()=0
tells the type of the Generator
Property & prop(const std::string &propertyName)
this CAN be used e.g. to store a property value in internal property-list
this class interprets and sets Properties of OpenNI ImageGenerators
Definition: OpenNIUtils.h:394
bool m_Avail
tells whether an actualized object was written.
Definition: OpenNIUtils.h:317
xn::DepthGenerator * m_DepthGenerator
the used DepthGenerator
Definition: OpenNIUtils.h:390
utils::Mutex m_Lock
Lock for thread safety.
Definition: OpenNIUtils.h:351
utils::Mutex m_Mutex
the mutex is used for concurrent reading and writing.
Definition: OpenNIUtils.h:309
xn::MapGenerator * getMapGenerator()
returns underlying xn::MapGenerator instance
xn::NodeInfo * m_DeviceInfo
A NodeInfo for the used device.
Definition: OpenNIUtils.h:537
OpenNIRgbGenerator(int num)
Creates RgbGenerator number num from Context.
Interface for classes that can be configured from configuration-files and GUI-Components.
Definition: Configurable.h:194
static std::string getCurrentMapOutputMode(xn::MapGenerator *gen)
creates a string describing the current MapOutputMode
xn::IRMetaData m_IrMD
a ImagehMetaData object holding image information
Definition: OpenNIUtils.h:541
xn::MapGenerator * m_Generator
the used MapGenerator
Definition: OpenNIUtils.h:372
MapGeneratorOptions(xn::MapGenerator *generator)
constructor
static OpenNIContext * getInst()
initializes the context. only used internally.
void switchHandler(ReadWriteBufferHandler< T > *new_handler)
switches the handler
Definition: OpenNIUtils.h:287
OpenNIDepthGenerator(int num)
Creates DepthGenerator number num from Context.
MapGeneratorOptions * getMapGeneratorOptions()
getter for MapGeneratorOptions
Definition: Types.h:71
#define ICL_DELETE(X)
Definition: Macros.h:242
int m_Next
the write object currently not written to.
Definition: OpenNIUtils.h:313
void processPropertyChange(const utils::Configurable::Property &prop)
callback for changed configurable properties
bool newFrameAvailable()
checks whether a new frame is available
unsigned int m_FrameId
the id of the last grabbed frame
Definition: OpenNIUtils.h:500
T * getNextReadBuffer(bool omit_double_frames=false, int omit_max_wait_millis=1000, int omit_sleep_micros=1000)
returns pointer to most recent buffer.
Definition: OpenNIUtils.h:229
static XnStatus CreateProductionTree(xn::NodeInfo &Tree, xn::ProductionNode &node)
calls CreateProductionTree on the internal OpenNI context.
Represents a single property.
Definition: Configurable.h:200
DepthGeneratorOptions(xn::DepthGenerator *generator)
constructor
bool newFrameAvailable()
checks whether a new frame is available
Ipp16s icl16s
16bit signed integer type for the ICL (range [-32767, 32768 ])
Definition: BasicTypes.h:61
virtual T * initBuffer()=0
creates an instance of T and returns a pointer. passes ownership.
static XnStatus Create(xn::DepthGenerator *generator)
calls Create on the internal OpenNI context.
Mutex class of the ICL.
Definition: Mutex.h:54
A BufferHandlers only task is to create T's.
Definition: OpenNIUtils.h:163
Definition: OpenNIUtils.h:415
core::Img16s * initBuffer()
Creates an core::Img8u for ReadWriteBuffer.
ImageGeneratorOptions(xn::ImageGenerator *generator)
constructor
ImgBase is the Image-Interface class that provides save access to underlying Img-template .
Definition: ImgBase.h:131
Locks a mutex on the stack (mutex is unlocked when the stack's section is released.
Definition: Mutex.h:120
xn::ImageGenerator * m_RgbGenerator
the underlying rgb-image generator
Definition: OpenNIUtils.h:498
OpenNIIRGenerator(int num)
Creates IRGenerator number num from Context.
Definition: Types.h:72
void lock()
locks the mutex
Definition: Mutex.h:91
int m_Read
the object currently read from.
Definition: OpenNIUtils.h:315
core::Img< T > * convertDepthImg(xn::DepthMetaData *src, core::Img< T > *dst)
fills an core::core::Img<T> from OpenNI DepthMetaData
Definition: OpenNIUtils.h:52