Почему результаты оценки Affine3D так отличаются в OpenCV 2x. против 3х / 4х? - PullRequest
1 голос
/ 17 октября 2019

Я оцениваю преобразование, используя следующий простой сценарий:

import numpy as np
import cv2
​
np.set_printoptions(suppress=True, linewidth=150, precision=3)
​
src_pts = np.array([
    [404003.4538534981, 6439036.085327965, 30.070000000298023],
    [404031.8414760324, 6439025.267706301, 30.03999999910593],
    [404021.6794758776, 6439102.775758727, 29.739999999292195],
    [404021.3647202959, 6439136.031732696, 29.50999999884516]
])
dst_pts = np.array([
    [65560.854, 238055.105, 30.07],
    [65590.083, 238044.21, 30.04],
    [65587.214, 238120.096, 29.74],
    [65587.074, 238160.277, 29.51]
])
​
​
def print_xy_error(src, dst, transform, label):
    predicted = np.dot(np.hstack((src, np.ones((src.shape[0], 1)))), transform.transpose())
    error = dst - predicted
    avg_xy_error = np.mean(np.sqrt(np.sum(error[:, 0:2] ** 2., 1)))
    print('OpenCV v{} solver {} found transform with error {:.5f}:'.format(cv2.__version__, label, avg_xy_error))
    print(transform)
​
_, transform3d, _ = cv2.estimateAffine3D(src_pts, dst_pts)
print_xy_error(src_pts, dst_pts, transform3d, 'estimateAffine3D')

Но результаты очень отличаются между OpenCV 2x и 3x / 4x.

Запуск этого сценария в 2. x:

OpenCV v2.4.13.2 solver estimateAffine3D found transform with error 0.00000:
[[       1.164        0.254       35.727 -2040695.972]
 [      -0.237        0.62       -84.713 -3656548.676]
 [       0.          -0.           1.           0.   ]]

Запуск этого скрипта в 3.x:

OpenCV v3.4.0 solver estimateAffine3D found transform with error 0.09992:
[[       1.16         0.25        34.905 -2013737.96 ]
 [      -0.25         0.61       -86.809 -3588616.483]
 [      -0.          -0.           1.           0.   ]]

Может кто-нибудь помочь мне понять, почему?

...