【问题标题】:Map a rectangle to another, including rotation将一个矩形映射到另一个矩形,包括旋转
【发布时间】:2013-04-05 17:30:52
【问题描述】:

我有两个图像,一个模板和一个扫描页面。
我打印模板然后扫描它。
图像的每个角度都有一个点。
因为扫描可以平移、旋转并且可以具有不同的大小(垂直和水平,因为打印机变形)我必须将扫描的四个点映射到模板。
我有每个点的位置。
如何在 Java 中创建 AffineTransform 以应用于扫描?

【问题讨论】:

    标签: java image-processing affinetransform


    【解决方案1】:

    从技术上讲,您可以自己在数学上找到仿射变换,然后使用一些循环自行应用它,该循环为每个目标像素找到源像素并在它们之间进行一些插值,但这确实是浪费时间。

    有许多图像处理库可以帮助您,例如 OpenCv。

    【讨论】:

      【解决方案2】:

      找到方法了! 这有点令人困惑,但我希望这可以帮助某人。 referenceMarker1..4 是 template 标记点 translateMarker1..4 是扫描标记点

      没有使用referenceMarker3和translatedMarker3,可以做一个ennchement。

      final double translationX = translatedMarker1.getX() - referenceMarker1.getX();
      final double translationY = translatedMarker1.getY() - referenceMarker1.getY();
      
      // Calculate translation, rotation and scaling of the sheet
      final double originalDx = referenceMarker2.getX() - referenceMarker1.getX();         // X distance between reference markers
      final double originalDy = referenceMarker2.getY() - referenceMarker1.getY();         // Y distance between reference markers
      final double translatedDx = translatedMarker2.getX() - translatedMarker1.getX();     // X distance between translated markers
      final double translatedDy = translatedMarker2.getY() - translatedMarker1.getY();     // Y distance between translated markers
      
      final double angle = Math.atan2(translatedDy, translatedDx) - Math.atan2(originalDy, originalDx);
      double scaleX = Math.sqrt(originalDx * originalDx + originalDy * originalDy) / Math.sqrt(translatedDx * translatedDx + translatedDy * translatedDy);
      
      final double originalDx4_2 = referenceMarker4.getX() - referenceMarker2.getX();
      final double originalDy4_2 = referenceMarker4.getY() - referenceMarker2.getY();
      final double translatedDx4_2 = translatedMarker4.getX() - translatedMarker2.getX();
      final double translatedDy4_2 = translatedMarker4.getY() - translatedMarker2.getY();
      
      double scaleY = Math.sqrt(originalDx4_2 * originalDx4_2 + originalDy4_2 * originalDy4_2) / Math.sqrt(translatedDx4_2 * translatedDx4_2 + translatedDy4_2 * translatedDy4_2);
      
      // Generate a transformation matrix
      // Translate back
      transformation.translate(referenceMarker1.getX() - translationX, referenceMarker1.getY() - translationY);
      
      // Scale
      transformation.scale(scaleX, scaleY);
      
      // Rotate
      transformation.rotate(-angle);
      
      // Translate first marker to origin to rotate around that point
      transformation.translate(-referenceMarker1.getX(), -referenceMarker1.getY());
      

      【讨论】:

        猜你喜欢
        • 2018-12-06
        • 2020-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 2014-12-20
        • 2021-10-01
        相关资源
        最近更新 更多