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

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

お願いします。

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

A 回答 (3件)

代数幾何の射影変換で多分出来ると思います


通常画像を射影変換して魚眼レンズで見たような画像に出来るので魚眼レンズの射影行列の逆行列で変換してやれば元の画像に戻るはずです

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

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

参考URL:http://www.microsoft.com/japan/developer/library …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
うっ。た、確かに・・
レンズを通した画像は、すべて行列変換ですよね。
(基本でした)
ってことは、魚眼レンズの変換用行列(パラメータ)を
実測(か、計算)して、フィルタを作らなくちゃいけないんですね。

ん~、見えてきたような気がします。

また、3DGameの方面は、よく知らなかったので、
調べてみることにします。
URLは、NotFoundでしたけど、
たぶんDirectX6(?)のような気がするので
DirectX8とOpenGL関係も見てみます。

ありがとうございました~

お礼日時:2001/03/02 11:26

射影変換(とその一部であるアフィン変換)は直線が直線になる変


換ですから、魚眼レンズの変換や逆変換には使えませんよ。ごく一
部なら近似できるかもしれませんが。

で、まずは教科書的に。

広角を含む普通のレンズは、視野の一部を視点からDだけ離れた平
面に投影します。これに対して魚眼レンズは、まず視点を中心とし
た半径rの球面に視野全体を投影して、次にその投影した結果を平
面に垂直に投影しなおすものです。

# ただし、本物のレンズが完全にこの数学モデルどおりに働いてい
# るかどうかは、レンズの設計にもよると思うのでわかりません。

さて、この原理がわかれば、魚眼レンズと普通のレンズの間の変換
をするための式を立てることができます。

普通のレンズの画像で中心からLだけ離れた点と、魚眼レンズの画
像の中心からlだけ離れた点が対応しているとします。そうすると、
l/r = L/sqrt(D^2+L^2)
になります。つまり、
l = rL/sqrt(D^2+L^2)
ですね。同じように、普通の画像上の点P(X,Y)と魚眼の画像
上の点p(x,y)を対応させると、
x = rX/sqrt(D^2+X^2+Y^2)
y = rY/sqrt(D^2+X^2+Y^2)
となります。これは、普通→魚眼の座標変換式ですが、画像の逆変
換には逆変換の式を作るのではなく、この式をそのまま使います。
なぜなら、逆変換後の座標(X,Y)の画素の値は、逆変換前の座標
(x,y)の画素の値になるわけですから、プログラム上は(X,Y)をぐる
ぐる回して、(x,y)を求めて、その位置の値を(X,Y)の値とすればい
いからです。

プログラムを書くなら、
for (X=0;X<W;X++) {
 for (Y=0;Y<H;Y++) {
  x = r*(X-W/2)/sqrt(D*D+(X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2)) + w/2;
  y = r*(Y-H/2)/sqrt(D*D+(X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2)) + h/2;
  if (x >= 0 && x < w && y >= 0 && y < h) {
   futsuu[X][Y] = gyogan[x][y];
  } else {
   futsuu[X][Y] = black; /* or white or any */
  }
 }
}
て感じでしょうか。W,H, w,h は、それぞれの画像の幅と高さです。
ただし、x, y が画像の範囲をはみ出していないかチェックする必
要があります。

また、画質をよくするためには適当な補間法を適用します。補間法
については、
http://oshiete1.goo.ne.jp/kotaeru.php3?q=15511
で答えているので参考にしてください。

rには魚眼の画像の半径を設定します。
D/rが中心付近の倍率になります。


参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=15511
    • good
    • 2
この回答へのお礼

punchan_jpさん、ご回答ありがとうございます。
レンズのしくみから、プログラムまで、さらに画質向上の補完法まで
至れり尽くせりとはこういうことですね。
お礼に「名誉と栄光」を進呈します。いや、失敬。
 もうじき実際の画像が手に入るので、それまでに教えていただいた
プログラムをモデファイしようと思います。

あわてて締め切ってしまい「しまった~」(トヨエツ金田一風)
と思ってます。

自分の疑問が、こっちのほう「教育 > 理系の学問 > その他(理系の学問)」
だということもためになりました。
改めて、ありがとうございました。
機会があれば、結果をお知らせしたいと思います。

お礼日時:2001/03/05 16:19

魚眼(というか広角)レンズで撮った絵の中心に近いゆがみの少ない部分が


