Commit 3df533ac158b154c998f80c1f9782350f70fc0b0

Authored by Josh Klontz
1 parent 32bac187

final breaking refactor of utGallery

openbr/plugins/gallery/binary.cpp
@@ -204,154 +204,27 @@ BR_REGISTER(Gallery, galGallery) @@ -204,154 +204,27 @@ BR_REGISTER(Gallery, galGallery)
204 * \brief A contiguous array of br_universal_template. 204 * \brief A contiguous array of br_universal_template.
205 * \author Josh Klontz \cite jklontz 205 * \author Josh Klontz \cite jklontz
206 */ 206 */
207 -class utGallery : public BinaryGallery 207 +class tGallery : public BinaryGallery
208 { 208 {
209 Q_OBJECT 209 Q_OBJECT
210 210
211 Template readTemplate() 211 Template readTemplate()
212 { 212 {
213 - Template t;  
214 - br_universal_template ut;  
215 - if (gallery.read((char*)&ut, sizeof(br_universal_template)) == sizeof(br_universal_template)) {  
216 - QByteArray data(ut.mdSize + ut.fvSize, Qt::Uninitialized);  
217 - char *dst = data.data();  
218 - qint64 bytesNeeded = ut.mdSize + ut.fvSize;  
219 - while (bytesNeeded > 0) {  
220 - qint64 bytesRead = gallery.read(dst, bytesNeeded);  
221 - if (bytesRead <= 0) {  
222 - qDebug() << gallery.errorString();  
223 - qFatal("Unexepected EOF while reading universal template data, needed: %d more of: %d bytes.", int(bytesNeeded), int(ut.mdSize + ut.fvSize));  
224 - }  
225 - bytesNeeded -= bytesRead;  
226 - dst += bytesRead;  
227 - }  
228 -  
229 - t.file.set("AlgorithmID", ut.algorithmID);  
230 - t.file.set("Metadata", QString(data.data()));  
231 - char *dataStart = data.data() + ut.mdSize;  
232 - uint32_t dataSize = ut.fvSize;  
233 - if ((ut.algorithmID <= -1) && (ut.algorithmID >= -3)) {  
234 - t.file.set("FrontalFace", QRectF(ut.x, ut.y, ut.width, ut.height));  
235 - uint32_t *rightEyeX = reinterpret_cast<uint32_t*>(dataStart);  
236 - dataStart += sizeof(uint32_t);  
237 - uint32_t *rightEyeY = reinterpret_cast<uint32_t*>(dataStart);  
238 - dataStart += sizeof(uint32_t);  
239 - uint32_t *leftEyeX = reinterpret_cast<uint32_t*>(dataStart);  
240 - dataStart += sizeof(uint32_t);  
241 - uint32_t *leftEyeY = reinterpret_cast<uint32_t*>(dataStart);  
242 - dataStart += sizeof(uint32_t);  
243 - dataSize -= sizeof(uint32_t)*4;  
244 - t.file.set("First_Eye", QPointF(*rightEyeX, *rightEyeY));  
245 - t.file.set("Second_Eye", QPointF(*leftEyeX, *leftEyeY));  
246 - } else if (ut.algorithmID == 7) {  
247 - // binary data consisting of a single channel matrix, of a supported type.  
248 - // 4 element header:  
249 - // uint16 datatype (single channel opencv datatype code)  
250 - // uint32 matrix rows  
251 - // uint32 matrix cols  
252 - // uint16 matrix depth (max 512)  
253 - // Followed by serialized data, in row-major order (in r/c), with depth values  
254 - // for each layer listed in order (i.e. rgb, rgb etc.)  
255 - // #### NOTE! matlab's default order is col-major, so some work should  
256 - // be done on the matlab side to make sure that the initial serialization is correct.  
257 - uint16_t dataType = *reinterpret_cast<uint32_t*>(dataStart);  
258 - dataStart += sizeof(uint16_t);  
259 -  
260 - uint32_t matrixRows = *reinterpret_cast<uint32_t*>(dataStart);  
261 - dataStart += sizeof(uint32_t);  
262 -  
263 - uint32_t matrixCols = *reinterpret_cast<uint32_t*>(dataStart);  
264 - dataStart += sizeof(uint32_t);  
265 -  
266 - uint16_t matrixDepth= *reinterpret_cast<uint16_t*>(dataStart);  
267 - dataStart += sizeof(uint16_t);  
268 -  
269 - // Set metadata  
270 - t.file.set("X", ut.x);  
271 - t.file.set("Y", ut.y);  
272 - t.file.set("Width", ut.width);  
273 - t.file.set("Height", ut.height);  
274 - t.file.set("Confidence", ut.confidence);  
275 -  
276 - t.append(cv::Mat(matrixRows, matrixCols, CV_MAKETYPE(dataType, matrixDepth), dataStart).clone() /* We don't want a shallow copy! */);  
277 - return t;  
278 - } else {  
279 - t.file.set("X", ut.x);  
280 - t.file.set("Y", ut.y);  
281 - t.file.set("Width", ut.width);  
282 - t.file.set("Height", ut.height);  
283 - t.file.set("Confidence", ut.confidence);  
284 - }  
285 - t.append(cv::Mat(1, dataSize, CV_8UC1, dataStart).clone() /* We don't want a shallow copy! */);  
286 - } else {  
287 - if (!gallery.atEnd())  
288 - qWarning("Failed to read universal template header!");  
289 - gallery.close();  
290 - } 213 + const br_const_utemplate ut = Template::readUniversalTemplate(gallery);
  214 + const Template t = Template::fromUniversalTemplate(ut);
  215 + Template::freeUniversalTemplate(ut);
291 return t; 216 return t;
292 } 217 }
293 218
294 void writeTemplate(const Template &t) 219 void writeTemplate(const Template &t)
295 { 220 {
296 - const int32_t algorithmID = (t.isEmpty() || t.file.fte) ? 0 : t.file.get<int32_t>("AlgorithmID");  
297 -  
298 - // QUrl::fromUserInput provides some nice functionality in terms of completing URLs  
299 - // e.g. C:/test.jpg -> file://C:/test.jpg and google.com/image.jpg -> http://google.com/image.jpg  
300 - const QByteArray metadata = QUrl::fromUserInput(t.file.get<QString>("URL", t.file.name)).toEncoded();  
301 -  
302 - int32_t x = 0, y = 0;  
303 - uint32_t width = 0, height = 0;  
304 - float confidence = 0;  
305 - QByteArray header;  
306 - if ((algorithmID <= -1) && (algorithmID >= -3)) {  
307 - const QRectF frontalFace = t.file.get<QRectF>("FrontalFace");  
308 - x = frontalFace.x();  
309 - y = frontalFace.y();  
310 - width = frontalFace.width();  
311 - height = frontalFace.height();  
312 -  
313 - const QPointF firstEye = t.file.get<QPointF>("First_Eye");  
314 - const QPointF secondEye = t.file.get<QPointF>("Second_Eye");  
315 - const uint32_t rightEyeX = firstEye.x();  
316 - const uint32_t rightEyeY = firstEye.y();  
317 - const uint32_t leftEyeX = secondEye.x();  
318 - const uint32_t leftEyeY = secondEye.y();  
319 -  
320 - header.append((const char*)&rightEyeX, sizeof(uint32_t));  
321 - header.append((const char*)&rightEyeY, sizeof(uint32_t));  
322 - header.append((const char*)&leftEyeX , sizeof(uint32_t));  
323 - header.append((const char*)&leftEyeY , sizeof(uint32_t));  
324 - } else {  
325 - x = t.file.get<int32_t>("X", 0);  
326 - y = t.file.get<int32_t>("Y", 0);  
327 - width = t.file.get<uint32_t>("Width", 0);  
328 - height = t.file.get<uint32_t>("Height", 0);  
329 - confidence = t.file.get<uint32_t>("Confidence", 0);  
330 - }  
331 -  
332 - gallery.write((const char*) &algorithmID, sizeof(int32_t));  
333 - gallery.write((const char*) &x , sizeof(int32_t));  
334 - gallery.write((const char*) &y , sizeof(int32_t));  
335 - gallery.write((const char*) &width , sizeof(uint32_t));  
336 - gallery.write((const char*) &height , sizeof(uint32_t));  
337 - gallery.write((const char*) &confidence , sizeof(float));  
338 -  
339 - const uint32_t mdSize = metadata.size() + 1;  
340 - gallery.write((const char*) &mdSize, sizeof(uint32_t));  
341 -  
342 - const uint32_t signatureSize = (algorithmID == 0) ? 0 : t.m().rows * t.m().cols * t.m().elemSize();  
343 - const uint32_t fvSize = header.size() + signatureSize;  
344 - gallery.write((const char*) &fvSize, sizeof(uint32_t));  
345 -  
346 - gallery.write((const char*) metadata.data(), mdSize);  
347 - if (algorithmID != 0) {  
348 - gallery.write(header);  
349 - gallery.write((const char*) t.m().data, signatureSize);  
350 - } 221 + const br_utemplate ut = Template::toUniversalTemplate(t);
  222 + gallery.write((const char*) ut, sizeof(br_universal_template) + ut->mdSize + ut->fvSize);
  223 + Template::freeUniversalTemplate(ut);
351 } 224 }
352 }; 225 };
353 226
354 -BR_REGISTER(Gallery, utGallery) 227 +BR_REGISTER(Gallery, tGallery)
355 228
356 /*! 229 /*!
357 * \ingroup galleries 230 * \ingroup galleries