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 285 class RecursiveProductQuantizationDistance : public Distance
286 286 {
287 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 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  
... ...