Skip to content

nenoNaninu/HomographySharp

Repository files navigation

HomographySharp

build-and-test

HomographySharp is a C# class library for finding and using homography matrix.

Install

NuGet: HomographySharp

Package Manager

PM > Install-Package HomographySharp

.NET CLI

dotnet add package HomographySharp

Usage

Find homography matrix

//System.Numerics.Vector2
var srcList = new List<Vector2>(4);
var dstList = new List<Vector2>(4);

srcList.Add(new Vector2(-152, 394));
srcList.Add(new Vector2(218, 521)); 
srcList.Add(new Vector2(223, -331));
srcList.Add(new Vector2(-163, -219));

dstList.Add(new Vector2(-666, 431));
dstList.Add(new Vector2(500, 300));
dstList.Add(new Vector2(480, -308));
dstList.Add(new Vector2(-580, -280));

// args type: ReadOnlySpan, IReadOnlyList, T[]
HomographyMatrix<float> homo = Homography.Find(srcList, dstList);

Point2<float> result = homo.Translate(-152, 394);

Assert.IsTrue(Math.Abs(result.X - -666) < 0.001); //true
Assert.IsTrue(Math.Abs(result.Y - 431) < 0.001);  //true

// System.Drawing.PointF
PointF pointf = result.ToPointF();
// System.Numerics.Vector2
Vector2 vector2 = result.ToVector2();
// MathNet.Numerics.LinearAlgebra.Matrix<T>
Matrix<float> mat = homo.ToMathNetMatrix();

or

//HomographySharp.Point2<T>
var srcArray = new Point2<double>[4]; // or Point2<float>
var dstArray = new Point2<double>[4];

srcArray[0] = new Point2<double>(10, 10);
srcArray[1] = new Point2<double>(100, 10);
srcArray[2] = new Point2<double>(100, 150);
srcArray[3] = new Point2<double>(10, 150);

dstArray[0] = new Point2<double>(11, 11);
dstArray[1] = new Point2<double>(500, 11);
dstArray[2] = new Point2<double>(500, 200);
dstArray[3] = new Point2<double>(11, 200);

HomographyMatrix<double> homo = Homography.Find(srcList.AsSpan(), dstList.AsSpan());

Point2<double> result = homo.Translate(100, 10);

Assert.IsTrue(Math.Abs(result.X - 500) < 0.001); //true
Assert.IsTrue(Math.Abs(result.Y - 11) < 0.001);  //true

Json serialize support

using System.Text.Json;

var homoMat = Homography.Find(srcList, dstList);

string json = JsonSerializer.Serialize(homo);

var homoMat2 = JsonSerializer.Deserialize<HomographyMatrix<double>>(json);

Create homography matrix from raw array

HomographyMatrix<double> homoMat = ...;

var newMat = Homography.Create(homoMat.ElementsAsSpan());

Visualization App

Use visualization app if you want to see how points are transformed by a homography matrix.

https://youtu.be/BNACz1SPbj8

Dependent Library