Допустим, ваши очки A = (x1, y1); В = (х2, у2); С = (х3; у3); D = (x4, y4) на изображении 1 и A '= (x1', y1 '); В '= (х2', у2' ); С '= (х3'; у3' ); D '= (x4', y4 ') на изображении 2.
Вы уже выяснили, что для нахождения аффинного преобразования требуется найти шесть неизвестных. Чтобы найти их, просто запишите систему линейных уравнений и решите:
x1' = a x1 + b y1 + c
y1' = d x1 + e y1 + f
x2' = a x2 + b y2 + c
y2' = d x2 + e y2 + f
x3' = a x3 + b y3 + c
y3' = d x3 + e y3 + f
x4' = a x4 + b y4 + c
y4' = d x4 + e y4 + f
Вы можете фактически разделить это на две системы линейных уравнений:
x1' = a x1 + b y1 + c
x2' = a x2 + b y2 + c
x3' = a x3 + b y3 + c
x4' = a x4 + b y4 + c
и
y1' = d x1 + e y1 + f
y2' = d x2 + e y2 + f
y3' = d x3 + e y3 + f
y4' = d x4 + e y4 + f
Поскольку вас интересует только то, существует ли аффинное преобразование (но не значения a, b, c, d, e, f), вам просто нужно определить, имеют ли эти две системы линейных уравнений Решение или нет.
Теорема Rouché – Capelli говорит нам, что система линейных уравнений имеет решение тогда и только тогда, когда rank матрицы коэффициентов равен рангу расширенной матрицы .
В вашем случае матрица коэффициентов для обеих систем линейных уравнений равна
| x1 y1 1 |
| x2 y2 1 |
| x3 y3 1 |
| x4 y4 1 |
Расширенная матрица для первой системы линейных уравнений:
| x1 y1 1 x1' |
| x2 y2 1 x2' |
| x3 y3 1 x3' |
| x4 y4 1 x4' |
и для второй системы линейных уравнений это
| x1 y1 1 y1' |
| x2 y2 1 y2' |
| x3 y3 1 y3' |
| x4 y4 1 y4' |
Теперь вычислите ранги этих трех матриц (например, с помощью numpy.linalg.matrix_rank ) и, если они все равны, существует аффинное преобразование.