問題タブ [opencv-solvepnp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - solvePnP の結果は、期待される結果と大きく異なります (Python、OpenCV)
カメラ、imu、GPS を搭載した車があります。カメラは運転中に写真を撮ります。写真と GPS 座標が同期されます。今、私は写真からカメラのポーズを取得しようとしています (imu に関連する) がsolvePnP
、期待される結果と同様の外部カメラ キャリブレーションにはなりません。
詳細については、OpenCV 4.0.0 で Python (3.6.8) を使用しています。
私が知っている次のデータ:
- 8 つのマーカーと、世界座標での正確な位置があります。
- ワールド座標でイムの軌跡を持っています。
- いくつかの写真(6576 x 4384 px)のマーカーのピクセル座標があります。
- 固有のカメラ キャリブレーションがあります。
現在、私のプロセスは次のもので構成されています。
- すべてのマーカーの z 座標が 0 になるように、すべてのワールド座標をローカル マーカー座標系に変換します (コード例の Out[4] を参照)。最初はこの手順なしで試してみましたが、チュートリアルをたくさん読んだところ、キャリブレーションが何らかの形でこれを想定しているように見えましたが、よくわかりません。私が間違っている場合は、私を修正してください。
- 私は と を取得するために使用し
solvePnP
ます。rvec
tvec
- を取得するために申請
cv2.Rogrigues(rvec)
しますrotationMatrix
- 次に、マーカー座標でのカメラ位置は次のように計算されます。
camPos = -np.matrix(rotationMatrix).T * np.matrix(tvec)
その後、imu と推定カメラ位置の距離を比較すると、約 1m になりましたが、一貫していません。これらは、5 つのサンプル画像の結果です。
ただし、imu とカメラの間の距離は、かなり正確に 2.4 m (手動で測定) であり、まったく変化しないはずです (両方とも車の上部に固定されているため)。
solvePnP が間違った結果を出力する可能性はありますか、それともプロセスのどこかで間違いを犯している可能性はありますか?
同様の質問ですが、答えはありませんthis .
opencv - ポーズ推定 - cv::SolvePnP with Scenekit - 座標系の質問
Apples Visionフレームワークの機能/キーポイントを使用して、OpenCVのcv::solvePNPを介してポーズ推定(画像上の2Dポイントで3Dモデルのキーポイントを修正してポーズに一致させる)に取り組んできました。
TL-DR:
私のシーン キット モデルは変換されており、solvePnP からの変換ベクトルと回転ベクトルをイントロスペクションすると単位は正しく見えます (つまり、それらは正しい大きさの順序です) が、変換の座標系はずれているように見えます:
SolvePnP wrt to Metal / OpenGL 座標系とカメラ投影行列を使用して、座標系の要件を理解しようとしています。
SCNCamera が solvePnP に渡された画像ベースの座標系と一致させるために必要な「projectionMatrix」は何ですか?
私が読んだ/私が考慮していると信じているいくつかのこと。
- OpenCV と OpenGL (つまり、Metal) には、行優先と列優先の違いがあります。
- 3D 用の OpenCV の座標系は、OpenGL (つまり、Metal) とは異なります。
より長いコード:
私のワークフローは次のとおりです。
ステップ 1 - 3D モデル ツールを使用して 3D モデルのポイントをイントロスペクトし、検出された 2D フィーチャの主要なキー ポイントのオブジェクトの頂点位置を取得します。左瞳、右瞳、鼻先、顎先、左目尻、右目尻を使用しています。
ステップ 2 - ビジョン リクエストを実行し、画像空間内のポイントのリストを抽出し (OpenCV の左上座標系に変換)、2D ポイントの同じ順序付きリストを抽出します。
ステップ 3 - 入力画像のサイズを使用してカメラ マトリックスを作成します。
ステップ 4 - cv::solvePnP を実行し、cv::Rodrigues を使用して回転ベクトルを行列に変換します。
ステップ 5 - 結果の変換の座標系を GPU に適したものに変換します。y 軸と z 軸を反転し、平行移動と回転を単一の 4x4 行列に結合してから、OpenGL / Metal の適切なメジャーネスに合わせて転置します。
ステップ 6 - 結果の変換を次の方法で Scenekit に適用します。
以下は、ビジョン ランドマークのサブセットと、見ている画像の実際のピクセル サイズを取り込む Obj-C++ OpenCV ラッパーです。
いくつかの質問:
SCNNode には、行列を投げるだけの modelViewMatrix (私が理解しているように、modelMatrix である変換) がありません。クローズ結果が得られるようです。このアプローチが正しいことを確認したいと思います。
もし私がmodelViewMatrixとprojectionMatrixを持っているなら、適切なmodelMatrixを計算できるはずですか? これは私が取るべきアプローチですか?
SceneKitシーンにどのprojectionMatrixを使用する必要があるのか 、それが結果に関係があるかどうかはわかりません。ビューポートと画像サイズを正確に一致させるにはピクセルが必要ですか? SolvePnP の座標系の一致を確保するために SCNCamera を適切に構成するにはどうすればよいですか?
どうもありがとうございました!
javascript - projectPoints + solvePnP のラッパーを使用して OpenCV.js をビルドする
JavaScript への移植: 「公開名 'projectPoints' を 2 回登録できません」
私は次のことをしました:
opencv/platforms/js/build_js.py の def get_build_flags(self) に以下を追加しました: flags += "-s USE_PTHREADS=0 "
def get_cmake_cmd(self): of opencv/platforms/js/build_js.py:
-DBUILD_opencv_calib3d
setでビルド フラグを有効にしました。ON
次の def get_cmake_cmd(self): を opencv/platforms/js/build_js.py に追加しました。
-DOPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules
js
opencv/modules/calib3d/CMakeLists.txt の WRAP リストの末尾にある ocv_define_module 内に追加しました。opencv/modules/features2d/CMakeLists.txt と opencv_contrib/modules/aruco/CMakeLists.txt にも ocv_define_module に "js" パラメータを追加しました。solvePnP
opencv/modules/js/src/embindgen.py の calib3d モジュールに「projectPoints」を追加しました
calib3d = {'': ['findHomography',' calibrationCameraExtended', 'drawFrameAxes', 'getDefaultNewCameraMatrix', 'initUndistortRectifyMap', 'solvePnP','projectPoints']}
- opencv/modules/js/src/embindgen.py の makeWhiteList に calib3d モジュールを追加しました
white_list = makeWhiteList([core, imgproc, objdetect, video, dnn, features2d, photo, aruco, calib3d])
「using namespace aruco;」を追加しました。opencv/modules/js/src/core_bindings.cpp で
次のコマンドを使用して OpenCV.js をビルドしました: sudo python ./platforms/js/build_js.py build_js --emscripten_dir=${EMSCRIPTEN} --clean_build_dir --build_test
これらのラッパーを追加する前は、エラーなしで完全にコンパイルされていました。私のtests.htmlには、次のメッセージがあります。
オーバーロード関数が JavaScript への移植を妨げているようです。
どうすれば修正できますか?
よろしくお願いします。