# Homography Source Code

Hi,

I’m attempting to use some C source code from the following file in the OpenMV Github repo:

https://github.com/openmv/openmv/blob/master/src/omv/img/apriltag.c

To compute the homography between an input camera image and a preferred image perspective on an STM32F746G DISCO.

I’ve extracted the relevant files to successfully compile and perform a homography computation test. (zarray, matd, homography, svd22, fmath, math_util … etc.)

The aim is to find the homography using the following pairs of co-ordinates:

(58,21) → (32,32)
(141,35) → (115,32)
(58,75) → (32,86)
(141,89) → (115,86)

I’ve shown my approach to doing this below:

Declare globally:

``````matd_t homographyMatrix;
float coord1[] = {58,21,32,32}; // src and dst
float coord2[] = {141,35,115,32}; // src and dst
float coord3[] = {58,75,32,86}; // src and dst
float coord4[] = {141,89,115,86}; // src and dst
``````

In the main:

``````zarray_t *homographyParameters = zarray_create(sizeof(float[4]));
homographyMatrix = *homography_compute(homographyParameters,HOMOGRAPHY_COMPUTE_FLAG_SVD);
zarray_destroy(homographyParameters);
``````

However the homography matrix I obtain from this is vastly different to the one obtained from using OpenCV in python.

OpenMV Homography Matrix:

M(0,0) = 3.94191378e-034
M(0,1) = 1.08434073e-019
M(0,2) = 0
M(1,0) = -2
M(1,1) = 1.40129846e-045
M(1,2) = 0
M(2,0) = 0
M(2,1) = 0
M(2,2) = 0

OpenCV Homography Matrix:

M(0,0) = 1
M(0,1) = -3.97548050e-18
M(0,2) = -26
M(1,0) = -0.16874699
M(1,1) = 1
M(1,2) = 20.7831325
M(2,0) = 0
M(2,1) = 0
M(2,2) = 1

Furthermore when I use the homography_project() function with the homography calculated by OpenCV the project co-ordinates are as expected e.g. (58,21) maps to (32,32) although this is not the case when I use the homography calculated by OpenMV as the variable ‘zz’ inside homography_project() always seems to be 0 and therefore the program crashes as the ‘xx’ and ‘yy’ values are divided by ‘zz’.

I was hoping you’d possibly be able to shed some light on how the homography_compute() function should be used.