[SCM] Multi-format 1D/2D barcode image processing library branch, upstream, updated. 24d4480bc48cf9eabf7b2bd2f528248b0e458809
srowen
srowen at 59b500cc-1b3d-0410-9834-0bbf25fbcc57
Wed Aug 4 01:31:50 UTC 2010
The following commit has been merged in the upstream branch:
commit f2200f8ebe0f0eef72b8b916d085506a94c774b0
Author: srowen <srowen at 59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Date: Mon May 31 12:49:29 2010 +0000
Update Codabar style and disable it as its causing too many false positives
git-svn-id: http://zxing.googlecode.com/svn/trunk@1403 59b500cc-1b3d-0410-9834-0bbf25fbcc57
diff --git a/core/src/com/google/zxing/MultiFormatReader.java b/core/src/com/google/zxing/MultiFormatReader.java
index aab25ff..9784760 100644
--- a/core/src/com/google/zxing/MultiFormatReader.java
+++ b/core/src/com/google/zxing/MultiFormatReader.java
@@ -99,7 +99,7 @@ public final class MultiFormatReader implements Reader {
formats.contains(BarcodeFormat.UPC_E) ||
formats.contains(BarcodeFormat.EAN_13) ||
formats.contains(BarcodeFormat.EAN_8) ||
- formats.contains(BarcodeFormat.CODABAR) ||
+ //formats.contains(BarcodeFormat.CODABAR) ||
formats.contains(BarcodeFormat.CODE_39) ||
formats.contains(BarcodeFormat.CODE_93) ||
formats.contains(BarcodeFormat.CODE_128) ||
diff --git a/core/src/com/google/zxing/oned/CodaBarReader.java b/core/src/com/google/zxing/oned/CodaBarReader.java
index ff677cb..a3382b6 100644
--- a/core/src/com/google/zxing/oned/CodaBarReader.java
+++ b/core/src/com/google/zxing/oned/CodaBarReader.java
@@ -16,144 +16,123 @@
package com.google.zxing.oned;
+import java.util.Hashtable;
+
import com.google.zxing.BarcodeFormat;
-import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitArray;
-import java.util.Hashtable;
/**
- * <p>Decodes Codabar barcodes. </p>
+ * <p>Decodes Codabar barcodes.</p>
*
* @author Bas Vijfwinkel
*/
public final class CodaBarReader extends OneDReader {
- private static final String ALPHABET_STRING = "0123456789-$:/.+ABCDTN";
- private static final char[] ALPHABET = ALPHABET_STRING.toCharArray();
+ private static final String ALPHABET_STRING = "0123456789-$:/.+ABCDTN";
+ private static final char[] ALPHABET = ALPHABET_STRING.toCharArray();
+
+ /**
+ * These represent the encodings of characters, as patterns of wide and narrow bars. The 7 least-significant bits of
+ * each int correspond to the pattern of wide and narrow, with 1s representing "wide" and 0s representing narrow. NOTE
+ * : c is equal to the * pattern NOTE : d is equal to the e pattern
+ */
+ private static final int[] CHARACTER_ENCODINGS = {
+ 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, // 0-9
+ 0x00c, 0x018, 0x025, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, // -$:/.+ABCD
+ 0x01A, 0x029 //TN
+ };
+
+ // multiple start/end patterns
+ // official start and end patterns
+ // some codabar generator allow the codabar string to be closed by every character
+ private static final char[] STARTEND_ENCODING = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '$', ':', '/', '.', '+', 'A', 'B', 'C', 'D', 'T', 'N'};
+
+ public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws NotFoundException {
+ int[] start = findAsteriskPattern(row);
+ start[1] = 0; // BAS: settings this to 0 improves the recognition rate somehow?
+ int nextStart = start[1];
+ int end = row.getSize();
+
+ // Read off white space
+ while (nextStart < end && !row.get(nextStart)) {
+ nextStart++;
+ }
- /**
- * These represent the encodings of characters, as patterns of wide and narrow bars.
- * The 7 least-significant bits of each int correspond to the pattern of wide and narrow,
- * with 1s representing "wide" and 0s representing narrow.
- * NOTE : c is equal to the * pattern
- * NOTE : d is equal to the e pattern
- */
+ StringBuffer result = new StringBuffer();
+ //int[] counters = new int[7];
+ int[] counters;
+ int lastStart;
- private static final int[] CHARACTER_ENCODINGS = {
- 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, // 0-9
- 0x00c, 0x018, 0x025, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, // -$:/.+ABCD
- 0x01A,0x029 //TN
- };
-
- // multiple start/end patterns
- // official start and end patterns
- //private static final char[] STARTEND_ENCODING = {'$','A','B','C','D','T','N','+'};
- // some codabar generator allow the codabar string to be closed by every character
- private static final char[] STARTEND_ENCODING = {'0','1','2','3','4','5','6','7','8','9','-','$',':','/','.','+','A','B','C','D','T','N'};
+ do {
+ counters = new int[]{0, 0, 0, 0, 0, 0, 0}; // reset counters
+ recordPattern(row, nextStart, counters);
- public CodaBarReader()
- {
- }
+ char decodedChar = toNarrowWidePattern(counters);
+ if (decodedChar == '!') {
+ throw NotFoundException.getNotFoundInstance();
+ }
+ result.append(decodedChar);
+ lastStart = nextStart;
+ for (int i = 0; i < counters.length; i++) {
+ nextStart += counters[i];
+ }
+ // Read off white space
+ while (nextStart < end && !row.get(nextStart)) {
+ nextStart++;
+ }
+ } while (nextStart < end); // no fixed end pattern so keep on reading while data is available
+
+ // find last character in STARTEND_ENCODING
+ for (int k = result.length() - 1; k >= 0; k--) {
+ if (arrayContains(STARTEND_ENCODING, result.charAt(k))) {
+ // valid character -> remove and break out of loop
+ result.deleteCharAt(k);
+ k = -1;// break out of loop
+ } else {
+ // not a valid character -> remove anyway
+ result.deleteCharAt(k);
+ }
+ }
- public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws FormatException, NotFoundException
- {
- int[] start;
- start = findAsteriskPattern(row);
- start[1] = 0; // BAS: settings this to 0 improves the recognition rate somehow?
- int nextStart = start[1];
- int end = row.getSize();
-
- // Read off white space
- while (nextStart < end && !row.get(nextStart))
- {
- nextStart++;
- }
- StringBuffer result = new StringBuffer();
- //int[] counters = new int[7];
- int[] counters;
- char decodedChar;
- int lastStart;
-
- do
- {
- counters = new int[] {0,0,0,0,0,0,0} ; // reset counters
- recordPattern(row, nextStart, counters);
-
- decodedChar = toNarrowWidePattern(counters);
- if (decodedChar == '!')
- {
- throw NotFoundException.getNotFoundInstance();
- }
- result.append(decodedChar);
- lastStart = nextStart;
- for (int i = 0; i < counters.length; i++)
- {
- nextStart += counters[i];
- }
-
- // Read off white space
- while (nextStart < end && !row.get(nextStart))
- {
- nextStart++;
- }
- } while (nextStart < end); // no fixed end pattern so keep on reading while data is available
+ // remove first character
+ if (result.length() > 0) {
+ result.deleteCharAt(0);
+ }
+
+ // Look for whitespace after pattern:
+ int lastPatternSize = 0;
+ for (int i = 0; i < counters.length; i++) {
+ lastPatternSize += counters[i];
+ }
+ int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
+ // If 50% of last pattern size, following last pattern, is not whitespace, fail
+ // (but if it's whitespace to the very end of the image, that's OK)
+ if ((nextStart) != end && (whiteSpaceAfterEnd / 2 < lastPatternSize)) {
+ throw NotFoundException.getNotFoundInstance();
+ }
- // find last character in STARTEND_ENCODING
- for (int k = result.length()-1;k >= 0;k--)
- {
- if (arrayContains(STARTEND_ENCODING,result.charAt(k)))
- {
- // valid character -> remove and break out of loop
- result.deleteCharAt(k);
- k=-1;// break out of loop
- }
- else
- {
- // not a valid character -> remove anyway
- result.deleteCharAt(k);
- }
- }
-
-
- // remove first character
- if (result.length() > 0) {result.deleteCharAt(0);}
- // Look for whitespace after pattern:
- int lastPatternSize = 0;
- for (int i = 0; i < counters.length; i++)
- {
- lastPatternSize += counters[i];
- }
- int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
- // If 50% of last pattern size, following last pattern, is not whitespace, fail
- // (but if it's whitespace to the very end of the image, that's OK)
- if ((nextStart) != end && (whiteSpaceAfterEnd / 2 < lastPatternSize))
- {
- throw NotFoundException.getNotFoundInstance();
- }
-
+ String resultString = result.toString();
+ if (resultString.length() == 0) {
+ // Almost surely a false positive
+ throw NotFoundException.getNotFoundInstance();
+ }
- String resultString = result.toString();
- if (resultString.length() == 0)
- {
- // Almost surely a false positive
- throw NotFoundException.getNotFoundInstance();
- }
-
- float left = (float) (start[1] + start[0]) / 2.0f;
- float right = (float) (nextStart + lastStart) / 2.0f;
- return new Result(
- resultString,
- null,
- new ResultPoint[]{
- new ResultPoint(left, (float) rowNumber),
- new ResultPoint(right, (float) rowNumber)},
- BarcodeFormat.CODABAR);
+ float left = (float) (start[1] + start[0]) / 2.0f;
+ float right = (float) (nextStart + lastStart) / 2.0f;
+ return new Result(
+ resultString,
+ null,
+ new ResultPoint[]{
+ new ResultPoint(left, (float) rowNumber),
+ new ResultPoint(right, (float) rowNumber)},
+ BarcodeFormat.CODABAR);
}
private static int[] findAsteriskPattern(BitArray row) throws NotFoundException {
@@ -179,8 +158,7 @@ public final class CodaBarReader extends OneDReader {
} else {
if (counterPosition == patternLength - 1) {
try {
- if (arrayContains(STARTEND_ENCODING,toNarrowWidePattern(counters)))
- {
+ if (arrayContains(STARTEND_ENCODING, toNarrowWidePattern(counters))) {
// Look for whitespace before start pattern, >= 50% of width of start pattern
if (row.isRange(Math.max(0, patternStart - (i - patternStart) / 2), patternStart, false)) {
return new int[]{patternStart, i};
@@ -206,60 +184,54 @@ public final class CodaBarReader extends OneDReader {
throw NotFoundException.getNotFoundInstance();
}
- private static boolean arrayContains(char[] array, char key)
- {
- if (array != null)
- {
- for (int i=0;i<array.length;i++)
- {
- if (array[i] == key) { return true; }
- }
- }
- return false;
+ private static boolean arrayContains(char[] array, char key) {
+ if (array != null) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == key) {
+ return true;
+ }
+ }
+ }
+ return false;
}
- private static char toNarrowWidePattern(int[] counters) {
- // BAS : I have changed the following part because some codabar images would fail with the original routine
- // I took from the Code39Reader.java file
- // ----------- change start
+ private static char toNarrowWidePattern(int[] counters) {
+ // BAS : I have changed the following part because some codabar images would fail with the original routine
+ // I took from the Code39Reader.java file
+ // ----------- change start
int numCounters = counters.length;
int maxNarrowCounter = 0;
- int wideCounters;
- int minCounter = Integer.MAX_VALUE;
- for (int i = 0; i < numCounters; i++)
- {
- if (counters[i] < minCounter) { minCounter = counters[i]; }
- if (counters[i] > maxNarrowCounter) { maxNarrowCounter = counters[i]; }
- }
- // ---------- change end
+ int minCounter = Integer.MAX_VALUE;
+ for (int i = 0; i < numCounters; i++) {
+ if (counters[i] < minCounter) {
+ minCounter = counters[i];
+ }
+ if (counters[i] > maxNarrowCounter) {
+ maxNarrowCounter = counters[i];
+ }
+ }
+ // ---------- change end
- do
- {
- wideCounters = 0;
- int totalWideCountersWidth = 0;
+ do {
+ int wideCounters = 0;
int pattern = 0;
for (int i = 0; i < numCounters; i++) {
- int counter = counters[i];
if (counters[i] > maxNarrowCounter) {
pattern |= 1 << (numCounters - 1 - i);
wideCounters++;
- totalWideCountersWidth += counter;
}
}
-
- if ((wideCounters == 2) || (wideCounters == 3))
- {
- for (int i = 0; i < CHARACTER_ENCODINGS.length; i++)
- {
- if (CHARACTER_ENCODINGS[i] == pattern)
- {
- return ALPHABET[i];
- }
- }
+
+ if ((wideCounters == 2) || (wideCounters == 3)) {
+ for (int i = 0; i < CHARACTER_ENCODINGS.length; i++) {
+ if (CHARACTER_ENCODINGS[i] == pattern) {
+ return ALPHABET[i];
+ }
+ }
}
- maxNarrowCounter--;
+ maxNarrowCounter--;
} while (maxNarrowCounter > minCounter);
return '!';
}
diff --git a/core/src/com/google/zxing/oned/MultiFormatOneDReader.java b/core/src/com/google/zxing/oned/MultiFormatOneDReader.java
index f92af71..fa3de5d 100644
--- a/core/src/com/google/zxing/oned/MultiFormatOneDReader.java
+++ b/core/src/com/google/zxing/oned/MultiFormatOneDReader.java
@@ -65,7 +65,6 @@ public final class MultiFormatOneDReader extends OneDReader {
if (possibleFormats.contains(BarcodeFormat.CODABAR)) {
readers.addElement(new CodaBarReader());
}
-
if (possibleFormats.contains(BarcodeFormat.RSS14)) {
readers.addElement(new RSS14Reader());
}
@@ -76,7 +75,7 @@ public final class MultiFormatOneDReader extends OneDReader {
if (readers.isEmpty()) {
readers.addElement(new MultiFormatUPCEANReader(hints));
readers.addElement(new Code39Reader());
- readers.addElement(new CodaBarReader());
+ //readers.addElement(new CodaBarReader());
readers.addElement(new Code93Reader());
readers.addElement(new Code128Reader());
readers.addElement(new ITFReader());
diff --git a/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java b/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java
index 2721ff8..8b7edd0 100644
--- a/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java
+++ b/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java
@@ -122,7 +122,7 @@ public final class CommandLineRunner {
vector.addElement(BarcodeFormat.QR_CODE);
vector.addElement(BarcodeFormat.DATAMATRIX);
vector.addElement(BarcodeFormat.PDF417);
- vector.addElement(BarcodeFormat.CODABAR);
+ //vector.addElement(BarcodeFormat.CODABAR);
}
hints.put(DecodeHintType.POSSIBLE_FORMATS, vector);
if (tryHarder) {
diff --git a/zxingorg/src/com/google/zxing/web/DecodeServlet.java b/zxingorg/src/com/google/zxing/web/DecodeServlet.java
index 0a26eca..8419c7a 100644
--- a/zxingorg/src/com/google/zxing/web/DecodeServlet.java
+++ b/zxingorg/src/com/google/zxing/web/DecodeServlet.java
@@ -101,7 +101,7 @@ public final class DecodeServlet extends HttpServlet {
static {
HINTS = new Hashtable<DecodeHintType, Object>(5);
HINTS.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
- Collection<BarcodeFormat> possibleFormats = new Vector<BarcodeFormat>();
+ Collection<BarcodeFormat> possibleFormats = new Vector<BarcodeFormat>(17);
possibleFormats.add(BarcodeFormat.UPC_A);
possibleFormats.add(BarcodeFormat.UPC_E);
possibleFormats.add(BarcodeFormat.EAN_8);
@@ -109,6 +109,7 @@ public final class DecodeServlet extends HttpServlet {
possibleFormats.add(BarcodeFormat.CODE_39);
possibleFormats.add(BarcodeFormat.CODE_93);
possibleFormats.add(BarcodeFormat.CODE_128);
+ //possibleFormats.add(BarcodeFormat.CODABAR);
possibleFormats.add(BarcodeFormat.ITF);
possibleFormats.add(BarcodeFormat.RSS14);
possibleFormats.add(BarcodeFormat.QR_CODE);
--
Multi-format 1D/2D barcode image processing library
More information about the Pkg-google-commits
mailing list