我有兩個圖像,一個模板和一個掃描頁面。
我打印模板然後掃描它。
圖像對於每個角度都有一個點。
因爲掃描可以被翻譯,旋轉並且可以具有不同的大小(由於打印機的畸變,所以在垂直方向上水平)我必須將掃描的四個點映射到模板。
我有每個點的位置。
如何在Java中創建應用於掃描的AffineTransform?將一個矩形映射到另一個矩形,包括旋轉
0
A
回答
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());
相關問題
- 1. 旋轉一個矩形
- 2. 另一個矩形內的矩形
- 3. 映射一個3D矩形2D屏幕
- 4. 將矩形位置綁定到另一個矩形
- 5. 將梯形映射到矩形?
- 6. 旋轉矩形?
- 7. 發現,一個矩形觸及另一個矩形
- 8. 找到一個旋轉的矩形內的一個點
- 9. kineticjs將矩形卡入另一個矩形
- 10. 將行從一個矩陣映射到另一個矩陣。共享唯一ID
- 11. 畫布像矩形輪旋轉矩形
- 12. 如何將一個矩形div居中放在另一個矩形div內
- 13. cgcontext旋轉矩形
- 14. 旋轉矩形 - C#
- 15. 當旋轉外部矩形時,在矩形內移動矩形
- 16. 有沒有機會將矩形合併到一個矩形?
- 17. 從一個約束矩形轉換座標到它包含的旋轉矩形的座標
- 18. 得到一個矩形
- 19. 在c中旋轉一個內部矩形(或方形)#
- 20. 從包圍矩形和角度獲取旋轉矩形座標
- 21. 將矩形UIImageView變成一個圓形
- 22. jQuery/canvas:檢查矩形是否穿過另一個矩形
- 23. Flash AS3:如何在另一個矩形內調整矩形?
- 24. 在另一個矩形內的最大矩形大小
- 25. 將一個軸對齊的矩形旋轉90度
- 26. 矩形旋轉和翻轉
- 27. 從任何一點旋轉矩形
- 28. 如何測試一個矩形是否在另一個矩形中?
- 29. iPhone:檢測一個矩形的任何點在另一個矩形
- 30. WinForms - 一個矩形覆蓋另一個矩形區域的多少%