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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

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

Q&A

解決済

1回答

10980閲覧

OpenCVでカメラの姿勢を推定する方法

Konnya

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

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

0グッド

0クリップ

投稿2015/12/09 14:23

編集2015/12/10 09:32

###前提・実現したいこと
1:撮影した画像から,カメラの位置と姿勢を推定したい.

2:斜め上から撮影するような形のときに,真上から撮影されたような画像に変換したい.

###現在できていること
1:cvCalibrateCamera2を使って,カメラの内部パラメータを取得できた.

2:cvFindExtrinsicCameraParams2でカメラの外部パラメータを取得できた.

3:上記二つをxmlファイルで出力した.

###わからない,理解できていないところ
・カメラの外部パラメータとして出てきたものが,それぞれどのような意味を持っているのか.(どのような単位なのか)

・出てきたパラメータをどう計算すればどの値になるのか.(計算方法)

###使用している環境・参考にしたプログラム
環境:VisualStudio2012 OpenCV C言語 USBカメラ

参考:外部パラメータ推定,データ出力の参考

カメラキャリブレーションの参考(キャリブレーション画像は撮影済みのものを読み込むようにした)

###出力したもの

<rotation_vector type_id="opencv-matrix"> <rows>1</rows> <cols>3</cols> <dt>d</dt> <data> 2.3781226828837093e-001 -3.2224842320743338e-002 -1.3324353126696742e-002</data></rotation_vector> <rot_mat type_id="opencv-matrix"> <rows>3</rows> <cols>3</cols> <dt>d</dt> <data> 9.9939493194045448e-001 9.3831103224887059e-003 -3.3492196888385589e-002 -1.7009750537442966e-002 9.7177019134103193e-001 -2.3531545552230149e-001 3.0338727698905540e-002 2.3574276757026991e-001 9.7134180860288377e-001</data></rot_mat> <translation_vector type_id="opencv-matrix"> <rows>1</rows> <cols>3</cols> <dt>d</dt> <data> -4.5785474664206120e+001 -1.6744503834913760e+002 5.8612374994990478e+002</data></translation_vector>

答えだけでなく,ヒントや参考になるサイトなどがありましたら教えていただけると助かります.

よろしくお願いします.


Chironianさん

前回に引き続き今回も回答ありがとうございます.
カメラを平行移動させてtranslationの変化を見てみました.
カメラをチェスボードの近くから遠ざけるように移動させたときは

移動前

<translation type_id="opencv-matrix"> <rows>1</rows> <cols>3</cols> <dt>d</dt> <data> -5.2026257035672083e+000 -8.7937276547163435e+001 4.9008957615364341e+002</data></translation> </opencv_storage>

移動後

<translation type_id="opencv-matrix"> <rows>1</rows> <cols>3</cols> <dt>d</dt> <data> -5.2429777870090728e+000 -8.7795283061065916e+001 7.5504258235814234e+002</data></translation> </opencv_storage>

となっていました.
3個目の値が増えているので距離ができるとZが増えるようでした.

また,左から右に移動させたときは

移動前

<translation type_id="opencv-matrix"> <rows>1</rows> <cols>3</cols> <dt>d</dt> <data> -2.4047192618357624e+001 -8.6068106084588038e+001 6.3683231706354297e+002</data></translation> </opencv_storage>

移動後

<translation type_id="opencv-matrix"> <rows>1</rows> <cols>3</cols> <dt>d</dt> <data> -2.9789650136340668e+002 -7.9622105746017198e+001 6.3870792291544353e+002</data></translation> </opencv_storage>

となっており2個目の値が減っていました.

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。
意外に情報ないですね。cvFindExtrinsicCameraParams2()はOpenCVに含まれるサンプルでも使われてないようですし。

ここを見ると、cvCalibrateCamera2()でキャリブリーションした結果とカメラ画像上で抽出した特徴点群をcvFindExtrinsicCameraParams2()へ与えたら、「校正儀の回転と平行移動」が得られるそうです。
でも、肝心の「校正儀の回転と平行移動」の説明が見当たらないです。

Konnyaさん参考リンクの「外部パラメータ推定,データ出力の参考」を見ると、回転と並行移動は下記へ出力されているようです。

CvMat *rotation = cvCreateMat (1, 3, CV_32FC1);
CvMat *translation = cvCreateMat (1, 3, CV_32FC1);

両方とも3次元ベクトルなので3軸周りの回転と並行移動でしょう。単位はそれぞれラジアンとピクセルだろうと予想しますが、基準が分かりません。

ここにヒントがありそうな雰囲気があるのですが、残念ながら、cvProjectPoints2()へそれらを直接あたえてたのでヒントになりませんでした。
でも、このサンプルの作者は「詳解 OpenCV」を参考にしたと書いているので、この本に解説があるかも知れません。

もしくは、チェス・ボードをカメラに正対するように置いて、並行移動させてtranslationの値の変化を見れば何か判るかも知れません。カメラにチェス・ボードを近づけたら(x, y, z)のzが小さくなるなどしてくれれば早いかも。

投稿2015/12/10 06:33

Chironian

総合スコア23272

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

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

Konnya

2015/12/10 10:26

早い回答ありがとうございます. チェス・ボードを固定してカメラを平行移動させて見た結果を追記しました
Chironian

2015/12/10 10:55

と言うことは、translationの値が(y, x, z)の順になっているような気がしませんか?同様にしてrotationも推定できるのではないでしょうか? そして、同様の工夫で原点も見つけることができると思います。これらが見えてくればKonnyaさんが望む処理を設計できる筈と思います。 申し訳ないですが、私にできるアドバイスはここまでです。3Dは私にとって苦手分野なのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問