Java 将矩形映射到另一个矩形,包括旋转

Java 将矩形映射到另一个矩形,包括旋转,java,image-processing,affinetransform,Java,Image Processing,Affinetransform,我有两个图像、一个模板和一个扫描页。 我打印模板,然后扫描它。 图像的每个角度都有一个点。 因为扫描可以平移、旋转,并且可以有不同的大小(垂直和水平方向,因为打印机变形),所以我必须将扫描的四个点映射到模板。 我有每个点的位置。 如何在Java中创建仿射变换以应用于扫描?从技术上讲,您可以自己从数学上找到仿射变换,然后自己应用它,使用一些循环为每个目标像素找到源像素并在它们之间进行插值,但这确实是浪费时间 有许多图像处理库可以帮助您实现这一点,比如OpenCv。找到了一种方法! 这有点让人困惑,

我有两个图像、一个模板和一个扫描页。
我打印模板,然后扫描它。
图像的每个角度都有一个点。
因为扫描可以平移、旋转,并且可以有不同的大小(垂直和水平方向,因为打印机变形),所以我必须将扫描的四个点映射到模板。
我有每个点的位置。

如何在Java中创建仿射变换以应用于扫描?

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

有许多图像处理库可以帮助您实现这一点,比如OpenCv。

找到了一种方法! 这有点让人困惑,但我希望这能帮助别人。 referenceMarker1..4是模板标记点 translatedMarker1..4是扫描标记点

如果未使用referenceMarker3和translatedMarker3,则可以执行eAnachement

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());