2

カメラのポーズ (回転行列 + 平行移動ベクトル) を見つける必要があり、そのために を使用してcv2.solvePnP()いますが、写真から取得した結果は一致しません。

デバッグするために、いくつかのオブジェクト ポイント (正方形の 4 つのコーナー)、いくつかのカメラ ポイント (焦点、主点、および仮想投影面の 4 つのコーナー) とパラメーターで構成される "デバッグ 3D シーン" を (numpy を使用して) 作成しました。 (焦点距離、初期方向)。

次に、3 つの軸回転行列を乗算して一般的な回転行列を作成し、この一般的な回転をカメラに適用し ( numpy.dot())、オブジェクト ポイントを仮想投影面に投影し (線平面交差アルゴリズム)、面内 2D 座標を計算します。 (点線距離) 投影平面軸まで。

cv2.Rodrigues(cv2.solvePnP(...))これを行った後(回転行列を介してオブジェクトポイントからイメージポイントへ)、イメージポイントとオブジェクトポイントをフィードして、使用したものと「まったく同じではない」マトリックスを取得します。これは、転置と反対の信号を持つ要素(負対正)のためだけです、この関係を尊重:

solvepnp_rotmatrix = my_original_matrix.transpose * [ 1  1  1] 
                                                    [ 1  1 -1] 
                                                    [-1 -1  1] 

回転行列の不一致はこのハックで「解決可能」ですが、TRANSLATION VECTOR は意味をなさない座標を提供します。

私の 3D モデル (利き手、軸の向き、回転の順序) と opencv で使用されるモデルとの間に不一致があると思われます。

  • 私は OpenGL のような座標系を使用します (X は右に増加し、Y は上に増加し、Z は観察者に向かって増加します。
  • 私は自分にとってより意味のある順序で回転を適用しました (すべて右手で、最初にグローバル Z を中心に、次にグローバル X を中心に、次にグローバル Y を中心に);
  • イメージ プレーンは、オブジェクトとカメラの焦点の間にあります (リアル/CCD ではなく、仮想投影面)。
  • 私のイメージ プレーン (仮想 CCD) の原点は左下隅です (Xpix は右に向かって増加し、Ypx は上に向かって増加します。

私の質問は次のとおりです。

回転行列の項が同一で、転置されているだけで、いくつかの項で信号が異なる場合、いくつかのopenCV規則 (利き手、回転の順序、軸方向) を混乱させる可能性はありますか? そして、どうすればどれを見つけることができますか?

また、手作りの翻訳ベクトルを によって返された tvec に関連付ける方法はありsolvePnPますか? (もちろん、理想的には、最初に座標系を一致させることが最善です)。

どんな助けでも大歓迎です!

4

0 に答える 0