mirror of
https://github.com/zxing/zxing.git
synced 2025-02-02 05:41:08 -08:00
Improved notion of pattern variance in 1D barcode elements, improving decode accuracy slightly. Also fixed a small issue in Code 128 decoder.
git-svn-id: https://zxing.googlecode.com/svn/trunk@211 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
69c53f63c7
commit
f363480487
|
@ -116,9 +116,8 @@ public abstract class AbstractOneDReader implements OneDReader {
|
|||
|
||||
/**
|
||||
* Determines how closely a set of observed counts of runs of black/white values matches a given
|
||||
* target pattern. For each counter, the ratio of the difference between it and the pattern value
|
||||
* is compared to the expected pattern value. This ratio is averaged across counters to produce
|
||||
* the return value. 0.0 means an exact match; higher values mean poorer matches.
|
||||
* target pattern. This is reported as the ratio of the total variance from the expected pattern proportions
|
||||
* across all pattern elements, to the length of the pattern.
|
||||
*
|
||||
* @param counters observed counters
|
||||
* @param pattern expected pattern
|
||||
|
@ -139,9 +138,9 @@ public abstract class AbstractOneDReader implements OneDReader {
|
|||
float scaledCounter = (float) counters[x] / unitBarWidth;
|
||||
float width = pattern[x];
|
||||
float abs = scaledCounter > width ? scaledCounter - width : width - scaledCounter;
|
||||
totalVariance += abs / width;
|
||||
totalVariance += abs;
|
||||
}
|
||||
return totalVariance / (float) numCounters;
|
||||
return totalVariance / (float) patternLength;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -139,7 +139,7 @@ public final class Code128Reader extends AbstractOneDReader {
|
|||
{2, 3, 3, 1, 1, 1, 2}
|
||||
};
|
||||
|
||||
private static final float MAX_VARIANCE = 0.4f;
|
||||
private static final float MAX_VARIANCE = 0.3f;
|
||||
|
||||
private static final int CODE_SHIFT = 98;
|
||||
|
||||
|
@ -180,11 +180,18 @@ public final class Code128Reader extends AbstractOneDReader {
|
|||
counters[counterPosition]++;
|
||||
} else {
|
||||
if (counterPosition == patternLength - 1) {
|
||||
float bestVariance = MAX_VARIANCE;
|
||||
int bestMatch = -1;
|
||||
for (int startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) {
|
||||
if (patternMatchVariance(counters, CODE_PATTERNS[startCode]) < MAX_VARIANCE) {
|
||||
return new int[]{patternStart, i, startCode};
|
||||
float variance = patternMatchVariance(counters, CODE_PATTERNS[startCode]);
|
||||
if (variance < bestVariance) {
|
||||
bestVariance = variance;
|
||||
bestMatch = startCode;
|
||||
}
|
||||
}
|
||||
if (bestMatch >= 0) {
|
||||
return new int[]{patternStart, i, bestMatch};
|
||||
}
|
||||
patternStart += counters[0] + counters[1];
|
||||
for (int y = 2; y < patternLength; y++) {
|
||||
counters[y - 2] = counters[y];
|
||||
|
@ -202,7 +209,7 @@ public final class Code128Reader extends AbstractOneDReader {
|
|||
|
||||
private static int decodeCode(BitArray row, int[] counters, int rowOffset) throws ReaderException {
|
||||
recordPattern(row, rowOffset, counters);
|
||||
float bestVariance = 0.4f; // worst variance we'll accept
|
||||
float bestVariance = MAX_VARIANCE; // worst variance we'll accept
|
||||
int bestMatch = -1;
|
||||
for (int d = 0; d < CODE_PATTERNS.length; d++) {
|
||||
int[] pattern = CODE_PATTERNS[d];
|
||||
|
|
Loading…
Reference in a new issue