当前OpenNI中的算法算法主要用处是,在使用OpenNI.h文件中的Recorder类录制ONI格式的视频文件时,对保存到ONI视频文件中的每一帧数据进行压缩。录制功能基本上是有Openni中的OniFile模块完成的。openni2.3\Source\Drivers\OniFile,Openni发布的时候,在OpenNI2/Drivers文件夹下除了orbbec的动态库,还有OniFile的动态库,这个动态库的作用就是完成图像的录制及压缩相关的功能。

先上一张当前Openni压缩模块的类图。

OpenNI中的压缩算法的总结

 

如上类图,XnCodec类是编解码的虚基类。里面最重要的两个纯虚函数是Compress(压缩),Decompress(解压缩)。XnCodecBase类是继承XnCodec类的虚基类,其以模板函数的方法实现了XnCodec类的两个纯虚函数Compress和Decompress。并且在实现过程中引入了另外两个XnCodecBase类的纯虚函数,CompressImpl及DecompressImpl。具体的压缩算法虚继承XnCodecBase类,并且实现CompressImpl及DecompressImpl方法。如上类图中最下面的五个类XnUncompressedCodec, Xn16zEmbTablesCodec,XnJpegCodec, Xn8zCodec及Xn16zCodec

类是实现了五个具体压缩算法的派生类。XnUncompressedCodec表示不进行压缩,Xn16zEmbTablesCodec当前用来对深度图进行压缩,XnJpegCodec类底层调用了libjpeg这个库,用来对rgb图像进行压缩。剩下的Xn8zCodec类与Xn16zCodec类,当前Openni master分支中没有使用。如何指定什么格式的图像使用什么压缩算法?OpenNI源码中有一个FileRecorder类,该类有一个FileRecorder::onAttach(XnUInt32 nodeId, VideoStream* pStream)方法,可以在该方法中指定针对不同的Pixel Format:如下

typedef enum
{
// Depth
ONI_PIXEL_FORMAT_DEPTH_1_MM = 100,
ONI_PIXEL_FORMAT_DEPTH_100_UM = 101,
ONI_PIXEL_FORMAT_SHIFT_9_2 = 102,
ONI_PIXEL_FORMAT_SHIFT_9_3 = 103,

// Color
ONI_PIXEL_FORMAT_RGB888 = 200,
ONI_PIXEL_FORMAT_YUV422 = 201,
ONI_PIXEL_FORMAT_GRAY8 = 202,
ONI_PIXEL_FORMAT_GRAY16 = 203,
ONI_PIXEL_FORMAT_JPEG = 204,
ONI_PIXEL_FORMAT_YUYV = 205,
} OniPixelFormat;

使用不同的压缩算法进行处理,如果需要对ONI_PIXEL_FORMAT_GRAY16 16位IR图进行处理,则只需要给ONI_PIXEL_FORMAT_GRAY16格式指定一个编解码的类就可以了。经过测试Xn16zCodec可以用来对16位的IR图像进行压缩,解压缩,但是压缩率不是很高,大概40%左右。如果想使用新的定制的编解码类对图像进行压缩,解压缩的处理,则可以XnDodecBase类派生出新的类。比如这次对16位IR图像进行压缩的过程中,就从XnDodecBase类派生出一个类XnJpeg16IrCodec,该类在编解码的过程中使用了libjpeg,压缩率可以通过调节控制在百分之几到百分之十几之间。

        Recorder类有一个方法attachStream,该方法的作用是将创建的Recorder类的对象保存在VideoStream类的m_recorders的哈希表中。在添加recorder之后,当VideoStream流中有数据帧到来时先对该帧进行录制,然后才对数据帧进行进一步的处理,最后用户才能获取到流。所以ONI视频的录制当前和出流的流程当前是绑定在一起的。

相关文章:

  • 2021-12-13
  • 2021-07-01
  • 2022-12-23
  • 2022-12-23
  • 2022-02-09
  • 2021-12-02
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-01
  • 2022-12-23
  • 2022-12-23
  • 2021-04-12
  • 2021-10-16
相关资源
相似解决方案