Adjust tolerance of method that decides whether a finder/alignment pattern has been crossed so that it passes on low resolution images more correctly -- just a matter of resorting to some floating point math.

git-svn-id: https://zxing.googlecode.com/svn/trunk@18 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen 2007-11-07 19:18:50 +00:00
parent 149c7f1b8a
commit f0a299ec80
2 changed files with 10 additions and 8 deletions

View file

@ -164,8 +164,9 @@ final class AlignmentPatternFinder {
*/ */
private boolean foundPatternCross(int[] stateCount) { private boolean foundPatternCross(int[] stateCount) {
float moduleSize = this.moduleSize; float moduleSize = this.moduleSize;
float maxVariance = moduleSize / 2.5f;
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
if (2.0f * Math.abs(moduleSize - stateCount[i]) >= moduleSize) { if (Math.abs(moduleSize - stateCount[i]) >= maxVariance) {
return false; return false;
} }
} }

View file

@ -178,13 +178,14 @@ final class FinderPatternFinder {
if (totalModuleSize < 7) { if (totalModuleSize < 7) {
return false; return false;
} }
int moduleSize = totalModuleSize / 7; float moduleSize = (float) totalModuleSize / 7.0f;
// Allow less than 50% deviance from 1-1-3-1-1 pattern float maxVariance = moduleSize / 2.5f;
return Math.abs(moduleSize - stateCount[0]) << 1 <= moduleSize && // Allow less than 40% variance from 1-1-3-1-1 proportions
Math.abs(moduleSize - stateCount[1]) << 1 <= moduleSize && return Math.abs(moduleSize - stateCount[0]) < maxVariance &&
Math.abs(3 * moduleSize - stateCount[2]) << 1 <= 3 * moduleSize && Math.abs(moduleSize - stateCount[1]) < maxVariance &&
Math.abs(moduleSize - stateCount[3]) << 1 <= moduleSize && Math.abs(3.0f * moduleSize - stateCount[2]) < 3.0f * maxVariance &&
Math.abs(moduleSize - stateCount[4]) << 1 <= moduleSize; Math.abs(moduleSize - stateCount[3]) < maxVariance &&
Math.abs(moduleSize - stateCount[4]) < maxVariance;
} }
/** /**