This class implements a perspective transform in two dimensions. Given four source and four destination points, it will compute the transformation implied between them. The code is based directly upon section 3.4.2 of George Wolberg's "Digital Image Warping"; see pages 54-56.

Ejemplo n.º 1
0
        public override BitMatrix sampleGrid(BitMatrix image, int dimension, PerspectiveTransform transform)
        {
            var bits = new BitMatrix(dimension);
            var points = new float[dimension << 1];
            for (int y = 0; y < dimension; y++)
            {
                int max = points.Length;

                float iValue = y + 0.5f;
                for (int x = 0; x < max; x += 2)
                {

                    points[x] = (x >> 1) + 0.5f;
                    points[x + 1] = iValue;
                }
                transform.transformPoints(points);
                // Quick check to see if points transformed to something inside the image;
                // sufficient to check the endpoints
                checkAndNudgePoints(image, points);
                try
                {
                    for (int x = 0; x < max; x += 2)
                    {

                        if (image.get_Renamed((int) points[x], (int) points[x + 1]))
                        {
                            // Black(-ish) pixel
                            bits.set_Renamed(x >> 1, y);
                        }
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting
                    // transform gets "twisted" such that it maps a straight line of points to a set of points
                    // whose endpoints are in bounds, but others are not. There is probably some mathematical
                    // way to detect this about the transformation that I don't know yet.
                    // This results in an ugly runtime exception despite our clever checks above -- can't have
                    // that. We could check each point's coordinates but that feels duplicative. We settle for
                    // catching and wrapping ArrayIndexOutOfBoundsException.
                    throw ReaderException.Instance;
                }
            }
            return bits;
        }
Ejemplo n.º 2
0
 private static BitMatrix sampleGrid(BitMatrix image, PerspectiveTransform transform, int dimension)
 {
     GridSampler sampler = GridSampler.Instance;
     return sampler.sampleGrid(image, dimension, transform);
 }