有人从VNHomographicImageRegistrationRequest获得正确的单应矩阵吗?

时间:2018-12-24 13:30:15

标签: ios macos opencv computer-vision homography

我正在用力撞墙,试图从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输出吗?我想念什么吗?我怀疑这是一个错误。

0 个答案:

没有答案