0

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

4

2 回答 2

0

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

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

于 2013-04-06T09:25:44.220 回答
0

找到方法了!这有点令人困惑,但我希望这可以帮助某人。referenceMarker1..4 是模板标记点 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());
于 2013-04-06T15:49:33.983 回答