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

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

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

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

OpenCV

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

6143閲覧

画素のカメラに対する角度を求めたい

nuiri1343

総合スコア54

C

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

OpenCV

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/11/28 06:49

編集2018/11/28 08:37

前提・実現したいこと

カメラで画像を一枚撮影すると、その画素に対応する角度というのが求められるのでは無いかと思います。
下図のような画像を撮影した際、黄色い線の、カメラに対する角度を求めたいのです。

簡略図

角度は、3次元的な角度になると思うので、以下二つの角度が求めたいです。
イメージ説明
イメージ説明

わかりにくい説明で申し訳ありません。

実際の点の3次元位置を、画像平面上の画像座標から求めることは出来ないと思います。(奥行き方向の情報がないため)
ですが、角度であれば計算できるのではないかと考えました。

カメラの内部パラメータと外部パラメータは、Zhangのキャリブレーション法を利用して推定済みです。
どうやってこれらの角度を求めれば良いのか教えていただけないでしょうか。

プログラミングや、画像処理について初心者なので詳しく教えていただけると助かります。
opencvと関係があるのかとかもわかりません。

どうかよろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

Windows10
VisualStudio2017
OpenCV-3.4.2

追記

コメントに画像を貼り付ける方法が分からなかったので、ここに追記します。

イメージ説明

こんな感じで考えていたのですが、
まったくの見当違いなのでしょうか?

方向を表すベクトルが分かれば、角度も計算できるのではというように考えていました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

内部パラメータが求まっているのであれば,
射影式から導出するだけではないでしょうか.

Zhangの手法の内部パラメータの意味を調べると良いでしょう.
OpenCVを使っているなら,リファレンスに載っているはずです.


CVのリファレンスからの引用
イメージ説明

やることは,
pixel座標(u,v)に対応する(x',y')を求めるということですよね(そこから角度の算出はご自由に).
(解析的に解けない場合,都度数値計算で求めるなり,事前に逆関数の近似式でも求めておいて使うなり,何らかの方法で頑張る必要はあるでしょうけども)

投稿2018/11/28 07:31

編集2018/11/28 07:42
fana

総合スコア11632

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

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

nuiri1343

2018/11/28 07:37

射影式とはなんでしょうか。 内部パラメータは焦点距離と光学中心の座標だということは知っていますが、 画素→角度への変換にこれらの意味?が使えるのでしょうか?
fana

2018/11/28 07:46

追記しました. 貼った式は,(u,v) = f(x',y' ; 内部パラメタ群) という方向ですので, この逆関数 (x',y') = f_inv( u,v ; 内部パラメタ群 ) を解く形になります.
nuiri1343

2018/11/28 08:25

丁寧な説明と迅速な回答ありがとうございます! u,vというのは、画像座標系上での座標、つまり画素の位置ということであっていますでしょうか? また、x',y'というのはカメラ座標系(レンズ中心を原点とした座標系)での、z=f平面での、x,y座標という認識であっていますでしょうか? それがx'',y''でしょうか・・・? x'とy'は、x''とy''にレンズの歪みを考慮した値ということでしょうか?
fana

2018/11/28 08:45

繰り返しになりますが,より信頼性のある情報ソースとして,CVのリファレンスや,あるいはZhangの論文そのものを参照することをお勧めします. u,vはその通りです.撮影画像上での座標(単位がPixel)です. > z=f平面での x,y,z がカメラ座標系における3次元座標なので, x',y'は,z=1 平面上かと思います. > x'とy'は、x''とy''にレンズの歪みを考慮した値 逆かな? 「x'とy'に対して,歪曲収差の影響を加味したものがx'',y''」と言うべきかも. (歪がなければ u=..., v=... の式にx'',y''ではなくx',y'を使う)
nuiri1343

2018/11/28 08:50

なるほど! z=1平面でのx座標と、y座標を求めるのを目標として、 u,v(画像上での座標)を変換していくということだと思うのですが x"は、(u-cx)/fx というような感じで計算できると思いますが、 x"からx'を求めるというのは、全く見当が付きません。 x" = x'(1+k1r^2 .......というのの逆をやるということですよね? こんなことできるのでしょうか。
nuiri1343

2018/11/28 08:58

このサイトはずっと見ていますが、 どの部分が参考になるのか全く分かりません。 openCVの関数の中に、歪みの影響を加味する前のx,yを求めるという関数があるのでしょうか? 初心者なのでわからないんです
fana

2018/11/28 09:05

参考 というのは,「u,v,x',y', ... がそれぞれ何なの?」という件についてです. > 歪みの影響を加味する前のx,yを求めるという関数があるのでしょうか? 順方向は projectPoints() という関数があるようですが, 逆方向は無いっぽい? (すくなとも私は知りません) …なので(本当に無いなら)回答に既述したように「何らかの方法で頑張る」ことになるかと.
nuiri1343

2018/11/28 09:13

ごめんなさい。そういうことでしたか。 丁寧に教えていただいて本当にありがとうございます。 頑張るというのは、数値計算等で誤差が最小になるように推定したりっていうことですよね・・・ 透視投影変換の逆変換(画像座標系→カメラ座標系→ワールド座標系)は普通に行われていることだと思っていました。(ワールド座標と言っても奥行き情報は無いので、そこは2枚の画像を使ったりセンサを使ったり等、他から情報を補うなどする) つまり、画像座標系→カメラ座標系の変換も一般化された方法等があるのではないかと思いました。 しかし、レンズの歪みを加味する前のx,yが求められなければ、画像座標系→カメラ座標系の変換ってできないですよね? 皆さんはどうしているのでしょうか。
fana

2018/11/28 09:31

おっしゃる通り,画像上の位置(u,v)からカメラ座標系の方向ベクトルを求めることは,わりと普通に必要な計算だと思います. 世間一般でどうしているのかはわかりませんが… 私が過去にやった際には,「k4以降とp1,p2を使わない」という式がある程度簡単な条件の下で,ですが, x',y’ から x'',y'' を求める式を変形して rから歪んだ世界でのr''=sqrt(x''^2 + y''^2 ) を求める式にして, その逆関数をあらかじめ多項式近似しておき,その近似された逆関数を計算時に使う形を取っていました.
nuiri1343

2018/11/28 14:28

k4以降とp1,p2を使わない式というのがあるのですか その式はリファレンスのどこかに書いてあるのでしょうか? 載せてくださったURLは頑張って翻訳します!
fana

2018/11/29 01:16

cvのcalibrateCameraの引数の説明を見れば,{k4以降を扱うか,p1とp2を扱うか,etc}といった選択が可能なことがわかると思います. (式については(ご自身で)扱わないパラメータの値を0にしてみればよいかと. : p1,p2を使わないなら項が減りますし,k4~k6を使わないなら分数部分の分母が1になって分数じゃなくなる.)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問