我正在用力撞墙,试图从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)
]
要正确应用warpkernel生成的OpenCV,我必须执行以下操作(请参阅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输出吗?我想念什么吗?我怀疑这是一个错误。