2013-04-05 53 views
0

我有兩個圖像,一個模板和一個掃描頁面。
我打印模板然後掃描它。
圖像對於每個角度都有一個點。
因爲掃描可以被翻譯,旋轉並且可以具有不同的大小(由於打印機的畸變,所以在垂直方向上水平)我必須將掃描的四個點映射到模板。
我有每個點的位置。
如何在Java中創建應用於掃描的AffineTransform?將一個矩形映射到另一個矩形,包括旋轉

回答

0

從技術上講,您可以自己在數學上找到仿射變換,然後通過使用某個循環將其應用於每個目標像素的源像素並在它們之間進行一些插值,但這確實浪費時間。

有許多圖像處理庫可以幫助你,比如OpenCv。

0

找到了一個方法! 這有點令人困惑,但我希望這coud幫助某人。 referenceMarker1..4是模板標記點 translatedMarker1..4是掃描標記點

的referenceMarker3和translatedMarker3都沒有用,一個enanchement可以做。

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