15

カメラの位置を世界座標で計算したい。これはかなり簡単なはずですが、期待した結果が得られません。このトピックに関するすべてを読んだと思いますが、コードが機能していません。これが私がすることです:

私はある地域を見ているカメラを持っています。

1)その地域の地図を描きました。

2)4つの画像ポイントをマップ上の4つのポイントに一致させることにより、ホモグラフィを計算しました。cv2.getPerspectiveTransform

3)Hホモグラフィは、すべての世界座標をカメラ座標に変換します。これは正しく機能しています

4)カメラマトリックスを計算するために私はこれに従いました

translation = np.zeros((3,1)) 
translation[:,0] = homography[:,2]

rotation = np.zeros((3,3))
rotation[:,0] = homography[:,0]
rotation[:,1] = homography[:,1]
rotation[:,2] = np.cross(homography[0:3,0],homography[0:3,1])

cameraMatrix = np.zeros((3,4))
cameraMatrix[:,0:3] = rotation
cameraMatrix[:,3] = homography[:,2]

cameraMatrix = cameraMatrix/cameraMatrix[2][3] #normalize the matrix

5)これによるとカメラの位置は次のように計算する必要があります。

x,y,z = np.dot(-np.transpose(rotation),translation)

私が得ている座標は完全に間違っています。問題はステップ4または5のどこかにあるはずです。私の方法の何が問題になっていますか?

4

1 に答える 1

19

私は今それを持っていると思います。問題は、ステップ4で説明した方法にありました。カメラの位置は、ホモグラフィマトリックスだけから計算することはできません。カメラ固有のマトリックスも必要です。したがって、正しい手順は次のとおりです。

1)地域の地図を描く

2)チェス盤の画像を使用してカメラをキャリブレーションします。cv2.findChessboardCornersこれにより、カメラマトリックスと歪み係数が得られます。

3)ワールド座標(3D)と画像座標(2D)を使用してPnPを解決します。SolvePnPは、対応する4つのポイントとカメラ行列が与えられた場合に、カメラの座標系でオブジェクトのオリゴを返します。

4)次に、ワールド座標でのカメラの位置を計算する必要があります。回転行列は次のとおりです。rotM = cv2.Rodrigues(rvec)[0]

5)カメラのx、y、z位置は次のとおりです。cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)

于 2013-02-04T19:23:44.493 に答える