Commit a2c71854966903e1aaaacba6d20ed8ecafbf4607
1 parent
c3e880e6
Unify BEE::writeSimmat/writeMask
Similar to the read methods, cv::mat contains type information, so there is no particular need for separate methods for masks and similarity matrices. Also, fix an apparent bug where .mat files read by openbr were transposed (compared to their dimensions when writing the files).
Showing
5 changed files
with
30 additions
and
37 deletions
openbr/core/bee.cpp
| @@ -180,16 +180,17 @@ Mat BEE::readMat(const br::File &matrix, QString *targetSigset, QString *querySi | @@ -180,16 +180,17 @@ Mat BEE::readMat(const br::File &matrix, QString *targetSigset, QString *querySi | ||
| 180 | return result; | 180 | return result; |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | -template <typename T> | ||
| 184 | -void writeMatrix(const Mat &m, const QString &matrix, const QString &targetSigset, const QString &querySigset) | 183 | +void BEE::writeMat(const Mat &m, const QString &matrix, const QString &targetSigset, const QString &querySigset) |
| 185 | { | 184 | { |
| 186 | - if (m.type() != OpenCVType<T,1>::make()) qFatal("Invalid matrix type."); | 185 | + bool isMask = false; |
| 186 | + if (m.type() == OpenCVType<BEE::Mask_t,1>::make()) | ||
| 187 | + isMask = true; | ||
| 188 | + else if (m.type() != OpenCVType<BEE::Simmat_t,1>::make()) | ||
| 189 | + qFatal("Invalid matrix type, .mtx files can only contain single channel float or uchar matrices."); | ||
| 187 | 190 | ||
| 188 | - int elemSize = sizeof(T); | ||
| 189 | - QString matrixType; | ||
| 190 | - if (elemSize == 1) matrixType = "B"; | ||
| 191 | - else if (elemSize == 4) matrixType = "F"; | ||
| 192 | - else qFatal("Invalid element size."); | 191 | + int elemSize = isMask ? sizeof(BEE::Mask_t) : sizeof(BEE::Simmat_t); |
| 192 | + | ||
| 193 | + QString matrixType = isMask ? "B" : "F"; | ||
| 193 | 194 | ||
| 194 | char buff[4]; | 195 | char buff[4]; |
| 195 | QFile file(matrix); | 196 | QFile file(matrix); |
| @@ -215,16 +216,6 @@ void writeMatrix(const Mat &m, const QString &matrix, const QString &targetSigse | @@ -215,16 +216,6 @@ void writeMatrix(const Mat &m, const QString &matrix, const QString &targetSigse | ||
| 215 | file.close(); | 216 | file.close(); |
| 216 | } | 217 | } |
| 217 | 218 | ||
| 218 | -void BEE::writeSimmat(const Mat &m, const QString &simmat, const QString &targetSigset, const QString &querySigset) | ||
| 219 | -{ | ||
| 220 | - writeMatrix<Simmat_t>(m, simmat, targetSigset, querySigset); | ||
| 221 | -} | ||
| 222 | - | ||
| 223 | -void BEE::writeMask(const Mat &m, const QString &mask, const QString &targetSigset, const QString &querySigset) | ||
| 224 | -{ | ||
| 225 | - writeMatrix<Mask_t>(m, mask, targetSigset, querySigset); | ||
| 226 | -} | ||
| 227 | - | ||
| 228 | void BEE::readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset) | 219 | void BEE::readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset) |
| 229 | { | 220 | { |
| 230 | qDebug("Reading %s header.", qPrintable(matrix)); | 221 | qDebug("Reading %s header.", qPrintable(matrix)); |
| @@ -235,8 +226,7 @@ void BEE::writeMatrixHeader(const QString &matrix, const QString &targetSigset, | @@ -235,8 +226,7 @@ void BEE::writeMatrixHeader(const QString &matrix, const QString &targetSigset, | ||
| 235 | { | 226 | { |
| 236 | qDebug("Writing %s header to %s %s.", qPrintable(matrix), qPrintable(targetSigset), qPrintable(querySigset)); | 227 | qDebug("Writing %s header to %s %s.", qPrintable(matrix), qPrintable(targetSigset), qPrintable(querySigset)); |
| 237 | 228 | ||
| 238 | - if (matrix.endsWith("mask")) writeMatrix< Mask_t>(readMat(matrix), matrix, targetSigset, querySigset); | ||
| 239 | - else writeMatrix<Simmat_t>(readMat(matrix), matrix, targetSigset, querySigset); | 229 | + writeMat(readMat(matrix), matrix, targetSigset, querySigset); |
| 240 | } | 230 | } |
| 241 | 231 | ||
| 242 | void BEE::makeMask(const QString &targetInput, const QString &queryInput, const QString &mask) | 232 | 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 | @@ -245,11 +235,11 @@ void BEE::makeMask(const QString &targetInput, const QString &queryInput, const | ||
| 245 | FileList targets = TemplateList::fromGallery(targetInput).files(); | 235 | FileList targets = TemplateList::fromGallery(targetInput).files(); |
| 246 | FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files(); | 236 | FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files(); |
| 247 | int partitions = targets.first().get<int>("crossValidate"); | 237 | int partitions = targets.first().get<int>("crossValidate"); |
| 248 | - if (partitions == 0) writeMask(makeMask(targets, queries), mask, targetInput, queryInput); | 238 | + if (partitions == 0) writeMat(makeMask(targets, queries), mask, targetInput, queryInput); |
| 249 | else { | 239 | else { |
| 250 | if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)"); | 240 | if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)"); |
| 251 | for (int i=0; i<partitions; i++) { | 241 | for (int i=0; i<partitions; i++) { |
| 252 | - writeMask(makeMask(targets, queries, i), mask.arg(i), targetInput, queryInput); | 242 | + writeMat(makeMask(targets, queries, i), mask.arg(i), targetInput, queryInput); |
| 253 | } | 243 | } |
| 254 | } | 244 | } |
| 255 | } | 245 | } |
| @@ -259,11 +249,11 @@ void BEE::makePairwiseMask(const QString &targetInput, const QString &queryInput | @@ -259,11 +249,11 @@ void BEE::makePairwiseMask(const QString &targetInput, const QString &queryInput | ||
| 259 | FileList targets = TemplateList::fromGallery(targetInput).files(); | 249 | FileList targets = TemplateList::fromGallery(targetInput).files(); |
| 260 | FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files(); | 250 | FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files(); |
| 261 | int partitions = targets.first().get<int>("crossValidate"); | 251 | int partitions = targets.first().get<int>("crossValidate"); |
| 262 | - if (partitions == 0) writeMask(makePairwiseMask(targets, queries), mask, targetInput, queryInput); | 252 | + if (partitions == 0) writeMat(makePairwiseMask(targets, queries), mask, targetInput, queryInput); |
| 263 | else { | 253 | else { |
| 264 | if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)"); | 254 | if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)"); |
| 265 | for (int i=0; i<partitions; i++) { | 255 | for (int i=0; i<partitions; i++) { |
| 266 | - writeMask(makePairwiseMask(targets, queries, i), mask.arg(i), targetInput, queryInput); | 256 | + writeMat(makePairwiseMask(targets, queries, i), mask.arg(i), targetInput, queryInput); |
| 267 | } | 257 | } |
| 268 | } | 258 | } |
| 269 | } | 259 | } |
| @@ -387,5 +377,5 @@ void BEE::combineMasks(const QStringList &inputMasks, const QString &outputMask, | @@ -387,5 +377,5 @@ void BEE::combineMasks(const QStringList &inputMasks, const QString &outputMask, | ||
| 387 | } | 377 | } |
| 388 | } | 378 | } |
| 389 | 379 | ||
| 390 | - writeMask(combinedMask, outputMask, "Combined_Targets", "Combined_Queries"); | 380 | + writeMat(combinedMask, outputMask, "Combined_Targets", "Combined_Queries"); |
| 391 | } | 381 | } |
openbr/core/bee.h
| @@ -40,8 +40,7 @@ namespace BEE | @@ -40,8 +40,7 @@ namespace BEE | ||
| 40 | 40 | ||
| 41 | // Matrix | 41 | // Matrix |
| 42 | cv::Mat readMat(const br::File & mat, QString * targetSigset = NULL, QString * querySigset = NULL); | 42 | cv::Mat readMat(const br::File & mat, QString * targetSigset = NULL, QString * querySigset = NULL); |
| 43 | - void writeSimmat(const cv::Mat &m, const QString &simmat, const QString &targetSigset = "Unknown_Target", const QString &querySigset = "Unknown_Query"); | ||
| 44 | - void writeMask(const cv::Mat &m, const QString &mask, const QString &targetSigset = "Unknown_Target", const QString &querySigset = "Unknown_Query"); | 43 | + void writeMat(const cv::Mat &m, const QString &simmat, const QString &targetSigset = "Unknown_Target", const QString &querySigset = "Unknown_Query"); |
| 45 | void readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset); | 44 | void readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset); |
| 46 | void writeMatrixHeader(const QString &matrix, const QString &targetSigset, const QString &querySigset); | 45 | void writeMatrixHeader(const QString &matrix, const QString &targetSigset, const QString &querySigset); |
| 47 | 46 |
openbr/core/core.cpp
| @@ -235,15 +235,21 @@ struct AlgorithmCore | @@ -235,15 +235,21 @@ struct AlgorithmCore | ||
| 235 | TemplateList targets = t->read(); | 235 | TemplateList targets = t->read(); |
| 236 | 236 | ||
| 237 | // Use a single file for one of the dimensions so that the output makes the right size file | 237 | // Use a single file for one of the dimensions so that the output makes the right size file |
| 238 | - FileList dummyQuery; | ||
| 239 | - dummyQuery.append(targets[0]); | ||
| 240 | - QScopedPointer<Output> realOutput(Output::make(output, targetFiles, dummyQuery)); | ||
| 241 | - | 238 | + FileList dummyTarget; |
| 239 | + dummyTarget.append(targets[0]); | ||
| 240 | + QScopedPointer<Output> realOutput(Output::make(output, dummyTarget, queryFiles)); | ||
| 241 | + | ||
| 242 | + // Some outputs assume Globals->blockSize is a real thing, of course we have no interest in it. | ||
| 243 | + int old_block_size = Globals->blockSize; | ||
| 244 | + Globals->blockSize = INT_MAX; | ||
| 245 | + realOutput->setBlock(0,0); | ||
| 242 | for (int i=0; i < queries.length(); i++) | 246 | for (int i=0; i < queries.length(); i++) |
| 243 | { | 247 | { |
| 244 | float res = distance->compare(queries[i], targets[i]); | 248 | float res = distance->compare(queries[i], targets[i]); |
| 245 | realOutput->setRelative(res, 0,i); | 249 | realOutput->setRelative(res, 0,i); |
| 246 | } | 250 | } |
| 251 | + | ||
| 252 | + Globals->blockSize = old_block_size; | ||
| 247 | } | 253 | } |
| 248 | 254 | ||
| 249 | void compare(File targetGallery, File queryGallery, File output) | 255 | void compare(File targetGallery, File queryGallery, File output) |
openbr/core/fuse.cpp
| @@ -160,5 +160,5 @@ void br::Fuse(const QStringList &inputSimmats, const QString &normalization, con | @@ -160,5 +160,5 @@ void br::Fuse(const QStringList &inputSimmats, const QString &normalization, con | ||
| 160 | 160 | ||
| 161 | } while (partition < crossValidate); | 161 | } while (partition < crossValidate); |
| 162 | 162 | ||
| 163 | - BEE::writeSimmat(buffer, outputSimmat); | 163 | + BEE::writeMat(buffer, outputSimmat); |
| 164 | } | 164 | } |
openbr/plugins/format.cpp
| @@ -285,7 +285,7 @@ class mtxFormat : public Format | @@ -285,7 +285,7 @@ class mtxFormat : public Format | ||
| 285 | 285 | ||
| 286 | void write(const Template &t) const | 286 | void write(const Template &t) const |
| 287 | { | 287 | { |
| 288 | - BEE::writeSimmat(t, file); | 288 | + BEE::writeMat(t, file); |
| 289 | } | 289 | } |
| 290 | }; | 290 | }; |
| 291 | 291 | ||
| @@ -307,7 +307,7 @@ class maskFormat : public Format | @@ -307,7 +307,7 @@ class maskFormat : public Format | ||
| 307 | 307 | ||
| 308 | void write(const Template &t) const | 308 | void write(const Template &t) const |
| 309 | { | 309 | { |
| 310 | - BEE::writeMask(t, file); | 310 | + BEE::writeMat(t, file); |
| 311 | } | 311 | } |
| 312 | }; | 312 | }; |
| 313 | 313 | ||
| @@ -418,9 +418,7 @@ class matFormat : public Format | @@ -418,9 +418,7 @@ class matFormat : public Format | ||
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | if ((rows > 0) && (columns > 0) && (matrixType != 0) && !matrixData.isEmpty()) { | 420 | if ((rows > 0) && (columns > 0) && (matrixType != 0) && !matrixData.isEmpty()) { |
| 421 | - Mat transposed; | ||
| 422 | - transpose(Mat(rows, columns, matrixType, matrixData.data()), transposed); | ||
| 423 | - t.append(transposed); | 421 | + t.append(Mat(rows, columns, matrixType, matrixData.data())); |
| 424 | } | 422 | } |
| 425 | } | 423 | } |
| 426 | } | 424 | } |