カメラのポーズ (回転行列 + 平行移動ベクトル) を見つける必要があり、そのために を使用して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
ますか? (もちろん、理想的には、最初に座標系を一致させることが最善です)。
どんな助けでも大歓迎です!