Example #1
0
 /**
    * <p>Estimates module size based on two finder patterns -- it uses
    * {@link #sizeOfBlackWhiteBlackRunBothWays(int, int, int, int)} to figure the
    * width of each, measuring along the axis between their centers.</p>
    */
 private float calculateModuleSizeOneWay(ResultPoint pattern, ResultPoint otherPattern)
 {
     float moduleSizeEst1 = sizeOfBlackWhiteBlackRunBothWays((int) pattern.getX(),
         (int) pattern.getY(),
         (int) otherPattern.getX(),
         (int) otherPattern.getY());
     float moduleSizeEst2 = sizeOfBlackWhiteBlackRunBothWays((int) otherPattern.getX(),
         (int) otherPattern.getY(),
         (int) pattern.getX(),
         (int) pattern.getY());
     if (Single.IsNaN(moduleSizeEst1)) {
       return moduleSizeEst2;
     }
     if (Single.IsNaN(moduleSizeEst2))
     {
       return moduleSizeEst1;
     }
     // Average them, and divide by 7 since we've counted the width of 3 black modules,
     // and 1 white and 1 black module on either side. Ergo, divide sum by 14.
     return (moduleSizeEst1 + moduleSizeEst2) / 14.0f;
 }
Example #2
0
          /**
           * Counts the number of black/white transitions between two points, using something like Bresenham's algorithm.
           */
          private ResultPointsAndTransitions transitionsBetween(ResultPoint from, ResultPoint to) {
            // See QR Code Detector, sizeOfBlackWhiteBlackRun()
            int fromX = (int) from.getX();
            int fromY = (int) from.getY();
            int toX = (int) to.getX();
            int toY = (int) to.getY();
            bool steep = Math.Abs(toY - fromY) > Math.Abs(toX - fromX);
            if (steep) {
              int temp = fromX;
              fromX = fromY;
              fromY = temp;
              temp = toX;
              toX = toY;
              toY = temp;
            }

            int dx = Math.Abs(toX - fromX);
            int dy = Math.Abs(toY - fromY);
            int error = -dx >> 1;
            int ystep = fromY < toY ? 1 : -1;
            int xstep = fromX < toX ? 1 : -1;
            int transitions = 0;
            bool inBlack = image.isBlack(steep ? fromY : fromX, steep ? fromX : fromY);
            for (int x = fromX, y = fromY; x != toX; x += xstep) {
              bool isBlack = image.isBlack(steep ? y : x, steep ? x : y);
              if (isBlack == !inBlack) {
                transitions++;
                inBlack = isBlack;
              }
              error += dy;
              if (error > 0) {
                y += ystep;
                error -= dx;
              }
            }
            return new ResultPointsAndTransitions(from, to, transitions);
          }
Example #3
0
        private static BitMatrix sampleGrid(MonochromeBitmapSource image,
            ResultPoint topLeft,
            ResultPoint topRight,
            ResultPoint bottomLeft,
            ResultPoint alignmentPattern,
            int dimension)
        {
            float dimMinusThree = (float) dimension - 3.5f;
            float bottomRightX;
            float bottomRightY;
            float sourceBottomRightX;
            float sourceBottomRightY;
            if (alignmentPattern != null) {
              bottomRightX = alignmentPattern.getX();
              bottomRightY = alignmentPattern.getY();
              sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0f;
            } else {
              // Don't have an alignment pattern, just make up the bottom-right point
              bottomRightX = (topRight.getX() - topLeft.getX()) + bottomLeft.getX();
              bottomRightY = (topRight.getY() - topLeft.getY()) + bottomLeft.getY();
              sourceBottomRightX = sourceBottomRightY = dimMinusThree;
            }

            GridSampler sampler = GridSampler.Instance;
            return sampler.sampleGrid(
                image,
                dimension,
                3.5f,
                3.5f,
                dimMinusThree,
                3.5f,
                sourceBottomRightX,
                sourceBottomRightY,
                3.5f,
                dimMinusThree,
                topLeft.getX(),
                topLeft.getY(),
                topRight.getX(),
                topRight.getY(),
                bottomRightX,
                bottomRightY,
                bottomLeft.getX(),
                bottomLeft.getY());
        }
Example #4
0
          private static BitMatrix sampleGrid(MonochromeBitmapSource image,
                                              ResultPoint topLeft,
                                              ResultPoint bottomLeft,
                                              ResultPoint bottomRight,
                                              int dimension) {

            // We make up the top right point for now, based on the others.
            // TODO: we actually found a fourth corner above and figured out which of two modules
            // it was the corner of. We could use that here and adjust for perspective distortion.
            float topRightX = (bottomRight.getX() - bottomLeft.getX()) + topLeft.getX();
            float topRightY = (bottomRight.getY() - bottomLeft.getY()) + topLeft.getY();

            // Note that unlike in the QR Code sampler, we didn't find the center of modules, but the
            // very corners. So there is no 0.5f here; 0.0f is right.
            GridSampler sampler = GridSampler.Instance;
            return sampler.sampleGrid(
                image,
                dimension,
                0.0f,
                0.0f,
                dimension,
                0.0f,
                dimension,
                dimension,
                0.0f,
                dimension,
                topLeft.getX(),
                topLeft.getY(),
                topRightX,
                topRightY,
                bottomRight.getX(),
                bottomRight.getY(),
                bottomLeft.getX(),
                bottomLeft.getY());
          }