28 #ifndef OBJSIGNATURE_H_
29 #define OBJSIGNATURE_H_
31 #include <opencv2/opencv.hpp>
32 #include <QtCore/QString>
33 #include <QtCore/QMultiMap>
34 #include <QtCore/QRect>
35 #include <QtCore/QDataStream>
36 #include <QtCore/QByteArray>
37 #include <QtCore/QFileInfo>
73 void save(QDataStream & streamPtr)
const
78 for(
unsigned int j=0; j<
keypoints_.size(); ++j)
91 qint64 dataSize = bytes.size();
93 if(dataSize <= std::numeric_limits<int>::max())
96 streamPtr << old << old << old << dataSize;
97 streamPtr << QByteArray::fromRawData((
const char*)bytes.data(), dataSize);
101 UERROR(
"Descriptors (compressed) are too large (%d MB) to be saved! Limit is 2 GB (based on max QByteArray size).",
102 dataSize/(1024*1024));
104 streamPtr << old << old << old << old;
105 streamPtr << QByteArray();
112 std::vector<unsigned char> bytes;
113 QString ext = QFileInfo(
filePath_).suffix();
117 cv::imencode(
".png",
image_, bytes);
121 cv::imencode(std::string(
".")+ext.toStdString(),
image_, bytes);
123 streamPtr << QByteArray::fromRawData((
const char*)bytes.data(), (
int)bytes.size());
127 streamPtr << QByteArray();
133 void load(QDataStream & streamPtr,
bool ignoreImage)
138 for(
int i=0;i<nKpts;++i)
152 streamPtr >> rows >> cols >> type >> dataSize;
153 if(rows == 0 && cols == 0 && type == 0)
156 UASSERT(dataSize <= std::numeric_limits<int>::max());
168 descriptors_ = cv::Mat(rows, cols, type, data.data()).clone();
172 UERROR(
"Error reading descriptor data for object=%d",
id_);
180 if(!ignoreImage &&
image.size())
182 std::vector<unsigned char> bytes(
image.size());
183 memcpy(bytes.data(),
image.data(),
image.size());
184 image_ = cv::imdecode(bytes, cv::IMREAD_UNCHANGED);