UNPKG

@zxing/library

Version:

TypeScript port of ZXing multi-format 1D/2D barcode image processing library.

115 lines (114 loc) 5.67 kB
import DecodeHintType from '../../DecodeHintType'; import ResultPointCallback from '../../ResultPointCallback'; import BitMatrix from '../../common/BitMatrix'; import FinderPattern from './FinderPattern'; import FinderPatternInfo from './FinderPatternInfo'; /** * <p>This class attempts to find finder patterns in a QR Code. Finder patterns are the square * markers at three corners of a QR Code.</p> * * <p>This class is thread-safe but not reentrant. Each thread must allocate its own object. * * @author Sean Owen */ export default class FinderPatternFinder { private image; private resultPointCallback; private static CENTER_QUORUM; protected static MIN_SKIP: number; protected static MAX_MODULES: number; private possibleCenters; private hasSkipped; private crossCheckStateCount; /** * <p>Creates a finder that will search the image for three finder patterns.</p> * * @param image image to search */ constructor(image: BitMatrix, resultPointCallback: ResultPointCallback); protected getImage(): BitMatrix; protected getPossibleCenters(): FinderPattern[]; find(hints: Map<DecodeHintType, any>): FinderPatternInfo; /** * Given a count of black/white/black/white/black pixels just seen and an end position, * figures the location of the center of this run. */ private static centerFromEnd; /** * @param stateCount count of black/white/black/white/black pixels just read * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios * used by finder patterns to be considered a match */ protected static foundPatternCross(stateCount: Int32Array): boolean; private getCrossCheckStateCount; /** * After a vertical and horizontal scan finds a potential finder pattern, this method * "cross-cross-cross-checks" by scanning down diagonally through the center of the possible * finder pattern to see if the same proportion is detected. * * @param startI row where a finder pattern was detected * @param centerJ center of the section that appears to cross a finder pattern * @param maxCount maximum reasonable number of modules that should be * observed in any reading state, based on the results of the horizontal scan * @param originalStateCountTotal The original state count total. * @return true if proportions are withing expected limits */ private crossCheckDiagonal; /** * <p>After a horizontal scan finds a potential finder pattern, this method * "cross-checks" by scanning down vertically through the center of the possible * finder pattern to see if the same proportion is detected.</p> * * @param startI row where a finder pattern was detected * @param centerJ center of the section that appears to cross a finder pattern * @param maxCount maximum reasonable number of modules that should be * observed in any reading state, based on the results of the horizontal scan * @return vertical center of finder pattern, or {@link Float#NaN} if not found */ private crossCheckVertical; /** * <p>Like {@link #crossCheckVertical(int, int, int, int)}, and in fact is basically identical, * except it reads horizontally instead of vertically. This is used to cross-cross * check a vertical cross check and locate the real center of the alignment pattern.</p> */ private crossCheckHorizontal; /** * <p>This is called when a horizontal scan finds a possible alignment pattern. It will * cross check with a vertical scan, and if successful, will, ah, cross-cross-check * with another horizontal scan. This is needed primarily to locate the real horizontal * center of the pattern in cases of extreme skew. * And then we cross-cross-cross check with another diagonal scan.</p> * * <p>If that succeeds the finder pattern location is added to a list that tracks * the number of times each location has been nearly-matched as a finder pattern. * Each additional find is more evidence that the location is in fact a finder * pattern center * * @param stateCount reading state module counts from horizontal scan * @param i row where finder pattern may be found * @param j end of possible finder pattern in row * @param pureBarcode true if in "pure barcode" mode * @return true if a finder pattern candidate was found this time */ protected handlePossibleCenter(stateCount: Int32Array, i: number, j: number, pureBarcode: boolean): boolean; /** * @return number of rows we could safely skip during scanning, based on the first * two finder patterns that have been located. In some cases their position will * allow us to infer that the third pattern must lie below a certain point farther * down in the image. */ private findRowSkip; /** * @return true iff we have found at least 3 finder patterns that have been detected * at least {@link #CENTER_QUORUM} times each, and, the estimated module size of the * candidates is "pretty similar" */ private haveMultiplyConfirmedCenters; /** * @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module * size differs from the average among those patterns the least * @throws NotFoundException if 3 such finder patterns do not exist */ private selectBestPatterns; }