public override BitMatrix sampleGrid(BitMatrix image, int dimensionX, int dimensionY, float p1ToX, float p1ToY, float p2ToX, float p2ToY, float p3ToX, float p3ToY, float p4ToX, float p4ToY, float p1FromX, float p1FromY, float p2FromX, float p2FromY, float p3FromX, float p3FromY, float p4FromX, float p4FromY)
        {
            PerspectiveTransform transform = PerspectiveTransform.quadrilateralToQuadrilateral(
                p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY,
                p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY);

            return(sampleGrid(image, dimensionX, dimensionY, transform));
        }
      public override BitMatrix sampleGrid(BitMatrix image, int dimensionX, int dimensionY, PerspectiveTransform transform)
      {
         if (dimensionX <= 0 || dimensionY <= 0)
         {
            return null;
         }
         BitMatrix bits = new BitMatrix(dimensionX, dimensionY);
         float[] points = new float[dimensionX << 1];
         for (int y = 0; y < dimensionY; y++)
         {
            int max = points.Length;
            //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
            float iValue = (float)y + 0.5f;
            for (int x = 0; x < max; x += 2)
            {
               //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
               points[x] = (float)(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
            if (!checkAndNudgePoints(image, points))
               return null;
            try
            {
               var imageWidth = image.Width;
               var imageHeight = image.Height;

               for (int x = 0; x < max; x += 2)
               {
                  var imagex = (int)points[x];
                  var imagey = (int)points[x + 1];

                  if (imagex < 0 || imagex >= imageWidth || imagey < 0 || imagey >= imageHeight)
                  {
                     return null;
                  }

                  bits[x >> 1, y] = image[imagex, imagey];
               }
            }
            catch (System.IndexOutOfRangeException)
            {
               // java version:
               // 
               // 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.
               return null;
            }
         }
         return bits;
      }
Exemple #3
0
 private static void assertPointEquals(float expectedX,
                                       float expectedY,
                                       float sourceX,
                                       float sourceY,
                                       PerspectiveTransform pt)
 {
     float[] points = { sourceX, sourceY };
     pt.transformPoints(points);
     Assert.AreEqual(expectedX, points[0], EPSILON);
     Assert.AreEqual(expectedY, points[1], EPSILON);
 }
Exemple #4
0
        public void testSquareToQuadrilateral()
        {
            PerspectiveTransform pt = PerspectiveTransform.squareToQuadrilateral(
                2.0f, 3.0f, 10.0f, 4.0f, 16.0f, 15.0f, 4.0f, 9.0f);

            assertPointEquals(2.0f, 3.0f, 0.0f, 0.0f, pt);
            assertPointEquals(10.0f, 4.0f, 1.0f, 0.0f, pt);
            assertPointEquals(4.0f, 9.0f, 0.0f, 1.0f, pt);
            assertPointEquals(16.0f, 15.0f, 1.0f, 1.0f, pt);
            assertPointEquals(6.535211f, 6.8873234f, 0.5f, 0.5f, pt);
            assertPointEquals(48.0f, 42.42857f, 1.5f, 1.5f, pt);
        }
Exemple #5
0
        public void testQuadrilateralToQuadrilateral()
        {
            PerspectiveTransform pt = PerspectiveTransform.quadrilateralToQuadrilateral(
                2.0f, 3.0f, 10.0f, 4.0f, 16.0f, 15.0f, 4.0f, 9.0f,
                103.0f, 110.0f, 300.0f, 120.0f, 290.0f, 270.0f, 150.0f, 280.0f);

            assertPointEquals(103.0f, 110.0f, 2.0f, 3.0f, pt);
            assertPointEquals(300.0f, 120.0f, 10.0f, 4.0f, pt);
            assertPointEquals(290.0f, 270.0f, 16.0f, 15.0f, pt);
            assertPointEquals(150.0f, 280.0f, 4.0f, 9.0f, pt);
            assertPointEquals(7.1516876f, -64.60185f, 0.5f, 0.5f, pt);
            assertPointEquals(328.09116f, 334.16385f, 50.0f, 50.0f, pt);
        }
Exemple #6
0
 private static BitMatrix sampleGrid(BitMatrix image, PerspectiveTransform transform, int dimension)
 {
    GridSampler sampler = GridSampler.Instance;
    return sampler.sampleGrid(image, dimension, dimension, transform);
 }
        public override BitMatrix sampleGrid(BitMatrix image, int dimensionX, int dimensionY, PerspectiveTransform transform)
        {
            if (dimensionX <= 0 || dimensionY <= 0)
            {
                return(null);
            }
            BitMatrix bits = new BitMatrix(dimensionX, dimensionY);

            float[] points = new float[dimensionX << 1];
            for (int y = 0; y < dimensionY; y++)
            {
                int max = points.Length;
                //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                float iValue = (float)y + 0.5f;
                for (int x = 0; x < max; x += 2)
                {
                    //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                    points[x]     = (float)(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
                if (!checkAndNudgePoints(image, points))
                {
                    return(null);
                }
                try
                {
                    var imageWidth  = image.Width;
                    var imageHeight = image.Height;

                    for (int x = 0; x < max; x += 2)
                    {
                        var imagex = (int)points[x];
                        var imagey = (int)points[x + 1];

                        if (imagex < 0 || imagex >= imageWidth || imagey < 0 || imagey >= imageHeight)
                        {
                            return(null);
                        }

                        bits[x >> 1, y] = image[imagex, imagey];
                    }
                }
                catch (System.IndexOutOfRangeException)
                {
                    // java version:
                    //
                    // 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.
                    return(null);
                }
            }
            return(bits);
        }