2009-03-18 4 views
6

4 개의 꼭지점을 한 위치에서 다른 위치로 이동하면서 비트 맵 이미지를 변환해야합니다.4 점 변환 이미지

Windows에서 실행할 수있는 모든 코드, C#/VB.NET은 Paint.NET 또는 Photoshop과 같은 스크립팅 가능 프로그램을 사용하는 방법도 허용됩니다. Java Advanced Imaging API는 희망찬 것으로 들립니다.

나는 당신이 그런 효과를 얻을 수 스크린 샷 조작 시스템에 대한 필요 :

alt text http://www.wholetomato.com/images/tour/mondoPerspectiveTrans.gif

답변

1

쉽게 이미지 조작을 사용하여 왜곡되고 관점을 시뮬레이션하는 대신 사용할 수는 OpenGL 또는 DirectX를 (XNA)에 실제로 원근법 디스플레이를 수행하십시오.

이미지와 함께 간단한 쿼드를 텍스처 맵으로 렌더링하십시오. 씬을 설정하고 버퍼로 렌더링하면 이미지가 생깁니다.

업데이트 XNA는 우스운 라이브러리 (게임을 만드는 것 외에는 아무것도 만들지 않습니다. 하품)입니다. Managed DirectX는 뇌 충혈을 필요로합니다. OpenGL은 사용하기 쉽지만 이미지로드 코드가 없습니다. 즉 WPF 우리 잎 :

alt text http://praeclarum.org/so/persp.png

이미지가 앤티 앨리어싱 모드로 WPF를 강제로 개선 될 수있다 (왜 오 Microsoft는 지금 목격 짧은 이유?), 어느 세력 에어로 유리를 사용하지 않음으로써 모든 스크린 샷에서 1 픽셀 검정 테두리 (또는 그 1 픽셀 테두리 제거).

(이 코드의 길이에 대한 미안하지만, WPF는 수다스러운 API입니다.)

public partial class Window1 : Window { 
    const float ANGLE = 30; 
    const float WIDTH = 8; 
    public Window1() { 
     InitializeComponent(); 

     var group = new Model3DGroup(); 
     group.Children.Add(Create3DImage(@"C:\Users\fak\Pictures\so2.png")); 
     group.Children.Add(new AmbientLight(Colors.White)); 

     ModelVisual3D visual = new ModelVisual3D(); 
     visual.Content = group; 
     viewport.Children.Add(visual); 
    } 

    private GeometryModel3D Create3DImage(string imgFilename) { 
     var image = LoadImage(imgFilename); 

     var mesh = new MeshGeometry3D(); 
     var height = (WIDTH * image.PixelHeight)/image.PixelWidth; 
     var w2 = WIDTH/2.0; 
     var h2 = height/2.0; 
     mesh.Positions.Add(new Point3D(-w2, -h2, 0)); 
     mesh.Positions.Add(new Point3D(w2, -h2, 0)); 
     mesh.Positions.Add(new Point3D(w2, h2, 0)); 
     mesh.Positions.Add(new Point3D(-w2, h2, 0)); 
     mesh.TriangleIndices.Add(0); 
     mesh.TriangleIndices.Add(1); 
     mesh.TriangleIndices.Add(2); 
     mesh.TriangleIndices.Add(0); 
     mesh.TriangleIndices.Add(2); 
     mesh.TriangleIndices.Add(3); 
     mesh.TextureCoordinates.Add(new Point(0, 1)); // 0, 0 
     mesh.TextureCoordinates.Add(new Point(1, 1)); 
     mesh.TextureCoordinates.Add(new Point(1, 0)); 
     mesh.TextureCoordinates.Add(new Point(0, 0)); 

     var mat = new DiffuseMaterial(new ImageBrush(image)); 
     mat.AmbientColor = Colors.White; 

     var geometry = new GeometryModel3D(); 
     geometry.Geometry = mesh; 
     geometry.Material = mat; 
     geometry.BackMaterial = mat; 

     geometry.Transform = new RotateTransform3D(
      new AxisAngleRotation3D(new Vector3D(0,1,0), ANGLE), 
      new Point3D(0, 0, 0)); 

     return geometry; 
    } 

    public static BitmapSource LoadImage(string filename) { 
     return BitmapDecoder.Create(new Uri(filename, UriKind.RelativeOrAbsolute), 
      BitmapCreateOptions.None, BitmapCacheOption.Default).Frames[0]; 
    } 
} 

그리고 필요한 XAML :

<Window x:Class="Persp.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Perspective Window" Height="480" Width="640"> 
<Grid> 
    <Viewport3D x:Name="viewport"> 
     <Viewport3D.Resources> 
     </Viewport3D.Resources> 
     <Viewport3D.Camera> 
      <PerspectiveCamera x:Name="cam" 
        FarPlaneDistance="100" 
        LookDirection="0,0,-1" 
        UpDirection="0,1,0" 
        NearPlaneDistance="1" 
        Position="0,0,10" 
        FieldOfView="60" /> 
     </Viewport3D.Camera> 
    </Viewport3D> 
</Grid> 
</Window> 
+0

문제는 어떻게 4 포인트를 3D 회전으로 변환합니까? –

2

여기 키워드 homography입니다. Manolis Lourakis는 C에서 GPL로 작성된 호모 그래피 구현을 작성했습니다.이 구현은 here입니다. 그러나 이것은 외부 라이브러리 (예 : LAPACK)에 의존하기 때문에 쉽게 포팅 할 수 없습니다.

2

면책 조항 : 당신이 상업 갈 의향이 있다면 나는 Atalasoft

에서 일하고, DotImage 사진은 QuadrilateralWarpCommand이 작업을 수행 할 수 있습니다. 샘플 C# 코드

// Load an image. 
AtalaImage image = new AtalaImage("test-image.jpg"); 

// Prepare the warp positions. 
Point bottomLeft = new Point(100, image.Height - 80); 
Point topLeft = new Point(130, 45); 
Point topRight = new Point(image.Width - 60, 140); 
Point bottomRight = new Point(image.Width - 20, image.Height); 

// Warp the image. 
QuadrilateralWarpCommand cmd = new QuadrilateralWarpCommand(bottomLeft, 
    topLeft, topRight, bottomRight, InterpolationMode.BiLinear, Color.White); 
AtalaImage result = cmd.Apply(image).Image; 

http://www.atalasoft.com/products/dotimage

+0

이것은 어파 인 워프 또는 원근감 워프입니까? –

+0

나는 Affine 워프 (적어도 2d가 아님)로 이것을 얻을 수 있다고 생각지 않는다. 우리는 몇 가지 일반적인 어파 인 변형을 지원하고, 자신 만의 2D 매트릭스를 만들 수있다. 우리는 3D 변환을 지원하지 않습니다 (매트릭스를 사용하여 이런 종류의 변환을 수행해야한다고 생각합니다). –

관련 문제