11

画像のカメラ位置を計算しようとしています。ルービック キューブの 2 つの画像があります。最初の画像はベース画像と見なされ、次の画像はカメラが移動した後の画像です。したがって、最初の画像では、カメラが (0,0,0) にあると想定しています。次に、この画像で、ルービック キューブの正面の 4 つのコーナーを特定します (4 つのコーナーは 4 つの青い円で識別されます)。 ここに画像の説明を入力

次の画像 (カメラの移動後) では、ここに示すようにルービック キューブの同じ面を識別します。 ここに画像の説明を入力

したがって、最初の画像をベース画像と仮定することで、ここに示すように、画像2に対してカメラがどれだけ移動したかを計算できるかどうか、またはどのように計算できるかを知っている人はいますか? ここに画像の説明を入力

4

1 に答える 1

15

これにはOpenCVを使用することをお勧めします。また、この質問は StackOverflow により適していると思います。

この主題に関する教科書は、Hartley と Zisserman による「Multiple-View Geometry」です。http://www.robots.ox.ac.uk/~vgg/hzbook/ (その Web サイトにファンダメンタル マトリックスに関するサンプルの章があります。)

基本的には、まず基本行列を見つけてから、カメラの固有パラメータを知ることで、位置の解を見つけます。

アルゴリズム

これは、OpenCVで行う方法です。私はこれを以前にやったことがあるので、うまくいくはずです。

1. Run Feature Detection and Detector Extractor on both images. 
2. Match Features. 
3. Use F = cv::findFundamentalMatrix with Ransac. 
4. E = K.t() * F * K. // K needs to be found beforehand. 
5. Do SingularValueDecomposition of E such that E = U * S * V.t()
6. R = U * W.inv() * V.t() // W = [[0, -1, 0], [1, 0, 0], [0, 0, 1]]
7. Tx = V * Z *  V.t() // Z = [[0, -1, 0], [1, 0, 0], [0, 0, 0]]
8. get t from Tx (matrix version of cross product)
9. Find the correct solution. R.t() and -t are possiblities. 
10. Get overall scale by knowing the length of the size of the Rubrik's cube.

代替ソリューション

より直接的なアプローチも有効であると確信しています。このアプローチの利点は、人間の入力が必要ないことです (教師なし)。これは、オプションのステップ 10 (スケールの決定) には当てはまりません。

別の解決策は、ルーブリックの立方体のジオメトリの知識を活用することです。たとえば、ポイントの 3D 位置がわかっている場合、カメラの位置を推定するには 6 (5.5) ポイントが必要です。

残念ながら、これを自動的に行うソフトウェアを私は知りません。

したがって、代替アルゴリズムは次のとおりです。立方体の角の座標を (X_i、Y_i、Z_i) として書き留めます。また、他の既知の位置を示す可能性もあります。

対応する点 u_i = (x_i, y_i) をマークします。すべての対応について、行列 A に 2 つの行を作成ます。 、X_i、Y_i、Z_i、1、-y_i X_i、-y_i Y_i、-y_i Z_i -y_i)

次に、Ap = 0 となるような p を見つけます。つまり、p は A の右核、または Ap=0 の最小二乗解です。

p の平坦化を解除して、3x4 行列を作成します。P.

于 2012-04-14T22:45:57.163 に答える