6

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)

これにより、上端が少し過剰に補正されている可能性がありますが、リバース モデルで試みたものよりもはるかに優れています。

ここに画像の説明を入力

4

2 に答える 2

6

修正された出力位置」であるTango C-API Docs状態 。この修正された出力位置は、焦点距離によってスケーリングされ、投影の中心によってオフセットされて、歪んだピクセル座標に対応する必要があります。(x_corr_px, y_corr_px)

したがって、点を画像に投影するには、次のことを行う必要があります。

  1. カメラのフレームに収まるように 3D ポイントを変換します
  2. ポイントを正規化された画像座標 (x, y) に変換します
  3. 正規化された画像座標の r2、r4、r6 を計算します ( r2 = x*x + y*y)
  4. (x_corr_px, y_corr_px)上記の方程式に基づいて計算します。

    x_corr_px = x (1 + k1 * r2 + k2 * r4 + k3 * r6)
    y_corr_px = y (1 + k1 * r2 + k2 * r4 + k3 * r6)
    
  5. 歪んだ座標を計算する

    x_dist_px = x_corr_px * fx + cx
    y_dist_px = y_corr_px * fy + cy
    
  6. (x_dist_px, y_dist_px)元の歪んだ画像バッファに 描画します。

これは、修正された座標が、正規化された画像座標の大きさのべき級数によってスケーリングされた正規化された座標であることも意味します。(これは質問が示唆することの反対です)

cvProjectPoints2OpenCVでの実装を見ると( [opencv] /modules/calib3d/src/calibration.cpp を参照)、OpenCV の「Poly3」歪みは、Tango と同じ方向に適用されています。3 つのバージョン (Tango Docs、OpenCV チュートリアル、OpenCV API) はすべて一貫しており、正しいものです。

頑張ってください、うまくいけばこれが役に立ちます!

(更新:コードを詳しく見てみると、修正された座標と歪んだ座標が同じではないようです。応答の間違った部分を削除しましたが、この回答の残りの部分はまだ正しいです。)

于 2015-05-02T01:18:50.400 に答える