2013-04-05 2 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());