広角では無いレンズで撮った絵そのものになります。
という事で、中心のゆがみが目立たない部分だけを切り出してください。

って、これじゃ意味が無いですよね。。。(^^;

まず、ゆがみとは、平行な線が平行に写っていない事だとします。
例えば、絵の中心から八方向に平行線が出ている状態を写したとすると
それをすべて平行に変換するのは無理ですよね、。
という事で写っている範囲のすべてを変換する事はできません。

では、上下1/3くらいづつを切り取ってやるとどうでしょう?
これならば端のほうを上下に伸ばしてあげれば、それなりに見れる絵に
近似できると思います。
(上下端に近い部分は、少し横にも伸ばすほうがより良くなりますね)
アルゴリズムはCが判るという事ですので、がんばってください!
たぶん二次曲線を基準に変換すれば良いと思うのですが。

ところで、質問ではサンプルプログラムがあると嬉しいという事ですが、
そもそも画像フォーマットは何でしょうか?
質問の書き方のレベルと求める回答のレベルが違っているのではないでしょうか?

画像がbmpでしたら、上記の方法でだけですむでしょうが、
jpgなど圧縮のかかっている形式でしたらjpg→bmp変換が先になります。
jpg→bmp変換については、残念ながら私はわかりません。。(^^;
この質問のままで置いておいても答えはつかないと思うので、
フォーマット変換については検索をかけて調べるか、
新しい質問として書き込んだほうが良いですよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ちょいと特殊な内容なので、回答つかないかなとあきらめかけてました。
カメラ解像度は、512×512で、メモリ上に展開されます。
(っていまごろ書いても遅いんですが・・)
メモリ上なので、たとえば輝度値は、p[y][x] という感じで配列でアクセス可能です。したがって、ファイル形式変換は、考えなくていいです。
(それを先に言わんかっ!)ってすいませんでした。
で、「上下1/3切り取る」ということは、解像度が1/9!!
それわ、つらいんですけど~、でもそれしかないとなれば、やってみます。
ありがとうございました~

お礼日時:2001/03/02 11:14

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Q魚眼レンズについて

1. SONY DCR-TRV20(http://www.sony.co.jp/sd/products/Consumer/VD/DCR-TRV20/)というデジビデをもっているのですが、これに取り付けられる魚眼レンズはないのでしょうか?
2. また、魚眼レンズを取り付けられるデジカメはどのような種類があるのでしょうか?
3. 最後に、、、、魚眼レンズと広角レンズはどこが違うのでしょうか?

Aベストアンサー

Canon ENGレンズ対応、W80というかなり重たいコンバージョンレンズを愛用しています。
  ↓
 http://www.canon-sales.co.jp/indtech/broadcast/tvlenses/acce-optics.html


>1.SONY DCR-TRV20~取り付けられる魚眼レンズ

セミ・魚眼レンズ?でよければ、下記商品が対応すると思います。(販売店で、確認して下さい。)

レイノックス QC-303 (レンズ径37mmまで対応)
DCR-TRV20 カメラモード使用時:14.4mm位
       メモリーモード使用時:12mm位
レンズの最広角端でのみで使用可能。(ズームは利用出来ないと思います。)
  ↓
 http://www.raynox.co.jp/japanese/video/jpwidedvr.htm

あと、吉田産業も各種コンバージョンレンズを販売していますので、調べてみて下さい。


>2.魚眼レンズを取り付けられるデジカメはどのような種類があるのでしょうか?

レンズ交換可能な一眼レフカメラなら、メーカーで専用に魚眼レンズを発売している場合もあります。

その他のレンズに対しては、魚眼へのコンバージョンレンズを使用する事で殆んど対応できます。(効果はマスターレンズの焦点距離により変わります。アマチュア用のレンズに対応している魚眼へのコンバージョンレンズは少ないようです。)
※使用できない場合もあります。


>3.魚眼レンズと広角レンズはどこが違うのでしょうか?

実際の写真を見て頂いた方が解り易いと思います。
下記URLを参考にして下さい。

魚眼レンズを使用すると、この様な写真が撮れます。
  ↓
 http://taiki3.envi.osakafu-u.ac.jp/AtmEnvDoc/Aono/fisheye.html

ニッコール千夜一夜物語
  ↓ 魚眼レンズの仕組み等、詳しい
 http://www.nikon.co.jp/main/jpn/society/nikkor/n06j.htm

広角レンズとの違い
  ↓
 http://www.nikon.co.jp/main/jpn/photography/stepup/stepup9.htm

魚眼レンズは面白い表現できるので、たまに使用したいレンズです。
常用したいのであれば広角のコンバージョンレンズを勧めます。

参考URL:http://www.raynox.co.jp/japanese/video/jpwidedvr.htm

Canon ENGレンズ対応、W80というかなり重たいコンバージョンレンズを愛用しています。
  ↓
 http://www.canon-sales.co.jp/indtech/broadcast/tvlenses/acce-optics.html


>1.SONY DCR-TRV20~取り付けられる魚眼レンズ

セミ・魚眼レンズ?でよければ、下記商品が対応すると思います。(販売店で、確認して下さい。)

レイノックス QC-303 (レンズ径37mmまで対応)
DCR-TRV20 カメラモード使用時:14.4mm位
       メモリーモード使用時:12mm位
レンズの最広角端でのみ...続きを読む

Q(メモ帳 とか)普通の動作をするソフトを作るには、どんなプログラム言語が必要ですか?

Win7 ユーザーで、Java の勉強を始めた者です。テキストファイルのフォーマット変換をするプログラムが、曲がりなりにも動くようになりました。
コンパイルも実行も「コマンドプロンプト」なる真っ黒な画面でやってますが、はたと疑念が生じました。私としては、下記のごときプログラムが欲しいのです。

henkan.exe をダブルクリックすると 「変換」画面が出る
メニューバーで ファイル→開く すると「開く」画面がでる
同じく     編集→ で変換フォーマットを選択
・・・
最後は X で終端。

要する Word2010 とか メモ帳 とか、普通のプログラムのごとき表示・操作をさせるには、当サイトのプログラム一覧(になくても良いですが)にあるどの言語を使うのでしょうか? 教えてください。

Aベストアンサー

Visual Studio Community & Express

Community 2013 update4
を、ダウンロード、日本語化も出来ます。無料です。

では、いかがでしょうか?
MFCが使えるので、使いやすいサンプルを少し変形すればよいと思います。
言語は、C++ です。

Q魚眼レンズで人物撮影

デジイチ初心者です
今回 魚眼レンズで人物ポートレートを撮ろうかなと思いました
中身のない質問で皆様に失礼だと思いますが
魚眼レンズで人物撮影はいかがなものですか?

機械はキャノンキスデジX2です

皆様よろしくお願いします

Aベストアンサー

ポートレートなら、相当なチャレンジが要りますね。
まずは、被写体に異常に近づく必要がありますし、
(鼻先5cmにレンズがあっても、30cmくらい離れているように見えてしまう)
人物に近づけば遠近感が強調され過ぎてしまうし
離れれば人物が小さくなる、とまぁ、こんな感じで
扱いにくいというか、使いこなしができるまで相当いろいろ
チャレンジしてやってみて、標準レンズの常識なんぞ
打ちやぶらないと、「使えない」とおもってしまいますよ。

対角線魚眼なら、腕をひろげて「来て!」みたいなポーズで、
顔がデフォルメされない距離でとるなら
まだ見られる写真ができますけど、距離や構図を一歩
間違えるとモデルさんが怒っちゃうようなものになりますからね。

ましてや、円周魚眼なら360度だから、全身写っちゃう
しかも、部分的にデフォルメされて。

KissデジXなら、画角が1.6倍に成るので円周魚眼でも上下がきれると
思いますが、なおさら使い物にならない画像になります。

もうひとつ、モデルと1対1で向き合って撮影するのなら
まだ、工夫のしようもありますけど、みんな集まっての撮影会とかなら
魚眼使いの貴方だけが、異常にモデルに近づいてしまうことになり
ほかのカメラマンから、「邪魔だ!」「どけ!」と罵声が飛ぶことでしょう。

それと、大きさをかせごうと舐めるように近づくと
それに慣れていないモデルさんは、嫌がる、そこまで行かなくても
表情が引きつっているとか、自然でないとか、いろいろ不都合あると思いますよ。
ポートレートは、カメラマンとの距離(物理的にも心理的にも)
が適度でないと、表情が生きてこないとよく聞きますからね。

ま、ポートレートに使う前にいろいろなもので、事前に試し撮影で
どういう特徴があるかを把握しておいたほうがいいでしょうね。
ほかのカメラマンの邪魔になってしまうようだと撮影会追い出され
ちゃいますから(苦笑)

ポートレートなら、相当なチャレンジが要りますね。
まずは、被写体に異常に近づく必要がありますし、
(鼻先5cmにレンズがあっても、30cmくらい離れているように見えてしまう)
人物に近づけば遠近感が強調され過ぎてしまうし
離れれば人物が小さくなる、とまぁ、こんな感じで
扱いにくいというか、使いこなしができるまで相当いろいろ
チャレンジしてやってみて、標準レンズの常識なんぞ
打ちやぶらないと、「使えない」とおもってしまいますよ。

対角線魚眼なら、腕をひろげて「来て!」みたいな...続きを読む

Qこのプログラムは何言語?何のプログラム?

このプログラムは何言語?何のプログラム?
手掛かり的な情報は全く無いのです。

10 CLS:CGSET 1,0
20 DEF SPRITE 0,(0,1,0,0,0)=
CHR$(1)+CHR$(0)+CHR$(3)+CHR$(2)
30 SPRITE ON
40 FOR X=0 TO 240
50 SPRITE 0,X,120
60 PAUSE 3
70 NEXT

Aベストアンサー

補足:
一応正確を記す為に
20 DEF SPRITE 0,(0,1,0,0,0)=CHR$(1)+CHR$(0)+CHR$(3)+CHR$(2)
だと、たてに左右入れ替わった真っ二つ髭親父のスプライトとなります。
ちゃんと表示させると
20 DEF SPRITE 0,(0,1,0,0,0)=CHR$(0)+CHR$(1)+CHR$(2)+CHR$(3)
この順番
「上左+上右+下左+下右」に対応していて
[0][1]
[2][3]
が正常表示なら
[1][0]
[3][2]
が質問者様が提示したイメージとなります。

Q魚眼レンズのメリット教えてください。

魚眼レンズのメリット教えてください。

Aベストアンサー

メリット
・広い範囲を一つのレンズで写せる。
・天体位置測定や雲量測定に使用できる。
・趣味的にはありえない雰囲気での画像ができる。


※一眼レフ用魚眼レンズには二種類あります。
 円周魚眼レンズ 対角線魚眼レンズ

魚眼レンズ
https://ja.wikipedia.org/wiki/%E9%AD%9A%E7%9C%BC%E3%83%AC%E3%83%B3%E3%82%BA

監視カメラとしての用途
http://panasonic.biz/solution/press/ipro/ipro6.html

QOPENCVのサンプルプログラムについて

OPENCVのサンプルプログラムに「peopledetect」というものがあり.exeファイルを実行してみたのですがすぐに消えてしまい。
あたらしく作ったファイルで実行してもUsage: peopledetect (<image_filename> | <image_list>.txt) と表示されるだけで人物認識をしません。
このサンプルプログラムの使い方を教えてもらえないでしょうか。
またどこかプログラムを変更する必要があるのならばそこを教えていただけないでしょうか・・・。
まず人物認識をするための画像を入れる場所もわかっていない状態です・・・。

Aベストアンサー

Usageというのが簡単な使い方の説明です。
peopledetect (<image_filename> | <image_list>.txt)
ということなので
peopledetect イメージファイル名

peopledetect イメージリスト.txt
として実行する、ということです。

Windowsのようなので、コマンドプロンプトから上記のように指定して実行してください。

Qレタッチ・・・魚眼レンズ風

こんにちは。

きのう、会社の同僚と話していて・・・
魚眼レンズを使ってみたいけど
わざわざ買うほどではないしなぁ・・・となって
28ミリくらいの広角レンズで撮ったあとに
ソフトを使って
「魚眼レンズで撮影した」ように
画像加工ができないのかなぁ・・・と
二人で考えました。

ネット上で少しさがしてみたのですが
よくわかりませんでした。

そのような加工ができるソフトをご存知でしたら
今後の参考にしたいので教えてください。

Aベストアンサー

Photoshop(Elements)の「フィルター」⇒「変形」⇒「球面」で其れらしくはなりますが、そもそも魚眼レンズの画角は180度ですから、似て非なるものです。

QTinyCobolでサンプルプログラムがコンパイルできない

WinXPでcygwinからtinycobolを使いたくインストールしましたが、サンプルプログラムをコンパイルできず困っています。「htcobol -h」でヘルプが表示されますのでインストール自体は完了しています。
サンプルのあるディレクトリに移動して「htcobol sample.cob」でコンパイルしようとすると「c:/usr/bin/as.exe : not found」とエラーがでますが、このフォルダを開いてみると確かに空でした。
cygwinはCドライブ直下の「cygwin」フォルダにインストールしています。
原因がお判りになる方、よろしくお願いします。

Aベストアンサー

http://pcweb.mycom.co.jp/special/2002/cygwin/003.html
ここの画面08のところで[Devel]をクリックしても、binutilsが見つからないのでしょうか?

[View]ボタンをクリックして「Full」に変えて、アルファベット順にしたほうが見つけやすいかもしれません。

参考URL:http://pcweb.mycom.co.jp/special/2002/cygwin/003.html

Q魚眼レンズについて教えてください!

父から一眼レフカメラを譲ってもらった超初心者なのですが、
私はすごく魚眼レンズで撮った写真が大好きなので
魚眼レンズを購入しようと思うのですが、どこのものが
合うのか解りません。
一眼レフの勉強を先にしなければいけないとは思うのですが、
早く魚眼で写真を撮って見たいので是非教えてください!
ちなみに、譲ってもらった機種は

CANON EOS Kiss5で
レンズがEF28-90mmのものでした。よろしくお願いします。

Aベストアンサー

全周魚眼で撮ると、写っている部分は丸くなりますが
写っていない部分もプリントされますので【○】んな
写真の出来あがりとなります。

必要な部分だけをプリントすると対角線魚眼で撮った
のと同じになります。

カメラのレンズに付けるタイプのアダプタは、まあ丸
く写るのが確認できる程度の写りしませんからあまり
期待しないよーに

レンズの方は中古でもけっこうな値段がしますからねぇ(^^;

QSystemC言語の文法(関数の引数にポインタ?)

SystemC言語の文法について質問です。

ある雑誌で、ビット宣言変数のアドレスを関数に渡しており、
私も真似て作ってみたのですが、エラーが発生してしまいます。

---
(例) 引数にポインタを入れる処理

// 引数 sc_uint<32> *s の関数
void test::Calc_func( sc_uint<32> *s )
{
cout << "s[0] = " << s[0]; // 32bitのデータ出力?
}

// これがmain文の代わりです
void test::A_func(void)
{
sc_biguint<2048> a;
sc_uint<12> i;

for( i = 0; i < 2048; i++ ) {
a[i] = 0;
}
Calc_func( &a[0] ); // ←問題!
}

// Error内容
Calc_funcの引数の入れ方が駄目!
---

色々、Calc_funcへの型を変えてやってみたのですが、
全くびくともしません。

雑誌が間違っている可能性は低いと思いまして、
今回、このような質問をさせていただきました。

インターネット上の情報でも、このような処理を
見つけることができませんでした。

どうぞよろしくお願いいたします。

SystemC言語の文法について質問です。

ある雑誌で、ビット宣言変数のアドレスを関数に渡しており、
私も真似て作ってみたのですが、エラーが発生してしまいます。

---
(例) 引数にポインタを入れる処理

// 引数 sc_uint<32> *s の関数
void test::Calc_func( sc_uint<32> *s )
{
cout << "s[0] = " << s[0]; // 32bitのデータ出力?
}

// これがmain文の代わりです
void test::A_func(void)
{
sc_biguint<2048> a;
sc_uint<12> i;

for( i = 0; i < 2048; i++ ) {
a[i] = 0;
}
Calc_func( ...続きを読む

Aベストアンサー

SystemCに関してよく理解できている訳ではないので、以下は間違っているかも知れませんが、一応、ご参考までに。


sc_biguint<2048> a;

これは2048ビット符号無し整数の型宣言なのでaは2048ビットとなりますが、

sc_uint<32> *s

では、sは32ビット符号無し整数のポインタです。

&a[0]は上記より2048ビットの数値のポインタなので、32ビットの数値のポインタであるsとは、元々合わないのではないでしょうか?

型変換とは具体的にどの様な事をされたかは分かりませんが、SystemCはハードウエアを記述していますので、ハードウエア、例えば2048ビットのレジスタと32ビットのレジスタが同じ扱いにはならないという意味ではないかなと思います。


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

人気Q&Aランキング

おすすめ情報