diff --git a/openbr/core/bee.cpp b/openbr/core/bee.cpp index 8682215..940ddf2 100644 --- a/openbr/core/bee.cpp +++ b/openbr/core/bee.cpp @@ -180,16 +180,17 @@ Mat BEE::readMat(const br::File &matrix, QString *targetSigset, QString *querySi return result; } -template -void writeMatrix(const Mat &m, const QString &matrix, const QString &targetSigset, const QString &querySigset) +void BEE::writeMat(const Mat &m, const QString &matrix, const QString &targetSigset, const QString &querySigset) { - if (m.type() != OpenCVType::make()) qFatal("Invalid matrix type."); + bool isMask = false; + if (m.type() == OpenCVType::make()) + isMask = true; + else if (m.type() != OpenCVType::make()) + qFatal("Invalid matrix type, .mtx files can only contain single channel float or uchar matrices."); - int elemSize = sizeof(T); - QString matrixType; - if (elemSize == 1) matrixType = "B"; - else if (elemSize == 4) matrixType = "F"; - else qFatal("Invalid element size."); + int elemSize = isMask ? sizeof(BEE::Mask_t) : sizeof(BEE::Simmat_t); + + QString matrixType = isMask ? "B" : "F"; char buff[4]; QFile file(matrix); @@ -215,16 +216,6 @@ void writeMatrix(const Mat &m, const QString &matrix, const QString &targetSigse file.close(); } -void BEE::writeSimmat(const Mat &m, const QString &simmat, const QString &targetSigset, const QString &querySigset) -{ - writeMatrix(m, simmat, targetSigset, querySigset); -} - -void BEE::writeMask(const Mat &m, const QString &mask, const QString &targetSigset, const QString &querySigset) -{ - writeMatrix(m, mask, targetSigset, querySigset); -} - void BEE::readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset) { qDebug("Reading %s header.", qPrintable(matrix)); @@ -235,8 +226,7 @@ void BEE::writeMatrixHeader(const QString &matrix, const QString &targetSigset, { qDebug("Writing %s header to %s %s.", qPrintable(matrix), qPrintable(targetSigset), qPrintable(querySigset)); - if (matrix.endsWith("mask")) writeMatrix< Mask_t>(readMat(matrix), matrix, targetSigset, querySigset); - else writeMatrix(readMat(matrix), matrix, targetSigset, querySigset); + writeMat(readMat(matrix), matrix, targetSigset, querySigset); } void BEE::makeMask(const QString &targetInput, const QString &queryInput, const QString &mask) @@ -245,11 +235,11 @@ void BEE::makeMask(const QString &targetInput, const QString &queryInput, const FileList targets = TemplateList::fromGallery(targetInput).files(); FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files(); int partitions = targets.first().get("crossValidate"); - if (partitions == 0) writeMask(makeMask(targets, queries), mask, targetInput, queryInput); + if (partitions == 0) writeMat(makeMask(targets, queries), mask, targetInput, queryInput); else { if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)"); for (int i=0; i("crossValidate"); - if (partitions == 0) writeMask(makePairwiseMask(targets, queries), mask, targetInput, queryInput); + if (partitions == 0) writeMat(makePairwiseMask(targets, queries), mask, targetInput, queryInput); else { if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)"); for (int i=0; iread(); // Use a single file for one of the dimensions so that the output makes the right size file - FileList dummyQuery; - dummyQuery.append(targets[0]); - QScopedPointer realOutput(Output::make(output, targetFiles, dummyQuery)); - + FileList dummyTarget; + dummyTarget.append(targets[0]); + QScopedPointer realOutput(Output::make(output, dummyTarget, queryFiles)); + + // Some outputs assume Globals->blockSize is a real thing, of course we have no interest in it. + int old_block_size = Globals->blockSize; + Globals->blockSize = INT_MAX; + realOutput->setBlock(0,0); for (int i=0; i < queries.length(); i++) { float res = distance->compare(queries[i], targets[i]); realOutput->setRelative(res, 0,i); } + + Globals->blockSize = old_block_size; } void compare(File targetGallery, File queryGallery, File output) diff --git a/openbr/core/fuse.cpp b/openbr/core/fuse.cpp index 89306c3..f2a6e53 100644 --- a/openbr/core/fuse.cpp +++ b/openbr/core/fuse.cpp @@ -160,5 +160,5 @@ void br::Fuse(const QStringList &inputSimmats, const QString &normalization, con } while (partition < crossValidate); - BEE::writeSimmat(buffer, outputSimmat); + BEE::writeMat(buffer, outputSimmat); } diff --git a/openbr/plugins/format.cpp b/openbr/plugins/format.cpp index 258a06d..6e0800d 100644 --- a/openbr/plugins/format.cpp +++ b/openbr/plugins/format.cpp @@ -285,7 +285,7 @@ class mtxFormat : public Format void write(const Template &t) const { - BEE::writeSimmat(t, file); + BEE::writeMat(t, file); } }; @@ -307,7 +307,7 @@ class maskFormat : public Format void write(const Template &t) const { - BEE::writeMask(t, file); + BEE::writeMat(t, file); } }; @@ -418,9 +418,7 @@ class matFormat : public Format } if ((rows > 0) && (columns > 0) && (matrixType != 0) && !matrixData.isEmpty()) { - Mat transposed; - transpose(Mat(rows, columns, matrixType, matrixData.data()), transposed); - t.append(transposed); + t.append(Mat(rows, columns, matrixType, matrixData.data())); } } }