Changed how many rows we scan while detecting QR finder patterns. The mobile case dynamically calculates this based on the height of the image, and ranges from a small speedup to a big difference for large inputs. Also changed the try harder case to scan every 3rd line for a 3x speedup. The unit tests have the same success rate as before: 16/20 on qr1, 10/10 on qr2.

git-svn-id: https://zxing.googlecode.com/svn/trunk@354 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
dswitkin 2008-04-10 20:26:42 +00:00
parent d9fc77b9e2
commit ae54d7a937

View file

@ -38,7 +38,8 @@ import java.util.Vector;
final class FinderPatternFinder {
private static final int CENTER_QUORUM = 2;
private static final int BIG_SKIP = 3;
private static final int MIN_SKIP = 3; // 1 pixel/module times 3 modules/center
private static final int MAX_MODULES = 57; // support up to version 10 for mobile clients
private final MonochromeBitmapSource image;
private final Vector possibleCenters;
@ -62,9 +63,16 @@ final class FinderPatternFinder {
// 1:1:3:1:1 ratio; this tracks the number of such modules seen so far
int[] stateCount = new int[5];
boolean done = false;
// We can afford to examine every few lines until we've started finding
// the patterns
int iSkip = tryHarder ? 1 : BIG_SKIP;
// Let's assume that the maximum version QR Code we support takes up 1/4 the height of the
// image, and then account for the center being 3 modules in size. This gives the smallest
// number of pixels the center could be, so skip this often. When trying harder, look for all
// QR versions regardless of how dense they are.
int iSkip = (int) (maxI / (MAX_MODULES * 4.0f) * 3);
if (iSkip < MIN_SKIP || tryHarder) {
iSkip = MIN_SKIP;
}
for (int i = iSkip - 1; i < maxI && !done; i += iSkip) {
// Get a row of black/white values
BitArray blackRow = image.getBlackRow(i, null, 0, maxJ);