- if (size == 3) {
- // Found just enough -- hope these are good!
- vector<Ref<FinderPattern> > result(3);
- result[0] = possibleCenters_[0];
- result[1] = possibleCenters_[1];
- result[2] = possibleCenters_[2];
- return result;
+ // Filter outlier possibilities whose module size is too different
+ if (startSize > 3) {
+ // But we can only afford to do so if we have at least 4 possibilities to choose from
+ float totalModuleSize = 0.0f;
+ for (size_t i = 0; i < startSize; i++) {
+ totalModuleSize += possibleCenters_[i]->getEstimatedModuleSize();
+ }
+ float average = totalModuleSize / (float) startSize;
+ for (size_t i = 0; i < possibleCenters_.size() && possibleCenters_.size() > 3; i++) {
+ if (abs(possibleCenters_[i]->getEstimatedModuleSize() - average) > 0.2f * average) {
+ possibleCenters_.erase(possibleCenters_.begin()+i);
+ i--;
+ }
+ }