Я бьюсь головой об стену, пытаясь получить правильную матрицу гомографии из VNHomographicImageRegistrationRequest.
Я могу правильно применить сгенерированный OpenCV с простым металлическим warpkernel, как подробно описано в WWDC17 510:
float2 warpHomography(float3x3 h, destination dest) {
float3 homogeneousDestCoord = float3(dest.coord(), 1.0);
float3 homogeneousSrcCoord = h * homogeneousDestCoord;
float2 srcCoord = homogeneousSrcCoord.xy / max(homogeneousSrcCoord.z, 0.000001);
return srcCoord;
}
Скажем, матрица гомографии OpenCV:
let rows = [
simd_float3( 9.24742537e-01, 2.00638564e-04, 7.00462355e+01),
simd_float3( -8.56721959e-03, 1.01871539e+00, -3.09751182e+01),
simd_float3( -1.50501456e-04, 1.37902991e-04, 1.00000000e+00)
]
Чтобы правильно применить OpenCV, сгенерированный с помощью warpkernel, мне пришлось сделать следующее (см. 1 для справки):
// where 480 is the image height
let rows_c = [
simd_float3( 1, 0, 0),
simd_float3( 0, -1, 480),
simd_float3( 0, 0, 1)
]
let c = float3x3(rows: rows_c)
let rows_H = [
simd_float3( 9.24742537e-01, 2.00638564e-04, 7.00462355e+01),
simd_float3( -8.56721959e-03, 1.01871539e+00, -3.09751182e+01),
simd_float3( -1.50501456e-04, 1.37902991e-04, 1.00000000e+00)
]
H = float3x3(rows: rows_H).inverse
H_mat = c * H * c
Однако мне еще предстоит увидеть VNHomographicImageRegistrationRequestвыводить то, что имеет смысл (я пробовал даже изображения с применением простых известных преобразований - например, простые повороты, переводы), но я получаю матрицы, которые не имеют смысла (по крайней мере, для меня).Например, для той же пары изображений, что и выше, я получаю:
1.1050268 -0.034095053 -5.877033
0.06516277 1.031036 -14.215689
0.0001372757 -7.1084425e-05 1.0312284
Кто-нибудь действительно мог использовать выходной файл VNHomographicImageRegistrationRequest?Я что-то пропустил?Я сомневаюсь, что это ошибка.