「夫を成功」へ導く妻の秘訣 座談会

全方位カメラのパノラマ画像展開を行っています。
現在、円錐鏡を利用して展開を行っているのですが、パノラマ画像にすると、どうしても歪みが発生してしまいます。
ネットで調べていたところ、双曲面鏡を利用した場合、歪みを抑えることが出来るとの情報を見つけたのですが、なぜ双曲面鏡を利用すると歪みを抑えることが出来るのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

なるほど。

状況はわかりました。

既存のカメラが双曲面鏡を使うのは、視野角を広くとるためです。
自動車のルームミラーなどで、凸面鏡にして広範囲に見えるようにするのと同じ理屈。
円錐だと反射角の関係で上下方向はかなり範囲が狭くなりますが、双曲面鏡なら、上下180度近い範囲の視野を反射させてカメラに入れられます。

歪みについては、自作プログラム側の処理で低減できると思います。
どんな鏡を使う場合でも、撮影画像の半径方向から、パノラマ画像の上下方向の変換について、変換式を正しくすれば歪みは出てきません。

変換式については、カメラの画角と鏡の角度などから計算で双曲面鏡の場合は計算式が複雑になりますが、円錐鏡の場合は簡単な式になります。
ただし、撮影画像の「半径」がそのままパノラマ画像の「上下角」に対応するわけではないのに注意してください。

撮影画像での「半径」から、atan を取ることで、その方向の「中心線からの角度」が求まります。
この部分の計算は、カメラの画角などの情報が必要です。

あとは、撮影画像から求めた「中心線からの角度」と、パノラマ画像の「上下角」の関係は一次式になります。
(ここでも、撮影画像の中心から外縁までを、パノラマ画像の上下のどこからどこまでに対応するのか、変換範囲を正しく設定する必要があります)

以上の処理がきちんと出来れば、変換できたパノラマ画像に歪みは出てきません。

この回答への補足

なるほど・・・・、既存のカメラが双曲面鏡を使うのは、視野角を広くとるためであって、歪みが軽減されるからといった理由では無かったのですね。
誤解していました。
ということは、mtaka2さんのおっしゃる通り、円錐鏡を使用している事が、パノラマ画像の歪みを引き起こしているのではなく、私のプログラムと、撮影の精度(円錐鏡の頂点がパノラマ展開の際の中心と一致してない等)が原因ですね。

補足日時:2008/09/18 17:52
    • good
    • 0

「既存の全方位カメラで撮影した画像」を、「パノラマ画像展開して再投影」しようとしているということでいいですか?



だとしたら、「撮影に使用しているカメラについている鏡」と同一形状の鏡を使って逆変換するのがもっとも歪みが少なくなります。
(同じ形の鏡に、撮影時とまったく同じ大きさ・投影角で逆方向に投射すれば、まったく元通りの映像が再現できる。)

既存の全方位カメラは、たいてい双曲面鏡を使ってますから、投影にも双曲面鏡を使う方が歪みが少なくなります。

この回答への補足

早速の回答ありがとう御座います。
「パノラマ画像展開して再投影」ですが、私の説明不足で間違って伝わっているかも知れません。
改めて、詳細を説明させて頂きます。

私は、市販されているミラー一体型カメラは使用しておりません(値が張りますので・・・・)。
円錐鏡を真上から三脚に固定したデジカメで撮影し、円錐鏡に映り込んでいる周囲の映像を自作プログラムを利用して、パノラマ写真に展開させる事を目的としています。
ただ、その展開したパノラマ写真を見ると、歪みが強く、あまり実用的ではないのが現実です。
そうした中、mtaka2さんのおっしゃる通り、既存の全方位カメラの多くは、双曲面鏡を利用しているようですが、双曲面鏡は円錐鏡などと比較して、なぜそんなに歪みが少ないのでしょうか?

補足日時:2008/09/17 21:18
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q魚眼レンズの画像処理

魚眼レンズで撮影した画像って、ひずんでますよね。
これを普通に(って何が普通かと言う問題はあるけれど)直す
処理プログラムをおしえていただけませんか?

できれば、教科書的なものでなく、サンプルプログラムがあれば
うれしいんですが・・・
言語は、C以上の高級言語ならたいていわかるので
せめてポインタだけでも・・

お願いします。

Aベストアンサー

代数幾何の射影変換で多分出来ると思います
通常画像を射影変換して魚眼レンズで見たような画像に出来るので魚眼レンズの射影行列の逆行列で変換してやれば元の画像に戻るはずです

元画像をN、射影行列をA、その逆行列をA^-1とした時、
NAが魚眼レンズ画像となるので、それにA^-1をかけると
NAA^-1 = N(AA^-1)
= N1
= N
で、元画像に戻ります

