On Sunday, 21 April 2024 at 14:57:33 UTC, Paolo Invernizzi wrote:
Hi,

Someone can point me to a D implementation of the classical OpenCV find homography matrix?

Thank you,
Paolo

Just for future records in the forum.

// https://math.stackexchange.com/questions/3509039/calculate-homography-with-and-without-svd

/+dub.sdl:
dependency "lubeck" version="~>1.5.4"
+/
import std;
import mir.ndslice;
import kaleidic.lubeck;

    void main()
    {
        double[2] x_1 = [93,-7];
        double[2] y_1 = [63,0];
        double[2] x_2 = [293,3];
        double[2] y_2 = [868,-6];
        double[2] x_3 = [1207,7];
        double[2] y_3 = [998,-4];
        double[2] x_4 = [1218,3];
        double[2] y_4 = [309,2];

        auto A = [
-x_1[0], -y_1[0], -1, 0, 0, 0, x_1[0]*x_1[1], y_1[0]*x_1[1], x_1[1], 0, 0, 0, -x_1[0], -y_1[0], -1, x_1[0]*y_1[1], y_1[0]*y_1[1], y_1[1], -x_2[0], -y_2[0], -1, 0, 0, 0, x_2[0]*x_2[1], y_2[0]*x_2[1], x_2[1], 0, 0, 0, -x_2[0], -y_2[0], -1, x_2[0]*y_2[1], y_2[0]*y_2[1], y_2[1], -x_3[0], -y_3[0], -1, 0, 0, 0, x_3[0]*x_3[1], y_3[0]*x_3[1], x_3[1], 0, 0, 0, -x_3[0], -y_3[0], -1, x_3[0]*y_3[1], y_3[0]*y_3[1], y_3[1], -x_4[0], -y_4[0], -1, 0, 0, 0, x_4[0]*x_4[1], y_4[0]*x_4[1], x_4[1], 0, 0, 0, -x_4[0], -y_4[0], -1, x_4[0]*y_4[1], y_4[0]*y_4[1], y_4[1]
        ].sliced(8, 9);

        auto svdResult = svd(A);

        auto homography = svdResult.vt[$-1].sliced(3, 3);
auto transformedPoint = homography.mtimes([1679, 128, 1].sliced.as!double.slice);
        transformedPoint[] /= transformedPoint[2];

        writeln(transformedPoint); //[4, 7, 1]
    }

Reply via email to