public class Detector
extends java.lang.Object
Encapsulates logic that can detect a QR Code in an image, even if the QR Code is rotated or skewed, or partially obscured.
Modifier and Type | Field and Description |
---|---|
private BitMatrix |
image |
private ResultPointCallback |
resultPointCallback |
Modifier and Type | Method and Description |
---|---|
protected 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.
|
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. |
private static int |
computeDimension(ResultPoint topLeft,
ResultPoint topRight,
ResultPoint bottomLeft,
float moduleSize)
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.
|
private static PerspectiveTransform |
createTransform(ResultPoint topLeft,
ResultPoint topRight,
ResultPoint bottomLeft,
ResultPoint alignmentPattern,
int dimension) |
DetectorResult |
detect()
Detects a QR Code in an image.
|
DetectorResult |
detect(java.util.Map<DecodeHintType,?> hints)
Detects a QR Code in an image.
|
protected AlignmentPattern |
findAlignmentInRegion(float overallEstModuleSize,
int estAlignmentX,
int estAlignmentY,
float allowanceFactor)
Attempts to locate an alignment pattern in a limited region of the image, which is
guessed to contain it.
|
protected BitMatrix |
getImage() |
protected ResultPointCallback |
getResultPointCallback() |
protected DetectorResult |
processFinderPatternInfo(FinderPatternInfo info) |
private static BitMatrix |
sampleGrid(BitMatrix image,
PerspectiveTransform transform,
int dimension) |
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.
|
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. |
private final BitMatrix image
private ResultPointCallback resultPointCallback
public Detector(BitMatrix image)
protected final BitMatrix getImage()
protected final ResultPointCallback getResultPointCallback()
public DetectorResult detect() throws NotFoundException, FormatException
Detects a QR Code in an image.
DetectorResult
encapsulating results of detecting a QR CodeNotFoundException
- if QR Code cannot be foundFormatException
- if a QR Code cannot be decodedpublic final DetectorResult detect(java.util.Map<DecodeHintType,?> hints) throws NotFoundException, FormatException
Detects a QR Code in an image.
hints
- optional hints to detectorDetectorResult
encapsulating results of detecting a QR CodeNotFoundException
- if QR Code cannot be foundFormatException
- if a QR Code cannot be decodedprotected final DetectorResult processFinderPatternInfo(FinderPatternInfo info) throws NotFoundException, FormatException
NotFoundException
FormatException
private static PerspectiveTransform createTransform(ResultPoint topLeft, ResultPoint topRight, ResultPoint bottomLeft, ResultPoint alignmentPattern, int dimension)
private static BitMatrix sampleGrid(BitMatrix image, PerspectiveTransform transform, int dimension) throws NotFoundException
NotFoundException
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.
NotFoundException
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.
topLeft
- detected top-left finder pattern centertopRight
- detected top-right finder pattern centerbottomLeft
- detected bottom-left finder pattern centerprivate 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.
private float sizeOfBlackWhiteBlackRunBothWays(int fromX, int fromY, int toX, int toY)
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.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.
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
.
overallEstModuleSize
- estimated module size so farestAlignmentX
- x coordinate of center of area probably containing alignment patternestAlignmentY
- y coordinate of aboveallowanceFactor
- number of pixels in all directions to search from the centerAlignmentPattern
if found, or null otherwiseNotFoundException
- if an unexpected error occurs during detection