Commit c3e880e6c15be09cd4dae8f067aa3cdbb2d02f06
1 parent
0d62d619
Refactor BEE::readMask and readSimmat to a common readMat function
Since .mtx files include a matrix type in their header, we don't really need separate functions to read similarity matrices and masks. This drops special case support for creating identity matrices via readSimmat and readMask (since in that case, there is no actual header to read to get a matrix type).
Showing
7 changed files
with
26 additions
and
67 deletions
openbr/core/bee.cpp
| ... | ... | @@ -135,43 +135,8 @@ void BEE::writeSigset(const QString &sigset, const br::FileList &files, bool ign |
| 135 | 135 | QtUtils::writeFile(sigset, lines); |
| 136 | 136 | } |
| 137 | 137 | |
| 138 | -template <typename T> | |
| 139 | -Mat readMatrix(const br::File &matrix, QString *targetSigset = NULL, QString *querySigset = NULL) | |
| 138 | +Mat BEE::readMat(const br::File &matrix, QString *targetSigset, QString *querySigset) | |
| 140 | 139 | { |
| 141 | - // Special case matrix construction | |
| 142 | - if (matrix == "Identity") { | |
| 143 | - int rows = matrix.get<int>("rows", -1); | |
| 144 | - int columns = matrix.get<int>("columns", -1); | |
| 145 | - const int size = matrix.get<int>("size", -1); | |
| 146 | - if (size != -1) { | |
| 147 | - if (rows == -1) rows = size; | |
| 148 | - if (columns == -1) columns = size; | |
| 149 | - } | |
| 150 | - const int step = matrix.get<int>("step", 1); | |
| 151 | - if (rows % step != 0) qFatal("Step does not divide rows evenly."); | |
| 152 | - if (columns % step != 0) qFatal("Step does not divide columns evenly."); | |
| 153 | - | |
| 154 | - if (sizeof(T) == sizeof(BEE::Mask_t)) { | |
| 155 | - const bool selfSimilar = matrix.get<bool>("selfSimilar", false); | |
| 156 | - | |
| 157 | - Mat m(rows, columns, CV_8UC1); | |
| 158 | - m.setTo(BEE::NonMatch); | |
| 159 | - for (int i=0; i<std::min(rows, columns); i+=step) | |
| 160 | - for (int j=0; j<step; j++) | |
| 161 | - for (int k=0; k<step; k++) | |
| 162 | - m.at<BEE::Mask_t>(i+j,i+k) = ((selfSimilar && (j == k)) ? BEE::DontCare : BEE::Match); | |
| 163 | - return m; | |
| 164 | - } else if (sizeof(T) == sizeof(BEE::Simmat_t)) { | |
| 165 | - Mat m(rows, columns, CV_32FC1); | |
| 166 | - m.setTo(0); | |
| 167 | - for (int i=0; i<std::min(rows, columns); i+=step) | |
| 168 | - for (int j=0; j<step; j++) | |
| 169 | - for (int k=0; k<step; k++) | |
| 170 | - m.at<BEE::Simmat_t>(i+j,i+k) = 1; | |
| 171 | - return m; | |
| 172 | - } | |
| 173 | - } | |
| 174 | - | |
| 175 | 140 | QFile file(matrix); |
| 176 | 141 | bool success = file.open(QFile::ReadOnly); |
| 177 | 142 | if (!success) qFatal("Unable to open %s for reading.", qPrintable(matrix.name)); |
| ... | ... | @@ -181,6 +146,7 @@ Mat readMatrix(const br::File &matrix, QString *targetSigset = NULL, QString *qu |
| 181 | 146 | bool isDistance = (format[0] == 'D'); |
| 182 | 147 | if (format[1] != '2') qFatal("Invalid matrix header."); |
| 183 | 148 | |
| 149 | + | |
| 184 | 150 | // Read sigsets |
| 185 | 151 | if (targetSigset != NULL) *targetSigset = file.readLine().simplified(); |
| 186 | 152 | else file.readLine(); |
| ... | ... | @@ -192,9 +158,17 @@ Mat readMatrix(const br::File &matrix, QString *targetSigset = NULL, QString *qu |
| 192 | 158 | int rows = words[1].toInt(); |
| 193 | 159 | int cols = words[2].toInt(); |
| 194 | 160 | |
| 161 | + bool isMask = words[0][1] == 'B'; | |
| 162 | + int typeSize = isMask ? sizeof(BEE::Mask_t) : sizeof(BEE::Simmat_t); | |
| 163 | + | |
| 195 | 164 | // Get matrix data |
| 196 | - qint64 bytesExpected = (qint64)rows*(qint64)cols*(qint64)sizeof(T); | |
| 197 | - Mat m(rows, cols, OpenCVType<T,1>::make()); | |
| 165 | + qint64 bytesExpected = (qint64)rows*(qint64)cols*(qint64)typeSize; | |
| 166 | + Mat m; | |
| 167 | + if (isMask) | |
| 168 | + m.create(rows, cols, OpenCVType<BEE::Mask_t,1>::make()); | |
| 169 | + else | |
| 170 | + m.create(rows, cols, OpenCVType<BEE::Simmat_t,1>::make()); | |
| 171 | + | |
| 198 | 172 | qint64 read = file.read((char*)m.data, bytesExpected); |
| 199 | 173 | if (read != bytesExpected) |
| 200 | 174 | qFatal("Invalid matrix size."); |
| ... | ... | @@ -206,16 +180,6 @@ Mat readMatrix(const br::File &matrix, QString *targetSigset = NULL, QString *qu |
| 206 | 180 | return result; |
| 207 | 181 | } |
| 208 | 182 | |
| 209 | -Mat BEE::readSimmat(const br::File &simmat, QString *targetSigset, QString *querySigset) | |
| 210 | -{ | |
| 211 | - return readMatrix<Simmat_t>(simmat, targetSigset, querySigset); | |
| 212 | -} | |
| 213 | - | |
| 214 | -Mat BEE::readMask(const br::File &mask) | |
| 215 | -{ | |
| 216 | - return readMatrix<Mask_t>(mask); | |
| 217 | -} | |
| 218 | - | |
| 219 | 183 | template <typename T> |
| 220 | 184 | void writeMatrix(const Mat &m, const QString &matrix, const QString &targetSigset, const QString &querySigset) |
| 221 | 185 | { |
| ... | ... | @@ -264,15 +228,15 @@ void BEE::writeMask(const Mat &m, const QString &mask, const QString &targetSigs |
| 264 | 228 | void BEE::readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset) |
| 265 | 229 | { |
| 266 | 230 | qDebug("Reading %s header.", qPrintable(matrix)); |
| 267 | - if (matrix.endsWith("mask")) readMatrix< Mask_t>(matrix, targetSigset, querySigset); | |
| 268 | - else readMatrix<Simmat_t>(matrix, targetSigset, querySigset); | |
| 231 | + readMat(matrix, targetSigset, querySigset); | |
| 269 | 232 | } |
| 270 | 233 | |
| 271 | 234 | void BEE::writeMatrixHeader(const QString &matrix, const QString &targetSigset, const QString &querySigset) |
| 272 | 235 | { |
| 273 | 236 | qDebug("Writing %s header to %s %s.", qPrintable(matrix), qPrintable(targetSigset), qPrintable(querySigset)); |
| 274 | - if (matrix.endsWith("mask")) writeMatrix< Mask_t>(readMatrix< Mask_t>(matrix), matrix, targetSigset, querySigset); | |
| 275 | - else writeMatrix<Simmat_t>(readMatrix<Simmat_t>(matrix), matrix, targetSigset, querySigset); | |
| 237 | + | |
| 238 | + if (matrix.endsWith("mask")) writeMatrix< Mask_t>(readMat(matrix), matrix, targetSigset, querySigset); | |
| 239 | + else writeMatrix<Simmat_t>(readMat(matrix), matrix, targetSigset, querySigset); | |
| 276 | 240 | } |
| 277 | 241 | |
| 278 | 242 | void BEE::makeMask(const QString &targetInput, const QString &queryInput, const QString &mask) |
| ... | ... | @@ -387,7 +351,7 @@ void BEE::combineMasks(const QStringList &inputMasks, const QString &outputMask, |
| 387 | 351 | |
| 388 | 352 | QList<Mat> masks; |
| 389 | 353 | foreach (const QString &inputMask, inputMasks) |
| 390 | - masks.append(readMask(inputMask)); | |
| 354 | + masks.append(readMat(inputMask)); | |
| 391 | 355 | if (masks.size() < 2) qFatal("Expected at least two masks."); |
| 392 | 356 | |
| 393 | 357 | const int rows = masks.first().rows; | ... | ... |
openbr/core/bee.h
| ... | ... | @@ -39,8 +39,7 @@ namespace BEE |
| 39 | 39 | void writeSigset(const QString &sigset, const br::FileList &files, bool ignoreMetadata = false); |
| 40 | 40 | |
| 41 | 41 | // Matrix |
| 42 | - cv::Mat readSimmat(const br::File &simmat, QString *targetSigset = NULL, QString *querySigset = NULL); | |
| 43 | - cv::Mat readMask(const br::File &mask); | |
| 42 | + cv::Mat readMat(const br::File & mat, QString * targetSigset = NULL, QString * querySigset = NULL); | |
| 44 | 43 | void writeSimmat(const cv::Mat &m, const QString &simmat, const QString &targetSigset = "Unknown_Target", const QString &querySigset = "Unknown_Query"); |
| 45 | 44 | void writeMask(const cv::Mat &m, const QString &mask, const QString &targetSigset = "Unknown_Target", const QString &querySigset = "Unknown_Query"); |
| 46 | 45 | void readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset); | ... | ... |
openbr/core/cluster.cpp
| ... | ... | @@ -99,7 +99,7 @@ Neighborhood getNeighborhood(const QStringList &simmats) |
| 99 | 99 | int currentRows = -1; |
| 100 | 100 | int columnOffset = 0; |
| 101 | 101 | for (int j=0; j<numGalleries; j++) { |
| 102 | - cv::Mat m = BEE::readSimmat(simmats[i*numGalleries+j]); | |
| 102 | + cv::Mat m = BEE::readMat(simmats[i*numGalleries+j]); | |
| 103 | 103 | if (j==0) { |
| 104 | 104 | currentRows = m.rows; |
| 105 | 105 | allNeighbors.resize(currentRows); | ... | ... |
openbr/core/core.cpp
| ... | ... | @@ -443,7 +443,7 @@ void br::Convert(const File &fileType, const File &inputFile, const File &output |
| 443 | 443 | while (!done) after->writeBlock(before->readBlock(&done)); |
| 444 | 444 | } else if (fileType == "Output") { |
| 445 | 445 | QString target, query; |
| 446 | - cv::Mat m = BEE::readSimmat(inputFile, &target, &query); | |
| 446 | + cv::Mat m = BEE::readMat(inputFile, &target, &query); | |
| 447 | 447 | const FileList targetFiles = TemplateList::fromGallery(target).files(); |
| 448 | 448 | const FileList queryFiles = TemplateList::fromGallery(query).files(); |
| 449 | 449 | ... | ... |
openbr/core/eval.cpp
| ... | ... | @@ -81,7 +81,7 @@ float Evaluate(const QString &simmat, const QString &mask, const QString &csv) |
| 81 | 81 | QString target, query; |
| 82 | 82 | Mat scores; |
| 83 | 83 | if (simmat.endsWith(".mtx")) { |
| 84 | - scores = BEE::readSimmat(simmat, &target, &query); | |
| 84 | + scores = BEE::readMat(simmat, &target, &query); | |
| 85 | 85 | } else { |
| 86 | 86 | QScopedPointer<Format> format(Factory<Format>::make(simmat)); |
| 87 | 87 | scores = format->read(); |
| ... | ... | @@ -99,12 +99,8 @@ float Evaluate(const QString &simmat, const QString &mask, const QString &csv) |
| 99 | 99 | File maskFile(mask); |
| 100 | 100 | maskFile.set("rows", scores.rows); |
| 101 | 101 | maskFile.set("columns", scores.cols); |
| 102 | - if (mask.endsWith(".mtx")) | |
| 103 | - truth = BEE::readMask(mask); | |
| 104 | - else { | |
| 105 | - QScopedPointer<Format> format(Factory<Format>::make(maskFile)); | |
| 106 | - truth = format->read(); | |
| 107 | - } | |
| 102 | + QScopedPointer<Format> format(Factory<Format>::make(maskFile)); | |
| 103 | + truth = format->read(); | |
| 108 | 104 | } |
| 109 | 105 | |
| 110 | 106 | return Evaluate(scores, truth, csv); | ... | ... |
openbr/core/fuse.cpp
| ... | ... | @@ -82,7 +82,7 @@ void br::Fuse(const QStringList &inputSimmats, const QString &normalization, con |
| 82 | 82 | QString target, query, previousTarget, previousQuery; |
| 83 | 83 | QList<Mat> originalMatrices; |
| 84 | 84 | foreach (const QString &simmat, inputSimmats) { |
| 85 | - originalMatrices.append(BEE::readSimmat(simmat,&target,&query)); | |
| 85 | + originalMatrices.append(BEE::readMat(simmat,&target,&query)); | |
| 86 | 86 | // Make we're fusing score matrices for the same set of targets and querys |
| 87 | 87 | if (!previousTarget.isEmpty() && !previousQuery.isEmpty() && (previousTarget != target || previousQuery != query)) |
| 88 | 88 | qFatal("Target or query files are not the same across fused matrices."); | ... | ... |
openbr/plugins/format.cpp
| ... | ... | @@ -280,7 +280,7 @@ class mtxFormat : public Format |
| 280 | 280 | |
| 281 | 281 | Template read() const |
| 282 | 282 | { |
| 283 | - return BEE::readSimmat(file); | |
| 283 | + return BEE::readMat(file); | |
| 284 | 284 | } |
| 285 | 285 | |
| 286 | 286 | void write(const Template &t) const |
| ... | ... | @@ -302,7 +302,7 @@ class maskFormat : public Format |
| 302 | 302 | |
| 303 | 303 | Template read() const |
| 304 | 304 | { |
| 305 | - return BEE::readMask(file); | |
| 305 | + return BEE::readMat(file); | |
| 306 | 306 | } |
| 307 | 307 | |
| 308 | 308 | void write(const Template &t) const | ... | ... |