AlignmentPatternFinder
in package
This class attempts to find alignment patterns in a QR Code. Alignment patterns look like finder patterns but are smaller and appear at regular intervals throughout the image.
At the moment this only looks for the bottom-right alignment pattern.
This is mostly a simplified copy of FinderPatternFinder. It is copied, pasted and stripped down here for maximum performance but does unfortunately duplicate some code.
This class is thread-safe but not reentrant. Each thread must allocate its own object.
Tags
Table of Contents
Properties
- $matrix : BitMatrix
- $moduleSize : float
- $possibleCenters : array<string|int, AlignmentPattern>
Methods
- __construct() : mixed
- Creates a finder that will look in a portion of the whole image.
- find() : AlignmentPattern|null
- This method attempts to find the bottom-right alignment pattern in the image. It is a bit messy since it's pretty performance-critical and so is written to be fast foremost.
- centerFromEnd() : float
- Given a count of black/white/black pixels just seen and an end position, figures the location of the center of this black/white/black run.
- crossCheckVertical() : float|null
- After a horizontal scan finds a potential alignment pattern, this method "cross-checks" by scanning down vertically through the center of the possible alignment pattern to see if the same proportion is detected.
- foundPatternCross() : bool
- handlePossibleCenter() : AlignmentPattern|null
- This is called when a horizontal scan finds a possible alignment pattern. It will cross-check with a vertical scan, and if successful, will see if this pattern had been found on a previous horizontal scan. If so, we consider it confirmed and conclude we have found the alignment pattern.
Properties
$matrix
private
BitMatrix
$matrix
$moduleSize
private
float
$moduleSize
$possibleCenters
private
array<string|int, AlignmentPattern>
$possibleCenters
Methods
__construct()
Creates a finder that will look in a portion of the whole image.
public
__construct(BitMatrix $matrix, float $moduleSize) : mixed
Parameters
- $matrix : BitMatrix
-
image to search
- $moduleSize : float
-
estimated module size so far
find()
This method attempts to find the bottom-right alignment pattern in the image. It is a bit messy since it's pretty performance-critical and so is written to be fast foremost.
public
find(int $startX, int $startY, int $width, int $height) : AlignmentPattern|null
Parameters
- $startX : int
-
left column from which to start searching
- $startY : int
-
top row from which to start searching
- $width : int
-
width of region to search
- $height : int
-
height of region to search
Return values
AlignmentPattern|nullcenterFromEnd()
Given a count of black/white/black pixels just seen and an end position, figures the location of the center of this black/white/black run.
private
centerFromEnd(array<string|int, int> $stateCount, int $end) : float
Parameters
- $stateCount : array<string|int, int>
- $end : int
Return values
floatcrossCheckVertical()
After a horizontal scan finds a potential alignment pattern, this method "cross-checks" by scanning down vertically through the center of the possible alignment pattern to see if the same proportion is detected.
private
crossCheckVertical(int $startI, int $centerJ, int $maxCount, int $originalStateCountTotal) : float|null
Parameters
- $startI : int
-
row where an alignment pattern was detected
- $centerJ : int
-
center of the section that appears to cross an alignment pattern
- $maxCount : int
-
maximum reasonable number of modules that should be observed in any reading state, based on the results of the horizontal scan
- $originalStateCountTotal : int
Return values
float|null —vertical center of alignment pattern, or null if not found
foundPatternCross()
private
foundPatternCross(array<string|int, int> $stateCount) : bool
Parameters
- $stateCount : array<string|int, int>
-
count of black/white/black pixels just read
Return values
bool —true if the proportions of the counts is close enough to the 1/1/1 ratios used by alignment patterns to be considered a match
handlePossibleCenter()
This is called when a horizontal scan finds a possible alignment pattern. It will cross-check with a vertical scan, and if successful, will see if this pattern had been found on a previous horizontal scan. If so, we consider it confirmed and conclude we have found the alignment pattern.
private
handlePossibleCenter(array<string|int, int> $stateCount, int $i, int $j) : AlignmentPattern|null
Parameters
- $stateCount : array<string|int, int>
-
reading state module counts from horizontal scan
- $i : int
-
row where alignment pattern may be found
- $j : int
-
end of possible alignment pattern in row
Return values
AlignmentPattern|null —if we have found the same pattern twice, or null if not