+ throw NotFoundException.getNotFoundInstance();\r
+ }\r
+\r
+ // Filter outlier possibilities whose module size is too different\r
+ if (startSize > 3) {\r
+ // But we can only afford to do so if we have at least 4 possibilities to choose from\r
+ float totalModuleSize = 0.0f;\r
+ float square = 0.0f;\r
+ for (int i = 0; i < startSize; i++) {\r
+ float size = ((FinderPattern) possibleCenters.elementAt(i)).getEstimatedModuleSize();\r
+ totalModuleSize += size;\r
+ square += size * size;\r
+ }\r
+ float average = totalModuleSize / (float) startSize;\r
+ float stdDev = (float) Math.sqrt(square / startSize - average * average);\r
+\r
+ Collections.insertionSort(possibleCenters, new FurthestFromAverageComparator(average));\r
+\r
+ float limit = Math.max(0.2f * average, stdDev);\r
+\r
+ for (int i = 0; i < possibleCenters.size() && possibleCenters.size() > 3; i++) {\r
+ FinderPattern pattern = (FinderPattern) possibleCenters.elementAt(i);\r
+ if (Math.abs(pattern.getEstimatedModuleSize() - average) > limit) {\r
+ possibleCenters.removeElementAt(i);\r
+ i--;\r
+ }\r
+ }\r