Open3D 0.10.0 リンクを取得 Facebook × Pinterest メール 他のアプリ 5月 23, 2020 Open3Dの新しいバージョン0.10.0がリリースされた。http://www.open3d.org/2020/05/19/open3d-0-10/今回のリリースではVisualization関連が大幅にアップデートされている。これによって、Physically-based rendering (PBR)なども取り扱うことができるようになった模様。Computer Vision系のライブラリでこういう高級なレンダリングを扱えるものは無かったように思う。時間を見つけて少し触ってみよう。 リンクを取得 Facebook × Pinterest メール 他のアプリ コメント
COLMAPでキャリブレーション済みのデータを使う 3月 21, 2021 COLMAPで三次元復元を行う際に既知のカメラパラメータを利用する方法についてメモしておく。多くの場合、SfMでカメラパラメータも含めて推定することで十分だが、例えばCMUの Panoptic dataset のようにカメラキャリブレーション結果が提供されているようなものに対して、COLMAPを適用してみたい場合は提供されているカメラパラメータを利用する方が良い場合がある。実際に、Panoptic datasetでCOLMAPを実行するとマッチングが上手くいかず推定に失敗する場合が多くある。 既知のカメラパラメータを利用する方法については、COLMAPのFAQの中で回答があるので、ここにある通りにcamera.txt, images.txt, point3D.txtを準備すると良い。 Reconstruct sparse/dense model from known camera poses https://colmap.github.io/faq.html#reconstruct-sparse-dense-model-from-known-camera-poses 以下はCOLAMPで画像群を読み込み、特徴点の対応関係の取得まで終わっている(マッチング結果のデータベースhogehoge.dbがある)ことを前提としている。 camera.txtの生成 camera.txtには各カメラのカメラモデルおよびカメラ内部パラメータを記載する。フォーマットは以下の通り。 カメラID カメラモデル 解像度x 解像度y fx fy cx cy 歪パラメータ 内部パラメータの表現については利用するカメラモデルに依存するので、以下のURLを参照しながら必要に応じて使い分ける。 Camera Models https://colmap.github.io/cameras.html camera_models.h https://colmap.github.io/cameras.html image.txtの生成 image.txtには各画像に対応するカメラ外部パラメータを記載する。フォーマットは以下の通り。 画像ID qw qx qy qz tx ty tz カメラID 画像ファイル名 ここで(qw, qx, qy, qz)は3次元回転のクウォータニオン表現で(tx, ty, tz)は 続きを読む
5点アルゴリズムによるカメラ位置・姿勢の推定 6月 12, 2014 2枚の画像間のカメラ位置・姿勢を推定する際に、それぞれの画像を撮影したカメラの内部パラメータが既知の場合には5点アルゴリズムが利用できる。OpenCVにも5点アルゴリズムでカメラ位置・姿勢を推定するための関数 cv::findEssentialMat が用意されている。 使い方は、対応点の座標を以下のように指定するだけ。 cv::Mat essentialMat = cv::findEssentialMat(p1, p2); ただし、デフォルトでは焦点距離1.0、画像中心座標(0, 0)で計算するようになっているので、下記のコードのように内部パラメータ行列を用いて座標変換を行うか焦点距離、画像中心座標を指定する必要がある。座標変換を行わずに利用したい場合は、焦点距離、画像中心座標を第3,4引数に設定すれば良い。 推定したEssential Matrixからカメラの並進と回転を求めるためには、 cv::recoverPose で並進ベクトルと回転ベクトルに分解することができる。 以下のように、2枚の画像から対応点を求めて、5点アルゴリズムでカメラ位置・姿勢を推定することができる。 #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include <opencv2/nonfree.hpp> int main(int argc, char** argv) { cv::initModule_nonfree(); //モジュールの初期化 //カメラパラメータの読み込みとレンズ歪の除去 cv::Mat img1; //入力画像1 cv::Mat img2; //入力画像2 cv::Mat K; cv::Mat distCoeffs; cv::FileStorage fs("camera.xml", CV_STORAGE_READ); fs["intrinsicMat"] >> K; fs["distCoeffs"] >> distCoeffs; cv::undistort(cv::imrea 続きを読む
2D-3D対応からのカメラ位置・姿勢の推定 6月 11, 2014 画像からの三次元復元処理や拡張現実感のための位置合わせ処理において、画像を撮影したカメラの位置・姿勢が必要になることがある。ここでは、カメラの内部パラメータ(焦点距離、画像中心座標、アスペクト比など)は既知とし、カメラの外部パラメータ(並進と回転)を求める方法を紹介する。 カメラの位置・姿勢は、三次元位置が既知の点Pとその画像上での観測座標pの複数の対応から求めることが出来る。このような問題はPerspective-n-Pont Problem(PnP問題)として知られている。OpenCVにはPnP問題を解くための関数cv::SolvePnPが用意されている。この関数の入力は三次元位置が既知の点の配列(objectPoints)とその画像上での観測座標の配列(imagePoints)、カメラの内部パラメータ行列、歪係数を入力とし、カメラの外部パラメータ(回転ベクトル、並進ベクトル)を推定する。 対応点の組み合わせに誤対応が含まれている場合は、cv::SolvePnPRansacを用いることでロバスト推定手法であるRANSACを用いた誤対応の排除が可能である。 また、推定手法としてLevenberg-Marquardt法による最適化(cv::ITERATIVE)や高速な推定手法であるEPnP(cv::EPNP)を選択することができる。経験的にはcv::ITERATIVEの方が安定した推定を実現できるように思う。 さらに、回転ベクトル、並進ベクトルの初期値が得られている場合には、第7引数をtrueにし、出力用のrvec, tvecに値を設定しておくことで、最適化の際の初期値として使用することができる。拡張現実感などの場合には、直前のフレームでの推定結果などを初期値として用いることで推定結果の安定性を向上させることができる。 #include <iostream> #include <vector> #include <opencv2/opencv.hpp> void genRT(cv::Mat& rvect, cv::Mat& tvect); void getCorrespondingPairs(cv::Mat K, cv::Mat d, cv::Mat rvec, cv::Mat tvec, std: 続きを読む
コメント
コメントを投稿