تحويل الصور من 4 نقاط
-
20-08-2019 - |
سؤال
أحتاج إلى تحويل الصور النقطية مع نقل نقاط الزاوية الأربعة الخاصة بها من موقع إلى آخر.
أي تعليمات برمجية يمكن تشغيلها على Windows، ويفضل C#/VB.NET، حتى تساعد في كيفية استخدام البرامج النصية مثل الرسام.نت أو محل تصوير سيتم قبوله.تبدو واجهة Java Advanced Imaging API متفائلة.
أحتاجه لنظام معالجة لقطة الشاشة، والذي يسمح لك بالحصول على مثل هذه التأثيرات:
(مصدر: fulltomato.com)
المحلول
وتحقق من منظور تزييفها أمثلة من <لأ href = "HTTP: //www.imagemagick.org/ "يختلط =" نوفولو noreferrer "> يماغيماغيك . وهي متاحة لمعظم المنصات الرئيسية.
نصائح أخرى
والكلمة هنا هي <م> homography م> . وقد كتب مانوليس Lourakis التنفيذ homography الترخيص؟ اد في C الذي هو هنا . ومع ذلك، فإن هذا لن يكون قادرا على أن يكون ميناء بسهولة جدا لأنه يعتمد على بعض المكتبات الخارجية مثل LAPACK أ >.
تنويه: أنا أعمل في 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;
أسهل من محاكاة تشوه المنظور باستخدام معالجة الصور، يمكنك استخدام OpenGL أو DirectX (XNA) لإجراء عرض المنظور فعليًا.
اعرض شكلًا رباعيًا بسيطًا باستخدام صورتك كخريطة نسيج.قم بإعداد المشهد الخاص بك، ثم قم بتقديمه إلى المخزن المؤقت، وستحصل على صورتك.
تحديث اتضح أن XNA عبارة عن مكتبة سخيفة (موجهة نحو صنع الألعاب ولا شيء آخر، تثاءب).تتطلب إدارة DirectX إجراء عملية جراحية لفص الدماغ.برنامج OpenGL سهل الاستخدام، ولكنه يفتقر إلى كود تحميل الصور.هذا يتركنا مع WPF:
نص بديل http://praeclarum.org/so/persp.png
يمكن تحسين الصورة عن طريق إجبار WPF على وضع مكافحة الاسم المستعار (لماذا يا Microsoft أنت قصير النظر إلى هذا الحد؟)، ومن خلال عدم استخدام زجاج Aero الذي يفرض حدًا أسود يبلغ 1 بكسل على جميع لقطات الشاشة (أو عن طريق إزالة 1 بكسل حدود).
(نأسف لطول هذا الرمز، ولكن WPF عبارة عن واجهة برمجة تطبيقات ثرثرة.)
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>