Commit 41df5d5d13fce72b1988bb7c857a85bd9f4630d7
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 | ... | ... |