魚眼画像、全方位画像の展開プログラミング
21 views (last 30 days)
Show older comments
takumi honda
on 14 Oct 2019
Commented: takumi honda
on 25 Oct 2019
魚眼画像、全方位画像、を展開する構文を作りたいのですが、計算上は理解できているのですが、構文に起こせません。お教えいただけると幸いです。
10 Comments
Yoshio
on 17 Oct 2019
Edited: Yoshio
on 18 Oct 2019
Kenta Itakura さん、ありがとうございます。
魚眼カメラ(fish-eye camera)と全方位カメラ(omni-directional camera)とは別物、ということが分かりました。従って両者の画像上の点と3次元空間の対応関係式は異なりますが、ヴインストン株式会社の全方位カメラ の場合、以下のような情報があります。
他にも文献がありますね。
カメラの焦点距離と、ミラーの双曲面の形状を定義する定数パラメータは恐らくチェッカーボードを複数おいた画像を使えば推定できるのではないかと思います。
こちらに関連の情報があります。
に行き着きます。
Accepted Answer
Takashi Ueno
on 16 Oct 2019
興味があったのでちょっと作ってみましたが、こんな感じでしょうか?
雑にお絵描きして元画像を作ったので、結果も歪んでますが、参考にしていただければ。
使用した画像は添付しておきます。
clear
close all
I=imread('test.png');
I=rgb2gray(I);
figure
imshow(I)
% 切り出し中心
c=[190,198];
% 切り出し半径
R=175;
% 分割の角度数
angles=360;
% 極座標の設定
theta=linspace(0,2*pi,angles);
rho=1:R;
theta_array=kron(theta,ones(1,length(rho)));
rho_array=repmat(rho,1,angles);
% 極座標から直交座標に変換
[x,y]=pol2cart(theta_array,rho_array);
% 原点を画像中心から左上(1,1)にオフセット
x_f=x+c(2);
y_f=y+c(1);
% 直交座標は小数になるので、bilinearでの内挿を作成
F = griddedInterpolant(double(I));
% クエリ点の値の取得
I2=F(y_f',x_f');
% I2は1次元配列なのでreshape
I2=reshape(I2,length(x_f)/angles,angles);
figure
imshow(I2/255)
4 Comments
Kenta
on 19 Oct 2019
上に解説をいただき、ありがとうございます。
こちらのコード例について質問させていただけませんか。
Yoshio様よりご紹介いただいた、こちらのリンクhttps://www.youtube.com/watch?v=3IhXJR1ejeY
では透視投影変換の式が出てきていますが、こちらのコードではそのパラメータに関する情報がどれに対応しているのか追いきれませんでした。例えば、このリンクのa, b, cは、カメラのレンズの形(双曲線)を表していると思うのですが(こちらも不勉強で私の理解が間違っているかもしれません)、ここでは、きれいな半球のレンズを想定されている、ということでしょうか。
More Answers (1)
takumi honda
on 22 Oct 2019
2 Comments
Takashi Ueno
on 24 Oct 2019
極座標から直交座標系に変換した際、そこの画素値を求めるために補間を使用しています。
griddedInterpolantでの内挿の作成の際、チャンネルごとに行えばカラーでも問題ないです。座標は使いまわせるはずです。
私の場合、お絵描きで画像を作った際、グレースケールだけで作ったのですが、画像がRGBで出ていたのでグレースケール化しただけです。
See Also
Categories
Find more on MATLAB Support Package for USB Webcams in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!