質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

1回答

4155閲覧

(opencv)三次元復原での座標所得方法

hidekiM

総合スコア10

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

1クリップ

投稿2016/01/17 07:15

三次元復元を行おうとしている者なのですが、ORBで用いた特徴点を座標に変換するのに戸惑っています。

イテレータを使って特徴点の座標をvector<points2f>型に変換すればtriangulatePointsの2、3番目の引数に合致すると判断しているのですが間違えでしょうか。
またパターン1、パターン2を行ってもデバックエラーが表示されます。

<一部>(keypointsL,keypointsRはORBで所得した各左右座標の特徴点です)

<パターン1>
vector<Point2f>LeftImagePoints;
vector<Point2f>RightImagePoints;

vector<KeyPoint>::iterator itk;
for (auto itk = keypointsL.begin(); itk != keypointsL.end(); ++itk)
{
*itk;
LeftImagePoints.push_back(itk->pt);
}
for (auto itk = keypointsR.begin(); itk != keypointsR.end(); ++itk)
{
*itk;
RightImagePoints.push_back(itk->pt);
}
vector<Point3f>points3D;
Mat points4D;

double hbi = 40;
Mat cameraMatrixL =(Mat_<double>(3, 4) << 10, 0,0, 10 * hbi,0, 10, 30, 0,0, 0, 1, 0);
Mat cameraMatrixR =Mat_<double>(3, 4) << 10, 0, 20, 10 * -hbi,0, 10, 30, 0,0, 0, 1, 0);

triangulatePoints(cameraMatrixL, cameraMatrixR, Mat(LeftImagePoints), Mat(RightImagePoints), points4D);
convertPointsFromHomogeneous(points4D.reshape(4, 1), points3D);

<パターン2>
iteratorの部分を以下に変えてみた。

Mat points4D;

if (matches_good.size() > 5)
{
for (size_t i = 0; i <(int)matches_good.size(); ++i)

{ Mat ip(2, 1, CV_64FC1); Point2f p; ip.at<double>(0) = keypointsL[matches_good[i].queryIdx].pt.x; ip.at<double>(1) = keypointsL[matches_good[i].queryIdx].pt.y; p.x = ip.at<double>(0); p.y = ip.at<double>(1);

pointsL2D.push_back(p);

ip.at<double>(0) = keypointsR[matches_good[i].trainIdx].pt.x;
ip.at<double>(1) = keypointsR[matches_good[i].trainIdx].pt.y;

p.x = ip.at<double>(0);
p.y = ip.at<double>(1);

pointsR2D.push_back(p);

double hbi = 40;
Mat cameraMatrixL =(Mat_<double>(3, 4) << 10, 0, 20, 10 * hbi,0, 10, 30, 0,0, 0, 1, 0);
Mat cameraMatrixR =(Mat_<double>(3, 4) << 10, 0, 20, 10 * -hbi,0, 10, 30, 0,0, 0, 1, 0);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんにちは。

パターン1はmatches_goodを使ってないですが、パターン2は使ってますね。matches_goodの意味が分からないのでなんとも言えませんが、バターン1と2の動作は異なるかもしれません。
次に、keypointsL/Rの型さえ分からないのでなんとも言えないのですが、もし、vector<KeyPoint>であればパターン1の取り出しは形式的には間違ってはなさそうです。(vector<KeyPoint>::iterator itk; *itk;の行は不要と思いますが。)
パターン1と2でcameraMatrixL/Rが微妙に異なりますが、質問時のコピペミスでしょうか?

ところで、triangulatePoints()については、ここにそこそこ詳しいサンプルがありました。keypointsL/RからLeft/RightImagePointsへの正しい変換が判れば、参考になりそうです。
変換が妥当かどうかは、keypointsL/RとLeft/RightImagePointsの座標を画像上にプロットしてみて確認することをお勧めします。

投稿2016/01/17 08:50

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問