Commit d7e2f8fccacd4e2e5ce88b16ffe20bfb6195b5ea

Authored by Josh Klontz
1 parent 6119ee17

cleaned up BEE

openbr/core/bee.cpp
@@ -14,17 +14,10 @@ @@ -14,17 +14,10 @@
14 * limitations under the License. * 14 * limitations under the License. *
15 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 15 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
16 16
17 -#include <QFile>  
18 -#include <QFileInfo>  
19 -#include <QHash>  
20 -#include <QMap>  
21 -#include <QRegExp> 17 +#include <QtCore>
22 #ifndef BR_EMBEDDED 18 #ifndef BR_EMBEDDED
23 #include <QtXml> 19 #include <QtXml>
24 #endif // BR_EMBEDDED 20 #endif // BR_EMBEDDED
25 -#include <algorithm>  
26 -#include <limits>  
27 -#include <openbr/openbr_plugin.h>  
28 21
29 #include "bee.h" 22 #include "bee.h"
30 #include "opencvutils.h" 23 #include "opencvutils.h"
@@ -33,23 +26,21 @@ @@ -33,23 +26,21 @@
33 using namespace cv; 26 using namespace cv;
34 using namespace br; 27 using namespace br;
35 28
36 -/**** BEE ****/  
37 -FileList BEE::readSigset(const File &sigset, bool ignoreMetadata) 29 +namespace BEE
  30 +{
  31 +
  32 +FileList readSigset(const File &sigset, bool ignoreMetadata)
38 { 33 {
39 FileList fileList; 34 FileList fileList;
40 35
41 #ifndef BR_EMBEDDED 36 #ifndef BR_EMBEDDED
42 QDomDocument doc(sigset.fileName()); 37 QDomDocument doc(sigset.fileName());
43 - QFile file(sigset.resolved());  
44 - bool success;  
45 - success = file.open(QIODevice::ReadOnly); if (!success) qFatal("Unable to open %s for reading.", qPrintable(sigset));  
46 - success = doc.setContent(&file);  
47 -  
48 - file.close();  
49 -  
50 - if (!success) {  
51 - qWarning("Unable to parse %s.", qPrintable(sigset));  
52 - return fileList; 38 + {
  39 + QFile file(sigset.resolved());
  40 + if (!file.open(QIODevice::ReadOnly))
  41 + qFatal("Unable to open %s for reading.", qPrintable(sigset));
  42 + if (!doc.setContent(&file))
  43 + qFatal("Unable to parse %s.", qPrintable(sigset));
53 } 44 }
54 45
55 QDomElement docElem = doc.documentElement(); 46 QDomElement docElem = doc.documentElement();
@@ -105,7 +96,7 @@ FileList BEE::readSigset(const File &amp;sigset, bool ignoreMetadata) @@ -105,7 +96,7 @@ FileList BEE::readSigset(const File &amp;sigset, bool ignoreMetadata)
105 return fileList; 96 return fileList;
106 } 97 }
107 98
108 -void BEE::writeSigset(const QString &sigset, const br::FileList &files, bool ignoreMetadata) 99 +void writeSigset(const QString &sigset, const FileList &files, bool ignoreMetadata)
109 { 100 {
110 QStringList lines; lines.reserve(3*files.size()+3); 101 QStringList lines; lines.reserve(3*files.size()+3);
111 lines.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 102 lines.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
@@ -137,7 +128,7 @@ void BEE::writeSigset(const QString &amp;sigset, const br::FileList &amp;files, bool ign @@ -137,7 +128,7 @@ void BEE::writeSigset(const QString &amp;sigset, const br::FileList &amp;files, bool ign
137 QtUtils::writeFile(sigset, lines); 128 QtUtils::writeFile(sigset, lines);
138 } 129 }
139 130
140 -Mat BEE::readMat(const br::File &matrix, QString *targetSigset, QString *querySigset) 131 +Mat readMatrix(const File &matrix, QString *targetSigset, QString *querySigset)
141 { 132 {
142 QFile file(matrix); 133 QFile file(matrix);
143 bool success = file.open(QFile::ReadOnly); 134 bool success = file.open(QFile::ReadOnly);
@@ -148,7 +139,6 @@ Mat BEE::readMat(const br::File &amp;matrix, QString *targetSigset, QString *querySi @@ -148,7 +139,6 @@ Mat BEE::readMat(const br::File &amp;matrix, QString *targetSigset, QString *querySi
148 bool isDistance = (format[0] == 'D'); 139 bool isDistance = (format[0] == 'D');
149 if (format[1] != '2') qFatal("Invalid matrix header."); 140 if (format[1] != '2') qFatal("Invalid matrix header.");
150 141
151 -  
152 // Read sigsets 142 // Read sigsets
153 if (targetSigset != NULL) *targetSigset = file.readLine().simplified(); 143 if (targetSigset != NULL) *targetSigset = file.readLine().simplified();
154 else file.readLine(); 144 else file.readLine();
@@ -156,57 +146,52 @@ Mat BEE::readMat(const br::File &amp;matrix, QString *targetSigset, QString *querySi @@ -156,57 +146,52 @@ Mat BEE::readMat(const br::File &amp;matrix, QString *targetSigset, QString *querySi
156 else file.readLine(); 146 else file.readLine();
157 147
158 // Get matrix size 148 // Get matrix size
159 - QStringList words = QString(file.readLine()).split(" ");  
160 - int rows = words[1].toInt();  
161 - int cols = words[2].toInt();  
162 -  
163 - bool isMask = words[0][1] == 'B';  
164 - int typeSize = isMask ? sizeof(BEE::Mask_t) : sizeof(BEE::Simmat_t); 149 + const QStringList words = QString(file.readLine()).split(" ");
  150 + const int rows = words[1].toInt();
  151 + const int cols = words[2].toInt();
  152 + const bool isMask = words[0][1] == 'B';
  153 + const int typeSize = isMask ? sizeof(BEE::MaskValue) : sizeof(BEE::SimmatValue);
165 154
166 // Get matrix data 155 // Get matrix data
167 Mat m; 156 Mat m;
168 if (isMask) 157 if (isMask)
169 - m.create(rows, cols, OpenCVType<BEE::Mask_t,1>::make()); 158 + m.create(rows, cols, OpenCVType<BEE::MaskValue,1>::make());
170 else 159 else
171 - m.create(rows, cols, OpenCVType<BEE::Simmat_t,1>::make()); 160 + m.create(rows, cols, OpenCVType<BEE::SimmatValue,1>::make());
172 161
173 - qint64 bytesPerRow = m.cols * typeSize;  
174 -  
175 - for (int i=0; i < m.rows;i++)  
176 - {  
177 - cv::Mat aRow = m.row(i); 162 + const qint64 bytesPerRow = m.cols * typeSize;
  163 + for (int i=0; i<m.rows; i++) {
  164 + Mat aRow = m.row(i);
178 qint64 bytesRead = file.read((char *)aRow.data, bytesPerRow); 165 qint64 bytesRead = file.read((char *)aRow.data, bytesPerRow);
179 if (bytesRead != bytesPerRow) 166 if (bytesRead != bytesPerRow)
180 - {  
181 qFatal("Didn't read complete row!"); 167 qFatal("Didn't read complete row!");
182 - }  
183 } 168 }
184 if (!file.atEnd()) 169 if (!file.atEnd())
185 qFatal("Expected matrix end of file."); 170 qFatal("Expected matrix end of file.");
186 file.close(); 171 file.close();
187 172
188 Mat result = m; 173 Mat result = m;
189 - if (isDistance ^ matrix.get<bool>("negate", false)) m.convertTo(result, -1, -1);  
190 - 174 + if (isDistance ^ matrix.get<bool>("negate", false))
  175 + m.convertTo(result, -1, -1);
191 return result; 176 return result;
192 } 177 }
193 178
194 -void BEE::writeMat(const Mat &m, const QString &matrix, const QString &targetSigset, const QString &querySigset) 179 +void writeMatrix(const Mat &m, const QString &fileName, const QString &targetSigset, const QString &querySigset)
195 { 180 {
196 bool isMask = false; 181 bool isMask = false;
197 - if (m.type() == OpenCVType<BEE::Mask_t,1>::make()) 182 + if (m.type() == OpenCVType<BEE::MaskValue,1>::make())
198 isMask = true; 183 isMask = true;
199 - else if (m.type() != OpenCVType<BEE::Simmat_t,1>::make()) 184 + else if (m.type() != OpenCVType<BEE::SimmatValue,1>::make())
200 qFatal("Invalid matrix type, .mtx files can only contain single channel float or uchar matrices."); 185 qFatal("Invalid matrix type, .mtx files can only contain single channel float or uchar matrices.");
201 186
202 - int elemSize = isMask ? sizeof(BEE::Mask_t) : sizeof(BEE::Simmat_t);  
203 -  
204 - QString matrixType = isMask ? "B" : "F"; 187 + const int elemSize = isMask ? sizeof(BEE::MaskValue) : sizeof(BEE::SimmatValue);
  188 + const QString matrixType = isMask ? "B" : "F";
205 189
206 char buff[4]; 190 char buff[4];
207 - QFile file(matrix); 191 + QFile file(fileName);
208 QtUtils::touchDir(file); 192 QtUtils::touchDir(file);
209 - bool success = file.open(QFile::WriteOnly); if (!success) qFatal("Unable to open %s for writing.", qPrintable(matrix)); 193 + if (!file.open(QFile::WriteOnly))
  194 + qFatal("Unable to open %s for writing.", qPrintable(fileName));
210 file.write("S2\n"); 195 file.write("S2\n");
211 file.write(qPrintable(targetSigset)); 196 file.write(qPrintable(targetSigset));
212 file.write("\n"); 197 file.write("\n");
@@ -219,7 +204,7 @@ void BEE::writeMat(const Mat &amp;m, const QString &amp;matrix, const QString &amp;targetSig @@ -219,7 +204,7 @@ void BEE::writeMat(const Mat &amp;m, const QString &amp;matrix, const QString &amp;targetSig
219 file.write(" "); 204 file.write(" ");
220 file.write(qPrintable(QString::number(m.cols))); 205 file.write(qPrintable(QString::number(m.cols)));
221 file.write(" "); 206 file.write(" ");
222 - int endian = 0x12345678; 207 + const int endian = 0x12345678;
223 memcpy(&buff, &endian, 4); 208 memcpy(&buff, &endian, 4);
224 file.write(buff, 4); 209 file.write(buff, 4);
225 file.write("\n"); 210 file.write("\n");
@@ -227,57 +212,58 @@ void BEE::writeMat(const Mat &amp;m, const QString &amp;matrix, const QString &amp;targetSig @@ -227,57 +212,58 @@ void BEE::writeMat(const Mat &amp;m, const QString &amp;matrix, const QString &amp;targetSig
227 file.close(); 212 file.close();
228 } 213 }
229 214
230 -void BEE::readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset) 215 +void readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset)
231 { 216 {
232 qDebug("Reading %s header.", qPrintable(matrix)); 217 qDebug("Reading %s header.", qPrintable(matrix));
233 - readMat(matrix, targetSigset, querySigset); 218 + readMatrix(matrix, targetSigset, querySigset);
234 } 219 }
235 220
236 -void BEE::writeMatrixHeader(const QString &matrix, const QString &targetSigset, const QString &querySigset) 221 +void writeMatrixHeader(const QString &matrix, const QString &targetSigset, const QString &querySigset)
237 { 222 {
238 qDebug("Writing %s header to %s %s.", qPrintable(matrix), qPrintable(targetSigset), qPrintable(querySigset)); 223 qDebug("Writing %s header to %s %s.", qPrintable(matrix), qPrintable(targetSigset), qPrintable(querySigset));
239 -  
240 - writeMat(readMat(matrix), matrix, targetSigset, querySigset); 224 + writeMatrix(readMatrix(matrix), matrix, targetSigset, querySigset);
241 } 225 }
242 226
243 -void BEE::makeMask(const QString &targetInput, const QString &queryInput, const QString &mask) 227 +void makeMask(const QString &targetInput, const QString &queryInput, const QString &mask)
244 { 228 {
245 qDebug("Making mask from %s and %s to %s", qPrintable(targetInput), qPrintable(queryInput), qPrintable(mask)); 229 qDebug("Making mask from %s and %s to %s", qPrintable(targetInput), qPrintable(queryInput), qPrintable(mask));
246 - FileList targets = TemplateList::fromGallery(targetInput).files();  
247 - FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files();  
248 - int partitions = targets.first().get<int>("crossValidate");  
249 - if (partitions == 0) writeMat(makeMask(targets, queries), mask, targetInput, queryInput);  
250 - else { 230 + const FileList targets = TemplateList::fromGallery(targetInput).files();
  231 + const FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files();
  232 + const int partitions = targets.first().get<int>("crossValidate");
  233 + if (partitions == 0) {
  234 + writeMatrix(makeMask(targets, queries), mask, targetInput, queryInput);
  235 + } else {
251 if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)"); 236 if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)");
252 for (int i=0; i<partitions; i++) { 237 for (int i=0; i<partitions; i++) {
253 - writeMat(makeMask(targets, queries, i), mask.arg(i), targetInput, queryInput); 238 + writeMatrix(makeMask(targets, queries, i), mask.arg(i), targetInput, queryInput);
254 } 239 }
255 } 240 }
256 } 241 }
257 242
258 -void BEE::makePairwiseMask(const QString &targetInput, const QString &queryInput, const QString &mask) 243 +void makePairwiseMask(const QString &targetInput, const QString &queryInput, const QString &mask)
259 { 244 {
260 - FileList targets = TemplateList::fromGallery(targetInput).files();  
261 - FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files();  
262 - int partitions = targets.first().get<int>("crossValidate");  
263 - if (partitions == 0) writeMat(makePairwiseMask(targets, queries), mask, targetInput, queryInput);  
264 - else { 245 + qDebug("Making pairwise mask from %s and %s to %s", qPrintable(targetInput), qPrintable(queryInput), qPrintable(mask));
  246 + const FileList targets = TemplateList::fromGallery(targetInput).files();
  247 + const FileList queries = (queryInput == ".") ? targets : TemplateList::fromGallery(queryInput).files();
  248 + const int partitions = targets.first().get<int>("crossValidate");
  249 + if (partitions == 0) {
  250 + writeMatrix(makePairwiseMask(targets, queries), mask, targetInput, queryInput);
  251 + } else {
265 if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)"); 252 if (!mask.contains("%1")) qFatal("Mask file name missing partition number place marker (%%1)");
266 for (int i=0; i<partitions; i++) { 253 for (int i=0; i<partitions; i++) {
267 - writeMat(makePairwiseMask(targets, queries, i), mask.arg(i), targetInput, queryInput); 254 + writeMatrix(makePairwiseMask(targets, queries, i), mask.arg(i), targetInput, queryInput);
268 } 255 }
269 } 256 }
270 } 257 }
271 258
272 -cv::Mat BEE::makePairwiseMask(const br::FileList &targets, const br::FileList &queries, int partition) 259 +Mat makePairwiseMask(const FileList &targets, const FileList &queries, int partition)
273 { 260 {
274 - // Direct use of "Label" isn't general, also would prefer to use indexProperty, rather than 261 + // TODO: Direct use of "Label" isn't general, also would prefer to use indexProperty, rather than
275 // doing string comparisons (but that isn't implemented yet for FileList) -cao 262 // doing string comparisons (but that isn't implemented yet for FileList) -cao
276 - QList<QString> targetLabels = File::get<QString>(targets, "Label", "-1");  
277 - QList<QString> queryLabels = File::get<QString>(queries, "Label", "-1");  
278 -  
279 - QList<int> targetPartitions = targets.crossValidationPartitions();  
280 - QList<int> queryPartitions = queries.crossValidationPartitions(); 263 + const QStringList targetLabels = File::get<QString>(targets, "Label", "-1");
  264 + const QStringList queryLabels = File::get<QString>(queries, "Label", "-1");
  265 + const QList<int> targetPartitions = targets.crossValidationPartitions();
  266 + const QList<int> queryPartitions = queries.crossValidationPartitions();
281 267
282 Mat mask(queries.size(), 1, CV_8UC1); 268 Mat mask(queries.size(), 1, CV_8UC1);
283 for (int i=0; i<queries.size(); i++) { 269 for (int i=0; i<queries.size(); i++) {
@@ -289,7 +275,7 @@ cv::Mat BEE::makePairwiseMask(const br::FileList &amp;targets, const br::FileList &amp;q @@ -289,7 +275,7 @@ cv::Mat BEE::makePairwiseMask(const br::FileList &amp;targets, const br::FileList &amp;q
289 const QString labelB = targetLabels[i]; 275 const QString labelB = targetLabels[i];
290 const int partitionB = targetPartitions[i]; 276 const int partitionB = targetPartitions[i];
291 277
292 - Mask_t val; 278 + MaskValue val;
293 if (fileA == fileB) val = DontCare; 279 if (fileA == fileB) val = DontCare;
294 else if (labelA == "-1") val = DontCare; 280 else if (labelA == "-1") val = DontCare;
295 else if (labelB == "-1") val = DontCare; 281 else if (labelB == "-1") val = DontCare;
@@ -298,23 +284,21 @@ cv::Mat BEE::makePairwiseMask(const br::FileList &amp;targets, const br::FileList &amp;q @@ -298,23 +284,21 @@ cv::Mat BEE::makePairwiseMask(const br::FileList &amp;targets, const br::FileList &amp;q
298 else if (partitionB != partition) val = DontCare; 284 else if (partitionB != partition) val = DontCare;
299 else if (labelA == labelB) val = Match; 285 else if (labelA == labelB) val = Match;
300 else val = NonMatch; 286 else val = NonMatch;
301 - mask.at<Mask_t>(i,0) = val; 287 + mask.at<MaskValue>(i,0) = val;
302 } 288 }
303 289
304 return mask; 290 return mask;
305 } 291 }
306 292
307 -cv::Mat BEE::makeMask(const br::FileList &targets, const br::FileList &queries, int partition) 293 +Mat makeMask(const FileList &targets, const FileList &queries, int partition)
308 { 294 {
309 - // Direct use of "Label" isn't general, also would prefer to use indexProperty, rather than 295 + // TODO: Direct use of "Label" isn't general, also would prefer to use indexProperty, rather than
310 // doing string comparisons (but that isn't implemented yet for FileList) -cao 296 // doing string comparisons (but that isn't implemented yet for FileList) -cao
311 - QList<QString> targetLabels = File::get<QString>(targets, "Label", "-1");  
312 - QList<QString> queryLabels = File::get<QString>(queries, "Label", "-1");  
313 -  
314 - QList<int> targetPartitions = targets.crossValidationPartitions();  
315 - QList<int> queryPartitions = queries.crossValidationPartitions();  
316 -  
317 - QList<bool> targetsOnly = File::get<bool>(queries, "targetOnly", false); 297 + const QStringList targetLabels = File::get<QString>(targets, "Label", "-1");
  298 + const QStringList queryLabels = File::get<QString>(queries, "Label", "-1");
  299 + const QList<int> targetPartitions = targets.crossValidationPartitions();
  300 + const QList<int> queryPartitions = queries.crossValidationPartitions();
  301 + const QList<bool> targetsOnly = File::get<bool>(queries, "targetOnly", false);
318 302
319 Mat mask(queries.size(), targets.size(), CV_8UC1); 303 Mat mask(queries.size(), targets.size(), CV_8UC1);
320 for (int i=0; i<queries.size(); i++) { 304 for (int i=0; i<queries.size(); i++) {
@@ -328,7 +312,7 @@ cv::Mat BEE::makeMask(const br::FileList &amp;targets, const br::FileList &amp;queries, @@ -328,7 +312,7 @@ cv::Mat BEE::makeMask(const br::FileList &amp;targets, const br::FileList &amp;queries,
328 const QString labelB = targetLabels[j]; 312 const QString labelB = targetLabels[j];
329 const int partitionB = targetPartitions[j]; 313 const int partitionB = targetPartitions[j];
330 314
331 - Mask_t val; 315 + MaskValue val;
332 if (fileA == fileB) val = DontCare; 316 if (fileA == fileB) val = DontCare;
333 else if (targetOnly) val = DontCare; 317 else if (targetOnly) val = DontCare;
334 else if (labelA == "-1") val = DontCare; 318 else if (labelA == "-1") val = DontCare;
@@ -338,14 +322,14 @@ cv::Mat BEE::makeMask(const br::FileList &amp;targets, const br::FileList &amp;queries, @@ -338,14 +322,14 @@ cv::Mat BEE::makeMask(const br::FileList &amp;targets, const br::FileList &amp;queries,
338 else if (partitionB != partition) val = DontCare; 322 else if (partitionB != partition) val = DontCare;
339 else if (labelA == labelB) val = Match; 323 else if (labelA == labelB) val = Match;
340 else val = NonMatch; 324 else val = NonMatch;
341 - mask.at<Mask_t>(i,j) = val; 325 + mask.at<MaskValue>(i,j) = val;
342 } 326 }
343 } 327 }
344 328
345 return mask; 329 return mask;
346 } 330 }
347 331
348 -void BEE::combineMasks(const QStringList &inputMasks, const QString &outputMask, const QString &method) 332 +void combineMasks(const QStringList &inputMasks, const QString &outputMask, const QString &method)
349 { 333 {
350 qDebug("Combining %d masks to %s with method %s", inputMasks.size(), qPrintable(outputMask), qPrintable(method)); 334 qDebug("Combining %d masks to %s with method %s", inputMasks.size(), qPrintable(outputMask), qPrintable(method));
351 335
@@ -356,12 +340,12 @@ void BEE::combineMasks(const QStringList &amp;inputMasks, const QString &amp;outputMask, @@ -356,12 +340,12 @@ void BEE::combineMasks(const QStringList &amp;inputMasks, const QString &amp;outputMask,
356 340
357 QList<Mat> masks; 341 QList<Mat> masks;
358 foreach (const QString &inputMask, inputMasks) 342 foreach (const QString &inputMask, inputMasks)
359 - masks.append(readMat(inputMask));  
360 - if (masks.size() < 2) qFatal("Expected at least two masks."); 343 + masks.append(readMatrix(inputMask));
  344 + if (masks.size() < 2)
  345 + qFatal("Expected at least two masks.");
361 346
362 const int rows = masks.first().rows; 347 const int rows = masks.first().rows;
363 const int columns = masks.first().cols; 348 const int columns = masks.first().cols;
364 -  
365 Mat combinedMask(rows, columns, CV_8UC1); 349 Mat combinedMask(rows, columns, CV_8UC1);
366 for (int i=0; i<rows; i++) { 350 for (int i=0; i<rows; i++) {
367 for (int j=0; j<columns; j++) { 351 for (int j=0; j<columns; j++) {
@@ -369,7 +353,7 @@ void BEE::combineMasks(const QStringList &amp;inputMasks, const QString &amp;outputMask, @@ -369,7 +353,7 @@ void BEE::combineMasks(const QStringList &amp;inputMasks, const QString &amp;outputMask,
369 int imposterCount = 0; 353 int imposterCount = 0;
370 int dontcareCount = 0; 354 int dontcareCount = 0;
371 for (int k=0; k<masks.size(); k++) { 355 for (int k=0; k<masks.size(); k++) {
372 - switch (masks[k].at<Mask_t>(i,j)) { 356 + switch (masks[k].at<MaskValue>(i,j)) {
373 case Match: 357 case Match:
374 genuineCount++; 358 genuineCount++;
375 break; 359 break;
@@ -383,14 +367,16 @@ void BEE::combineMasks(const QStringList &amp;inputMasks, const QString &amp;outputMask, @@ -383,14 +367,16 @@ void BEE::combineMasks(const QStringList &amp;inputMasks, const QString &amp;outputMask,
383 } 367 }
384 if ((genuineCount != 0) && (imposterCount != 0)) qFatal("Comparison is both a genuine and an imposter."); 368 if ((genuineCount != 0) && (imposterCount != 0)) qFatal("Comparison is both a genuine and an imposter.");
385 369
386 - Mask_t val; 370 + MaskValue val;
387 if (genuineCount > 0) val = Match; 371 if (genuineCount > 0) val = Match;
388 else if (imposterCount > 0) val = NonMatch; 372 else if (imposterCount > 0) val = NonMatch;
389 else val = DontCare; 373 else val = DontCare;
390 if (AND && (dontcareCount > 0)) val = DontCare; 374 if (AND && (dontcareCount > 0)) val = DontCare;
391 - combinedMask.at<Mask_t>(i,j) = val; 375 + combinedMask.at<MaskValue>(i,j) = val;
392 } 376 }
393 } 377 }
394 378
395 - writeMat(combinedMask, outputMask, "Combined_Targets", "Combined_Queries"); 379 + writeMatrix(combinedMask, outputMask, "Combined_Targets", "Combined_Queries");
396 } 380 }
  381 +
  382 +} // namespace BEE
openbr/core/bee.h
@@ -17,30 +17,29 @@ @@ -17,30 +17,29 @@
17 #ifndef BEE_BEE_H 17 #ifndef BEE_BEE_H
18 #define BEE_BEE_H 18 #define BEE_BEE_H
19 19
20 -#include <QList>  
21 -#include <QPair>  
22 -#include <QHash>  
23 #include <QString> 20 #include <QString>
24 #include <QStringList> 21 #include <QStringList>
25 #include <opencv2/core/core.hpp> 22 #include <opencv2/core/core.hpp>
26 #include <openbr/openbr_plugin.h> 23 #include <openbr/openbr_plugin.h>
27 24
28 -/*** Functions for parsing BEE style data structures. ***/ 25 +/*!
  26 + * Functions for parsing NIST BEE data structures.
  27 + */
29 namespace BEE 28 namespace BEE
30 { 29 {
31 - const uchar Match(0xff);  
32 - const uchar NonMatch(0x7f);  
33 - const uchar DontCare(0x00);  
34 - typedef float Simmat_t;  
35 - typedef uchar Mask_t; 30 + typedef float SimmatValue;
  31 + typedef uchar MaskValue;
  32 + const MaskValue Match(0xff);
  33 + const MaskValue NonMatch(0x7f);
  34 + const MaskValue DontCare(0x00);
36 35
37 // Sigset 36 // Sigset
38 br::FileList readSigset(const br::File &sigset, bool ignoreMetadata = false); 37 br::FileList readSigset(const br::File &sigset, bool ignoreMetadata = false);
39 void writeSigset(const QString &sigset, const br::FileList &files, bool ignoreMetadata = false); 38 void writeSigset(const QString &sigset, const br::FileList &files, bool ignoreMetadata = false);
40 39
41 // Matrix 40 // Matrix
42 - cv::Mat readMat(const br::File & mat, QString * targetSigset = NULL, QString * querySigset = NULL);  
43 - void writeMat(const cv::Mat &m, const QString &simmat, const QString &targetSigset = "Unknown_Target", const QString &querySigset = "Unknown_Query"); 41 + cv::Mat readMatrix(const br::File &mat, QString *targetSigset = NULL, QString *querySigset = NULL);
  42 + void writeMatrix(const cv::Mat &m, const QString &fileName, const QString &targetSigset = "Unknown_Target", const QString &querySigset = "Unknown_Query");
44 void readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset); 43 void readMatrixHeader(const QString &matrix, QString *targetSigset, QString *querySigset);
45 void writeMatrixHeader(const QString &matrix, const QString &targetSigset, const QString &querySigset); 44 void writeMatrixHeader(const QString &matrix, const QString &targetSigset, const QString &querySigset);
46 45
openbr/core/core.cpp
@@ -672,7 +672,7 @@ void br::Convert(const File &amp;fileType, const File &amp;inputFile, const File &amp;output @@ -672,7 +672,7 @@ void br::Convert(const File &amp;fileType, const File &amp;inputFile, const File &amp;output
672 while (!done) after->writeBlock(before->readBlock(&done)); 672 while (!done) after->writeBlock(before->readBlock(&done));
673 } else if (fileType == "Output") { 673 } else if (fileType == "Output") {
674 QString target, query; 674 QString target, query;
675 - cv::Mat m = BEE::readMat(inputFile, &target, &query); 675 + cv::Mat m = BEE::readMatrix(inputFile, &target, &query);
676 const FileList targetFiles = TemplateList::fromGallery(target).files(); 676 const FileList targetFiles = TemplateList::fromGallery(target).files();
677 const FileList queryFiles = TemplateList::fromGallery(query).files(); 677 const FileList queryFiles = TemplateList::fromGallery(query).files();
678 678
openbr/core/eval.cpp
@@ -99,7 +99,7 @@ float Evaluate(const QString &amp;simmat, const QString &amp;mask, const QString &amp;csv) @@ -99,7 +99,7 @@ float Evaluate(const QString &amp;simmat, const QString &amp;mask, const QString &amp;csv)
99 QString target, query; 99 QString target, query;
100 Mat scores; 100 Mat scores;
101 if (simmat.endsWith(".mtx")) { 101 if (simmat.endsWith(".mtx")) {
102 - scores = BEE::readMat(simmat, &target, &query); 102 + scores = BEE::readMatrix(simmat, &target, &query);
103 } else { 103 } else {
104 QScopedPointer<Format> format(Factory<Format>::make(simmat)); 104 QScopedPointer<Format> format(Factory<Format>::make(simmat));
105 scores = format->read(); 105 scores = format->read();
@@ -144,8 +144,8 @@ float Evaluate(const Mat &amp;simmat, const Mat &amp;mask, const QString &amp;csv) @@ -144,8 +144,8 @@ float Evaluate(const Mat &amp;simmat, const Mat &amp;mask, const QString &amp;csv)
144 int genuineCount = 0, impostorCount = 0, numNaNs = 0; 144 int genuineCount = 0, impostorCount = 0, numNaNs = 0;
145 for (int i=0; i<simmat.rows; i++) { 145 for (int i=0; i<simmat.rows; i++) {
146 for (int j=0; j<simmat.cols; j++) { 146 for (int j=0; j<simmat.cols; j++) {
147 - const BEE::Mask_t mask_val = mask.at<BEE::Mask_t>(i,j);  
148 - const BEE::Simmat_t simmat_val = simmat.at<BEE::Simmat_t>(i,j); 147 + const BEE::MaskValue mask_val = mask.at<BEE::MaskValue>(i,j);
  148 + const BEE::SimmatValue simmat_val = simmat.at<BEE::SimmatValue>(i,j);
149 if (mask_val == BEE::DontCare) continue; 149 if (mask_val == BEE::DontCare) continue;
150 if (simmat_val != simmat_val) { numNaNs++; continue; } 150 if (simmat_val != simmat_val) { numNaNs++; continue; }
151 comparisons.append(Comparison(simmat_val, j, i, mask_val == BEE::Match)); 151 comparisons.append(Comparison(simmat_val, j, i, mask_val == BEE::Match));
@@ -315,7 +315,7 @@ float InplaceEval(const QString &amp; simmat, const QString &amp; target, const QString @@ -315,7 +315,7 @@ float InplaceEval(const QString &amp; simmat, const QString &amp; target, const QString
315 qint64 cols = words[2].toLongLong(); 315 qint64 cols = words[2].toLongLong();
316 316
317 bool isMask = words[0][1] == 'B'; 317 bool isMask = words[0][1] == 'B';
318 - qint64 typeSize = isMask ? sizeof(BEE::Mask_t) : sizeof(BEE::Simmat_t); 318 + qint64 typeSize = isMask ? sizeof(BEE::MaskValue) : sizeof(BEE::SimmatValue);
319 319
320 // Get matrix data 320 // Get matrix data
321 qint64 rowSize = cols * typeSize; 321 qint64 rowSize = cols * typeSize;
openbr/core/fuse.cpp
@@ -39,7 +39,7 @@ static void normalizeMatrix(Mat &amp;matrix, const Mat &amp;mask, const QString &amp;method) @@ -39,7 +39,7 @@ static void normalizeMatrix(Mat &amp;matrix, const Mat &amp;mask, const QString &amp;method)
39 for (int i=0; i<matrix.rows; i++) { 39 for (int i=0; i<matrix.rows; i++) {
40 for (int j=0; j<matrix.cols; j++) { 40 for (int j=0; j<matrix.cols; j++) {
41 float val = matrix.at<float>(i,j); 41 float val = matrix.at<float>(i,j);
42 - if ((mask.at<BEE::Mask_t>(i,j) == BEE::DontCare) || 42 + if ((mask.at<BEE::MaskValue>(i,j) == BEE::DontCare) ||
43 (val == -std::numeric_limits<float>::max()) || 43 (val == -std::numeric_limits<float>::max()) ||
44 (val == std::numeric_limits<float>::max())) 44 (val == std::numeric_limits<float>::max()))
45 continue; 45 continue;
@@ -55,7 +55,7 @@ static void normalizeMatrix(Mat &amp;matrix, const Mat &amp;mask, const QString &amp;method) @@ -55,7 +55,7 @@ static void normalizeMatrix(Mat &amp;matrix, const Mat &amp;mask, const QString &amp;method)
55 if (method == "MinMax") { 55 if (method == "MinMax") {
56 for (int i=0; i<matrix.rows; i++) { 56 for (int i=0; i<matrix.rows; i++) {
57 for (int j=0; j<matrix.cols; j++) { 57 for (int j=0; j<matrix.cols; j++) {
58 - if (mask.at<BEE::Mask_t>(i,j) == BEE::DontCare) continue; 58 + if (mask.at<BEE::MaskValue>(i,j) == BEE::DontCare) continue;
59 float &val = matrix.at<float>(i,j); 59 float &val = matrix.at<float>(i,j);
60 if (val == -std::numeric_limits<float>::max()) val = 0; 60 if (val == -std::numeric_limits<float>::max()) val = 0;
61 else if (val == std::numeric_limits<float>::max()) val = 1; 61 else if (val == std::numeric_limits<float>::max()) val = 1;
@@ -66,7 +66,7 @@ static void normalizeMatrix(Mat &amp;matrix, const Mat &amp;mask, const QString &amp;method) @@ -66,7 +66,7 @@ static void normalizeMatrix(Mat &amp;matrix, const Mat &amp;mask, const QString &amp;method)
66 if (stddev == 0) qFatal("Stddev is 0."); 66 if (stddev == 0) qFatal("Stddev is 0.");
67 for (int i=0; i<matrix.rows; i++) { 67 for (int i=0; i<matrix.rows; i++) {
68 for (int j=0; j<matrix.cols; j++) { 68 for (int j=0; j<matrix.cols; j++) {
69 - if (mask.at<BEE::Mask_t>(i,j) == BEE::DontCare) continue; 69 + if (mask.at<BEE::MaskValue>(i,j) == BEE::DontCare) continue;
70 float &val = matrix.at<float>(i,j); 70 float &val = matrix.at<float>(i,j);
71 if (val == -std::numeric_limits<float>::max()) val = (min - mean) / stddev; 71 if (val == -std::numeric_limits<float>::max()) val = (min - mean) / stddev;
72 else if (val == std::numeric_limits<float>::max()) val = (max - mean) / stddev; 72 else if (val == std::numeric_limits<float>::max()) val = (max - mean) / stddev;
@@ -85,7 +85,7 @@ void br::Fuse(const QStringList &amp;inputSimmats, const QString &amp;normalization, con @@ -85,7 +85,7 @@ void br::Fuse(const QStringList &amp;inputSimmats, const QString &amp;normalization, con
85 QString target, query, previousTarget, previousQuery; 85 QString target, query, previousTarget, previousQuery;
86 QList<Mat> originalMatrices; 86 QList<Mat> originalMatrices;
87 foreach (const QString &simmat, inputSimmats) { 87 foreach (const QString &simmat, inputSimmats) {
88 - originalMatrices.append(BEE::readMat(simmat,&target,&query)); 88 + originalMatrices.append(BEE::readMatrix(simmat,&target,&query));
89 // Make we're fusing score matrices for the same set of targets and querys 89 // Make we're fusing score matrices for the same set of targets and querys
90 if (!previousTarget.isEmpty() && !previousQuery.isEmpty() && (previousTarget != target || previousQuery != query)) 90 if (!previousTarget.isEmpty() && !previousQuery.isEmpty() && (previousTarget != target || previousQuery != query))
91 qFatal("Target or query files are not the same across fused matrices."); 91 qFatal("Target or query files are not the same across fused matrices.");
@@ -163,5 +163,5 @@ void br::Fuse(const QStringList &amp;inputSimmats, const QString &amp;normalization, con @@ -163,5 +163,5 @@ void br::Fuse(const QStringList &amp;inputSimmats, const QString &amp;normalization, con
163 163
164 } while (partition < crossValidate); 164 } while (partition < crossValidate);
165 165
166 - BEE::writeMat(buffer, outputSimmat); 166 + BEE::writeMatrix(buffer, outputSimmat);
167 } 167 }
openbr/plugins/format.cpp
@@ -293,12 +293,12 @@ class mtxFormat : public Format @@ -293,12 +293,12 @@ class mtxFormat : public Format
293 293
294 Template read() const 294 Template read() const
295 { 295 {
296 - return BEE::readMat(file); 296 + return BEE::readMatrix(file);
297 } 297 }
298 298
299 void write(const Template &t) const 299 void write(const Template &t) const
300 { 300 {
301 - BEE::writeMat(t, file); 301 + BEE::writeMatrix(t, file);
302 } 302 }
303 }; 303 };
304 304