Class Detector

java.lang.Object
com.google.zxing.qrcode.detector.Detector
Direct Known Subclasses:
MultiDetector

public class Detector extends Object

Encapsulates logic that can detect a QR Code in an image, even if the QR Code is rotated or skewed, or partially obscured.

  • Field Details

  • Constructor Details

    • Detector

      public Detector(BitMatrix image)
  • Method Details

    • getImage

      protected final BitMatrix getImage()
    • getResultPointCallback

      protected final ResultPointCallback getResultPointCallback()
    • detect

      Detects a QR Code in an image.

      Returns:
      DetectorResult encapsulating results of detecting a QR Code
      Throws:
      NotFoundException - if QR Code cannot be found
      FormatException - if a QR Code cannot be decoded
    • detect

      public final DetectorResult detect(Map<DecodeHintType,?> hints) throws NotFoundException, FormatException

      Detects a QR Code in an image.

      Parameters:
      hints - optional hints to detector
      Returns:
      DetectorResult encapsulating results of detecting a QR Code
      Throws:
      NotFoundException - if QR Code cannot be found
      FormatException - if a QR Code cannot be decoded
    • processFinderPatternInfo

      protected final DetectorResult processFinderPatternInfo(FinderPatternInfo info) throws NotFoundException, FormatException
      Throws:
      NotFoundException
      FormatException
    • createTransform

      private static PerspectiveTransform createTransform(ResultPoint topLeft, ResultPoint topRight, ResultPoint bottomLeft, ResultPoint alignmentPattern, int dimension)
    • sampleGrid

      private static BitMatrix sampleGrid(BitMatrix image, PerspectiveTransform transform, int dimension) throws NotFoundException
      Throws:
      NotFoundException
    • computeDimension

      private static int computeDimension(ResultPoint topLeft, ResultPoint topRight, ResultPoint bottomLeft, float moduleSize) throws NotFoundException

      Computes the dimension (number of modules on a size) of the QR Code based on the position of the finder patterns and estimated module size.

      Throws:
      NotFoundException
    • calculateModuleSize

      protected final float calculateModuleSize(ResultPoint topLeft, ResultPoint topRight, ResultPoint bottomLeft)

      Computes an average estimated module size based on estimated derived from the positions of the three finder patterns.

      Parameters:
      topLeft - detected top-left finder pattern center
      topRight - detected top-right finder pattern center
      bottomLeft - detected bottom-left finder pattern center
      Returns:
      estimated module size
    • calculateModuleSizeOneWay

      private float calculateModuleSizeOneWay(ResultPoint pattern, ResultPoint otherPattern)

      Estimates module size based on two finder patterns -- it uses sizeOfBlackWhiteBlackRunBothWays(int, int, int, int) to figure the width of each, measuring along the axis between their centers.

    • sizeOfBlackWhiteBlackRunBothWays

      private float sizeOfBlackWhiteBlackRunBothWays(int fromX, int fromY, int toX, int toY)
      See sizeOfBlackWhiteBlackRun(int, int, int, int); computes the total width of a finder pattern by looking for a black-white-black run from the center in the direction of another point (another finder pattern center), and in the opposite direction too.
    • sizeOfBlackWhiteBlackRun

      private float sizeOfBlackWhiteBlackRun(int fromX, int fromY, int toX, int toY)

      This method traces a line from a point in the image, in the direction towards another point. It begins in a black region, and keeps going until it finds white, then black, then white again. It reports the distance from the start to this point.

      This is used when figuring out how wide a finder pattern is, when the finder pattern may be skewed or rotated.

    • findAlignmentInRegion

      protected final AlignmentPattern findAlignmentInRegion(float overallEstModuleSize, int estAlignmentX, int estAlignmentY, float allowanceFactor) throws NotFoundException

      Attempts to locate an alignment pattern in a limited region of the image, which is guessed to contain it. This method uses AlignmentPattern.

      Parameters:
      overallEstModuleSize - estimated module size so far
      estAlignmentX - x coordinate of center of area probably containing alignment pattern
      estAlignmentY - y coordinate of above
      allowanceFactor - number of pixels in all directions to search from the center
      Returns:
      AlignmentPattern if found, or null otherwise
      Throws:
      NotFoundException - if an unexpected error occurs during detection