Commit 41df5d5d13fce72b1988bb7c857a85bd9f4630d7

Authored by Josh Klontz
1 parent ca4f10d5

implemented coarse to fine matching

Showing 1 changed file with 30 additions and 13 deletions
openbr/plugins/quantize.cpp
@@ -285,23 +285,40 @@ BR_REGISTER(Distance, ProductQuantizationDistance) @@ -285,23 +285,40 @@ BR_REGISTER(Distance, ProductQuantizationDistance)
285 class RecursiveProductQuantizationDistance : public Distance 285 class RecursiveProductQuantizationDistance : public Distance
286 { 286 {
287 Q_OBJECT 287 Q_OBJECT
  288 + Q_PROPERTY(float t READ get_t WRITE set_t RESET reset_t STORED false)
  289 + BR_PROPERTY(float, t, -1)
288 290
289 float compare(const Template &a, const Template &b) const 291 float compare(const Template &a, const Template &b) const
290 { 292 {
291 - float distance = 0;  
292 - for (int i=0; i<a.size(); i++) {  
293 - const int elements = a[i].total()-sizeof(quint16);  
294 - uchar *aData = a[i].data;  
295 - uchar *bData = b[i].data;  
296 - quint16 index = *reinterpret_cast<quint16*>(aData);  
297 - aData += sizeof(quint16);  
298 - bData += sizeof(quint16); 293 + return compareRecursive(a, b, 0, a.size(), 0);
  294 + }
299 295
300 - const float *lut = (const float*)ProductQuantizationLUTs[index].data;  
301 - for (int j=0; j<elements; j++)  
302 - distance += lut[j*256*256 + aData[j]*256+bData[j]];  
303 - }  
304 - return distance; 296 + float compareRecursive(const QList<cv::Mat> &a, const QList<cv::Mat> &b, int i, int size, float evidence) const
  297 + {
  298 + float similarity = 0;
  299 +
  300 + const int elements = a[i].total()-sizeof(quint16);
  301 + uchar *aData = a[i].data;
  302 + uchar *bData = b[i].data;
  303 + quint16 index = *reinterpret_cast<quint16*>(aData);
  304 + aData += sizeof(quint16);
  305 + bData += sizeof(quint16);
  306 +
  307 + const float *lut = (const float*)ProductQuantizationLUTs[index].data;
  308 + for (int j=0; j<elements; j++)
  309 + similarity += lut[j*256*256 + aData[j]*256+bData[j]];
  310 +
  311 + evidence += similarity;
  312 + if (evidence < t) return 0;
  313 +
  314 + // similarity = max(similarity, 0.f);
  315 + const int subSize = (size-1)/4;
  316 + if (subSize == 0) return similarity;
  317 + return max(similarity
  318 + + compareRecursive(a, b, i+1+0*subSize, subSize, evidence)
  319 + + compareRecursive(a, b, i+1+1*subSize, subSize, evidence)
  320 + + compareRecursive(a, b, i+1+2*subSize, subSize, evidence)
  321 + + compareRecursive(a, b, i+1+3*subSize, subSize, evidence),0.f);
305 } 322 }
306 }; 323 };
307 324