mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 17:40:23 +08:00
add support for RVL depth image compression (#1409)
* add rvl_codec * add support for RVL deep image compression * DBViewer: edit depth re-using same compression format than the one in database. * Fixing windows ci * 💄 * missing dll export (windows) * typo --------- Co-authored-by: matlabbe <matlabbe@gmail.com>
This commit is contained in:
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines
|
||||
|
||||
#include <rtabmap/core/rvl_codec.h>
|
||||
#include <rtabmap/utilite/UThread.h>
|
||||
#include <opencv2/opencv.hpp>
|
||||
|
||||
@@ -86,5 +87,9 @@ cv::Mat RTABMAP_CORE_EXPORT uncompressData(const unsigned char * bytes, unsigned
|
||||
cv::Mat RTABMAP_CORE_EXPORT compressString(const std::string & str);
|
||||
std::string RTABMAP_CORE_EXPORT uncompressString(const cv::Mat & bytes);
|
||||
|
||||
std::string RTABMAP_CORE_EXPORT compressedDepthFormat(const cv::Mat & bytes);
|
||||
std::string RTABMAP_CORE_EXPORT compressedDepthFormat(const std::vector<unsigned char> & bytes);
|
||||
std::string RTABMAP_CORE_EXPORT compressedDepthFormat(const unsigned char * bytes, size_t size);
|
||||
|
||||
} /* namespace rtabmap */
|
||||
#endif /* COMPRESSION_H_ */
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
int nodeId,
|
||||
const std::vector<CameraModel> & models,
|
||||
const std::vector<StereoCameraModel> & stereoModels);
|
||||
void updateDepthImage(int nodeId, const cv::Mat & image);
|
||||
void updateDepthImage(int nodeId, const cv::Mat & image, const std::string & format);
|
||||
void updateLaserScan(int nodeId, const LaserScan & scan);
|
||||
|
||||
public:
|
||||
@@ -243,7 +243,8 @@ protected:
|
||||
|
||||
virtual void updateDepthImageQuery(
|
||||
int nodeId,
|
||||
const cv::Mat & image) const = 0;
|
||||
const cv::Mat & image,
|
||||
const std::string & format) const = 0;
|
||||
|
||||
virtual void updateLaserScanQuery(
|
||||
int nodeId,
|
||||
|
||||
@@ -103,7 +103,8 @@ protected:
|
||||
|
||||
virtual void updateDepthImageQuery(
|
||||
int nodeId,
|
||||
const cv::Mat & image) const;
|
||||
const cv::Mat & image,
|
||||
const std::string & format) const;
|
||||
|
||||
void updateLaserScanQuery(
|
||||
int nodeId,
|
||||
@@ -173,7 +174,7 @@ private:
|
||||
void stepImage(sqlite3_stmt * ppStmt, int id, const cv::Mat & imageBytes) const;
|
||||
void stepDepth(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
||||
void stepCalibrationUpdate(sqlite3_stmt * ppStmt, int nodeId, const std::vector<CameraModel> & models, const std::vector<StereoCameraModel> & stereoModels) const;
|
||||
void stepDepthUpdate(sqlite3_stmt * ppStmt, int nodeId, const cv::Mat & imageCompressed) const;
|
||||
void stepDepthUpdate(sqlite3_stmt * ppStmt, int nodeId, const cv::Mat & image, const std::string & format) const;
|
||||
void stepScanUpdate(sqlite3_stmt * ppStmt, int nodeId, const LaserScan & image) const;
|
||||
void stepSensorData(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
||||
void stepLink(sqlite3_stmt * ppStmt, const Link & link) const;
|
||||
|
||||
@@ -303,6 +303,7 @@ private:
|
||||
bool _notLinkedNodesKeptInDb;
|
||||
bool _saveIntermediateNodeData;
|
||||
std::string _rgbCompressionFormat;
|
||||
std::string _depthCompressionFormat;
|
||||
bool _incrementalMemory;
|
||||
bool _localizationDataSaved;
|
||||
bool _reduceGraph;
|
||||
|
||||
@@ -209,6 +209,7 @@ class RTABMAP_CORE_EXPORT Parameters
|
||||
RTABMAP_PARAM(Mem, NotLinkedNodesKept, bool, true, "Keep not linked nodes in db (rehearsed nodes and deleted nodes).");
|
||||
RTABMAP_PARAM(Mem, IntermediateNodeDataKept, bool, false, "Keep intermediate node data in db.");
|
||||
RTABMAP_PARAM_STR(Mem, ImageCompressionFormat, ".jpg", "RGB image compression format. It should be \".jpg\" or \".png\".");
|
||||
RTABMAP_PARAM_STR(Mem, DepthCompressionFormat, ".rvl", "Depth image compression format for 16UC1 depth type. It should be \".png\" or \".rvl\". If depth type is 32FC1, \".png\" is used.");
|
||||
RTABMAP_PARAM(Mem, STMSize, unsigned int, 10, "Short-term memory size.");
|
||||
RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, otherwise it is Localization mode.");
|
||||
RTABMAP_PARAM(Mem, LocalizationDataSaved, bool, false, uFormat("Save localization data during localization session (when %s=false). When enabled, the database will then also grow in localization mode. This mode would be used only for debugging purpose.", kMemIncrementalMemory().c_str()).c_str());
|
||||
|
||||
37
corelib/include/rtabmap/core/rvl_codec.h
Normal file
37
corelib/include/rtabmap/core/rvl_codec.h
Normal file
@@ -0,0 +1,37 @@
|
||||
// The following code is a C++ wrapper of the code presented by
|
||||
// Andrew D. Wilson in "Fast Lossless Depth Image Compression" at SIGCHI'17.
|
||||
// The original code is licensed under the MIT License.
|
||||
|
||||
#ifndef RVL_CODEC_H_
|
||||
#define RVL_CODEC_H_
|
||||
|
||||
#include <cstdint>
|
||||
#include "rtabmap/core/rtabmap_core_export.h"
|
||||
|
||||
namespace rtabmap
|
||||
{
|
||||
|
||||
class RTABMAP_CORE_EXPORT RvlCodec {
|
||||
public:
|
||||
RvlCodec();
|
||||
// Compress input data into output. The size of output can be equal to (1.5 * numPixels + 4) in the worst case.
|
||||
int CompressRVL(const uint16_t * input, unsigned char * output, int numPixels);
|
||||
// Decompress input data into output. The size of output must be equal to numPixels.
|
||||
void DecompressRVL(const unsigned char * input, uint16_t * output, int numPixels);
|
||||
|
||||
private:
|
||||
RvlCodec(const RvlCodec &);
|
||||
RvlCodec & operator=(const RvlCodec &);
|
||||
|
||||
void EncodeVLE(int value);
|
||||
int DecodeVLE();
|
||||
|
||||
int *buffer_;
|
||||
int *pBuffer_;
|
||||
int word_;
|
||||
int nibblesWritten_;
|
||||
};
|
||||
|
||||
} // namespace rtabmap
|
||||
|
||||
#endif // RVL_CODEC_H_
|
||||
Reference in New Issue
Block a user