これには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.