Project Tango C API ドキュメントによると、TANGO_CALIBRATION_POLYNOMIAL_3_PARAMETERS
レンズの歪みは次のようにモデル化されています。
x_corr_px = x_px (1 + k1 * r2 + k2 * r4 + k3 * r6) y_corr_px = y_px (1 + k1 * r2 + k2 * r4 + k3 * r6)
つまり、歪みのない座標は、歪みのある座標のべき級数関数です。Java APIには別の定義がありますが、その説明は、関数がどの方向にマップされるかを伝えるのに十分なほど詳細ではありません。
物事を正しく登録するのに苦労しましたが、マッピングが実際には反対方向に進んでいる可能性があると思います。つまり、歪んだ座標は歪んでいない座標のべき級数です。カメラのキャリブレーションが OpenCV を使用して作成された場合、問題の原因は OpenCV のドキュメント自体が矛盾している可能性があります。見つけて理解する最も簡単な説明はOpenCV カメラ キャリブレーション チュートリアルで、これは Project Tango のドキュメントと一致しています。
しかし一方で、OpenCV API のドキュメントでは、マッピングが逆になると指定されています。
OpenCV を使った私の実験では、その API ドキュメントは正しく表示され、チュートリアルは間違っていることがわかりました。正の値k1
(他のすべての歪みパラメータをゼロに設定) はピンクッション型の歪みをk1
意味し、負の値は樽型の歪みを意味します。これは、ウィキペディアが Brown-Conrady モデルについて述べていることと一致し、 Tsai モデルとは反対になります。歪みは、数学をより便利にするものに応じて、どちらの方法でもモデル化できることに注意してください。この不一致について、OpenCV に対してバグを開きました。
私の質問: Project Tango レンズ歪みモデルは、OpenCV で実装されているものと同じですか (ドキュメントにもかかわらず)?
カラーカメラからキャプチャした画像を次に示します (わずかなピンクッションが表示されます)。
Tango サービスによって報告されたカメラのキャリブレーションは次のとおりです。
distortion = {double[5]@3402}
[0] = 0.23019999265670776
[1] = -0.6723999977111816
[2] = 0.6520439982414246
[3] = 0.0
[4] = 0.0
calibrationType = 3
cx = 638.603
cy = 354.906
fx = 1043.08
fy = 1043.1
cameraId = 0
height = 720
width = 1280
PythonでOpenCVを使用して歪みを解消する方法は次のとおりです。
>>> import cv2
>>> src = cv2.imread('tango00042.png')
>>> d = numpy.array([0.2302, -0.6724, 0, 0, 0.652044])
>>> m = numpy.array([[1043.08, 0, 638.603], [0, 1043.1, 354.906], [0, 0, 1]])
>>> h,w = src.shape[:2]
>>> mDst, roi = cv2.getOptimalNewCameraMatrix(m, d, (w,h), 1, (w,h))
>>> dst = cv2.undistort(src, m, d, None, mDst)
>>> cv2.imwrite('foo.png', dst)
これにより、上端が少し過剰に補正されている可能性がありますが、リバース モデルで試みたものよりもはるかに優れています。