サンプルプログラムは「アフィン変換」や、「射影変換」などで検索すれば出てくると思います
または3D Gameのライブラリを見ればまず載っているはずです

参考URL:http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpdx6sdk/_dx_the_projection_tr

Q最近隣補間法

 タイトルにも書いた最近隣補間法(nearest neighbor)だけでなく、共1次補間法(bilinear),3次たたみ込み補間法(cubic convolution)について、わからなくて困ってます。僕が持っている本の中にはのっていないです。3種類の特徴の違いやどういうアルゴリズムで画像の拡大・縮小をしているかが知りたいです。

Aベストアンサー

ちょっと引用ミスがありました。Pの計算のための列ベクトルの要
素が全部 f(x1) になってしまっていますが、おわかりのように、
f(x1) から順に f(x4) までです。

Q魚眼画像について

魚眼レンズで得られた周囲180の円形画像について展開方法を教えてください。

このように
http://www.hh.iij4u.or.jp/~jun2/EnjoyFisheyeLens/EnjoyFisheyeLens002.html
経度にそって展開する方法

原理或いはそれを紹介するホームページいただいても幸いです。

よろしくお願いします。

Aベストアンサー

>地図を作る方向と同じのことがわかったので、現在円筒図法とメルトカル図法を検討中、もし目標画像と同じような画像できたら報告します。

メルカトル図法いいですね。
正距円筒を、どのように縦に伸ばしているのかは存じませんが、我々が地図として見ているものの多くはメルカトル図法ですよね。

興味がある人もいると思うので、トランスフォームの式を載せて頂けると嬉しいです。

QOpenCVによる連続静止画保存

OpenCVとVisual Studio 2005を使ってカメラ画像を出力し、キーを押すことで画像をファイルに保存しています。しかし、キーを押すたびに画像が上書きされてしまい、結局保存ファイルは一つだけになってしまい連続して画像ファイルが取得できません。下記のプログラムで下のほうに書いてあるcvSaveImage()関数にうまくカウンタを使ってやればいいと思うのですが、私の技量ではできませんでした。知っている方がいたら教えてください。よろしくお願いします。

//---------------------------------------------------------
// 概要 : カメラからの入力画像をそのまま表示
// File Name : image.c
// Library : OpenCV for MS-Windows 1.0
//---------------------------------------------------------

#include <stdio.h>
#include <highgui.h>

int main( int argc, char** argv ){
int key;//キー入力用の変数
CvCapture *capture;//カメラキャプチャ用の構造体
IplImage *frameImage;//キャプチャ画像用IplImage
char windowNameCapture[] = "Capture";//キャプチャした画像を表示するウィンドウの名前

//カメラを初期化する
if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) {
//カメラが見つからなかった場合
printf( "カメラが見つかりません\n" );
return -1;
}

//ウィンドウを生成する
cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE );

//メインループ
while ( 1 ) {
//カメラからの入力画像1フレームをframeImageに格納する
frameImage = cvQueryFrame( capture );

//画像を表示する
cvShowImage( windowNameCapture, frameImage );

//'q'キーが入力されたらループを抜ける
key = cvWaitKey( 1 );
if ( key == 'q' ) {
break;
}else if( key == 'c'){
cvSaveImage("picture.bmp", frameImage );
}


}

//キャプチャを解放する
cvReleaseCapture( &capture );
//ウィンドウを破棄する
cvDestroyWindow( windowNameCapture );

return 0;
}

OpenCVとVisual Studio 2005を使ってカメラ画像を出力し、キーを押すことで画像をファイルに保存しています。しかし、キーを押すたびに画像が上書きされてしまい、結局保存ファイルは一つだけになってしまい連続して画像ファイルが取得できません。下記のプログラムで下のほうに書いてあるcvSaveImage()関数にうまくカウンタを使ってやればいいと思うのですが、私の技量ではできませんでした。知っている方がいたら教えてください。よろしくお願いします。

//------------------------------------------------...続きを読む

Aベストアンサー

OpenCV というよりも単に文字列の問題ですよね?
例えば以下のようにします。


int main( int argc, char** argv ){
  // 以下二行追加
  int counter = 0;
  char str[32];

  /* 省略 */

    key = cvWaitKey( 1 );
    if ( key == 'q' ) {
      break;
    } else if( key == 'c'){

      // 以下二行追加、修正
      sprintf(str, "img_%04d.bmp", counter++);
      cvSaveImage(str, frameImage );
    }

  /* 省略 */


VC2005 では sprintf() に警告が出るかもしれませんので、
問題があれば sprintf_s() などを使って下さい。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング