以下、本実施形態について説明するが、実施形態は、以下に説明する実施形態に限定されるものではない。なお、以下の実施形態では、撮像装置および情報処理装置の一例として、全天球カメラを用いて説明する。
以下、図1および図2を参照しながら、本実施形態による全天球動画システムの全体構成について説明する。
図1は、本実施形態による全天球動画システムを構成する全天球カメラ110の断面図である。図1に示す全天球カメラ110は、撮像体12と、上記撮像体12およびコントローラやバッテリなどの部品を保持する筐体14と、上記筐体14に設けられたシャッター・ボタン18とを備える。
図1に示す撮像体12は、2つの結像光学系20A,20Bと、CCD(Charge Coupled Device)センサやCMOS(Complementary Metal Oxide Semiconductor)センサなどの2つの撮像素子22A,22Bとを含み構成される。結像光学系20各々は、例えば6群7枚の魚眼レンズとして構成されている。上記魚眼レンズは、図1に示す実施形態では、180度(=360度/n;光学系の数n=2)より大きい全画角を有し、好適には、185度以上の画角を有し、より好適には、190度以上の画角を有する。このような広角な結像光学系20と撮像素子22とを1個ずつ組み合わせたものを広角撮像光学系と参照する。
2つの結像光学系20A,20Bの光学素子(レンズ、プリズム、フィルタおよび開口絞り)は、撮像素子22A,22Bに対して位置関係が定められる。より具体的には、結像光学系20A,20Bの光学素子の光軸が、対応する撮像素子22の受光領域の中心部に直交して位置するように、かつ、受光領域が、対応する魚眼レンズの結像面となるように位置決めが行われる。
図1に示す実施形態では、結像光学系20A,20Bは、同一仕様のものであり、それぞれの光軸が合致するようにして、互いに逆向きに組み合わせられる。撮像素子22A,22Bは、受光した光分布を画像信号に変換し、コントローラ上の画像処理手段に順次、画像フレームを出力する。詳細は後述するが、撮像素子22A,22Bでそれぞれ撮像された画像は、合成処理されて、これにより、立体角4πステラジアンの画像(以下「全天球画像」と参照する。)が生成される。全天球画像は、撮影地点から見渡すことのできる全ての方向を撮影したものとなる。そして、全天球画像の連続するフレームにより、全天球動画が構成される。なお、撮像素子22A,22Bは、その特性上、同期をとって撮像を行っている。ここで、説明する実施形態では、全天球画像および全天球動画を生成するものとして説明するが、全天周画像や全天周動画、水平面のみ360度を撮影した、いわゆるパノラマ画像およびパノラマ動画であってもよい。
図2(A)は、本実施形態による全天球動画システムを構成する全天球カメラ110のハードウェア構成を示す。全天球カメラ110は、説明する実施形態における情報処理装置または撮像装置に対応する。
全天球カメラ110は、CPU(Central Processing Unit)112と、ROM(Read Only Memory)114と、画像処理ブロック116と、動画圧縮ブロック118と、DRAM(Dynamic Random Access Memory)インタフェース120を介して接続されるDRAM132と、外部センサインタフェース124を介して接続される姿勢角センサ136とを含み構成される。
CPU112は、全天球カメラ110の各部の動作および全体動作を制御する。ROM114は、CPU112が解読可能なコードで記述された制御プログラムや各種パラメータを格納する。ROM114に加えて、制御プログラムを格納するためのSSDなどのストレージを備えてもよい。画像処理ブロック116は、2つの撮像素子130A,130B(図1における撮像素子22A,22Bである。)と接続され、それぞれで撮像された画像の画像信号が入力される。画像処理ブロック116は、ISP(Image Signal Processor)などを含み構成され、撮像素子130から入力された画像信号に対し、シェーディング補正、ベイヤー補間、ホワイト・バランス補正、ガンマ補正などを行う。
動画圧縮ブロック118は、MPEG-4 AVC/H.264などの動画圧縮および伸張を行うコーデック・ブロックである。DRAM132は、各種信号処理および画像処理を施す際にデータを一時的に保存する記憶領域を提供する。
姿勢角センサ136は、3軸の加速度成分および3軸の角速度成分を検出するセンサである。検出された加速度成分および角速度成分は、後述するように、重力方向への全天球画像の天頂補正および重力方向周りの回転補正を施すために用いられる。姿勢角センサ136は、さらに、方位角などを求めるための地磁気センサなど他のセンサを備えてもよい。
全天球カメラ110は、さらに、外部ストレージインタフェース122と、USB(Universal Serial Bus)インタフェース126と、シリアルブロック128とを含み構成される。外部ストレージインタフェース122には、外部ストレージ134が接続される。外部ストレージインタフェース122は、メモリカードスロットに挿入されたメモリカードなどの外部ストレージ134に対する読み書きを制御する。USBインタフェース126には、USBコネクタ138が接続される。USBインタフェース126は、USBコネクタ138を介して接続されるスマートフォンなどの外部装置とのUSB通信を制御する。シリアルブロック128は、スマートフォンなどの外部装置とのシリアル通信を制御し、無線NIC(Network Interface Card)140が接続される。
電源スイッチの操作によって電源がオン状態になると、上記制御プログラムがメインメモリにロードされる。CPU112は、メインメモリに読み込まれたプログラムに従って、装置各部の動作を制御するとともに、制御に必要なデータをメモリ上に一時的に保存する。これにより、全天球カメラ110の後述する各機能部および処理が実現される。制御プログラムには、ファームウェア、オペレーティング・システム(OS)、プラグイン・アプリケーションなどが含まれ得る。
図2(B)は、本実施形態による全天球動画システムを構成する情報端末150のハードウェア構成を示す。情報端末150は、説明する実施形態における情報処理装置に対応する。
図2(B)に示す情報端末150は、CPU152と、RAM154と、内部ストレージ156と、入力装置158と、外部ストレージ160と、ディスプレイ162と、無線NIC164と、USBコネクタ166とを含み構成される。
CPU152は、情報端末150の各部の動作および全体動作を制御する。RAM154は、CPU152の作業領域を提供する。内部ストレージ156は、CPU152が解読可能なコードで記述された、オペレーティング・システムや、本実施形態による情報端末150側の処理を担うアプリケーションなどの制御プログラムを格納する。
入力装置158は、タッチスクリーンなどの入力装置であり、ユーザ・インタフェースを提供する。入力装置158は、全天球動画の補正など操作者による各種の指示を受け付ける。外部ストレージ160は、メモリカードスロットなどに装着された着脱可能な記録媒体であり、動画形式の画像データや静止画データなどの各種データを記録する。ディスプレイ162は、ユーザ操作に応答して補正された全天球動画を画面表示する。無線NIC164は、全天球カメラ110などの外部機器との無線通信の接続を確立する。USBコネクタ166は、全天球カメラ110などの外部機器とのUSB接続をする。
情報端末150に電源が投入され電源がオン状態になると、内部ストレージ156から制御プログラムが読み出され、RAM154にロードされる。CPU152は、RAM154に読み込まれた制御プログラムに従って、装置各部の動作を制御するとともに、制御に必要なデータをメモリ上に一時的に保存する。これにより、情報端末150の後述する各機能部および処理が実現される。
以下、図3~図6を参照しながら、本実施形態による全天球動画システムが備える全天球動画補正機能について説明する。
図3は、本実施形態による全天球動画システム上で実現される全天球動画補正機能に関連する主要な機能ブロック210を示す。全天球カメラ110の機能ブロック210は、図3に示すように、全天球動画撮像部212と、記憶部218と、天頂・回転補正部220と、天頂補正データ再計算部222と、回転補正データ再計算部224とを含み構成される。
全天球動画撮像部212は、2つの撮像素子130A,130Bを用いて連続したフレームを順次撮像し、全天球動画データ240を記憶部218に記録する。全天球動画撮像部212は、さらに、タイムスタンプ記録部214と、傾き記録部216とを含み構成される。
タイムスタンプ記録部214は、各フレームに対し、基準となる基準時刻を求めて、求めた基準時刻を各フレームに関連付けてタイムスタンプとして記録する。ここで、動画の各フレームの基準時刻は、フレームの露光中心の時刻に関係するものである。傾き記録部216は、撮像中、各時点で、姿勢角センサ136を用いて3軸方向の加速度成分および3軸方向の角速度成分などを計測し、全天球動画データ240のメタデータとしてこれらの計測した情報を記録する。タイムスタンプ記録部214および傾き記録部216は、それぞれ、本実施形態における記録手段および取得手段を構成することができる。
記憶部218は、全天球動画撮像部212によって記録された1または複数の全天球動画データ240を記憶する。記憶部218は、図2に示した外部ストレージ134や他のストレージなどの記憶領域の一部として与えられる。全天球動画データ240は、図3に示すように、全天球カメラ110で撮像された全天球フレームデータ242と、撮影中の全天球カメラ110の基準方向に対する傾き角の時系列データである天頂補正データ244と、撮影中の全天球カメラ110の基準方向周りの回転角の時系列データである回転補正データ246とを含み構成される。
全天球フレームデータ242は、撮影を開始してから終了するまでのそれぞれ全天球動画を構成する複数のフレームを含み、全天球動画データ240の本体となる動画データである。全天球フレームデータ242においては、各フレームには、その基準時刻を示すタイムスタンプが関連付けられる。
以下、図4を参照しながら、全天球画像の生成および生成される全天球画像について説明する。図4(A)は、全天球画像生成における各画像のデータ構造および画像のデータフローを説明する。まず、撮像素子130各々で直接撮像される画像は、概ね全天球のうちの半球を視野に収めた画像である。結像光学系に入射した光は、所定の射影方式に従って撮像素子130の受光領域に結像される。ここで撮像される画像は、受光領域が平面エリアを成す2次元の撮像素子で撮像されたものであり、平面座標系で表現された画像データとなる。また、典型的には、得られる画像は、図4(A)において「魚眼画像A」および「魚眼画像B」で示されるように、各撮影範囲が投影されたイメージサークル全体を含む魚眼画像として構成される。
この複数の撮像素子130で撮像された各フレームの複数の魚眼画像が、歪み補正および合成処理されて、各フレームに対応する1つの全天球画像が構成される。合成処理では、平面画像として構成される各魚眼画像から、まず、相補的な各半球部分を含む各全天球画像が生成される。そして、各半球部分を含む2つの全天球画像が、重複領域のマッチングに基づいて位置合わせされ、画像合成され、全天球全体を含む全天球画像が生成される。
図4(B)は、本実施形態で用いられる全天球画像の画像データのデータ構造を平面で表して説明する図である。図4(C)は、全天球画像の画像データのデータ構造を球面で表して説明する図である。図4(B)に示すように、全天球画像の画像データは、所定の軸に対してなされる垂直角度φと、所定の軸周りの回転角に対応する水平角度θとを座標とした画素値の配列として表現される。垂直角度φは、0度~180度(あるいは-90度~+90度)の範囲となり、水平角度θは、0度~360度(あるいは-180度~+180度)の範囲となる。
全天球フォーマットの各座標値(θ,φ)は、図4(C)に示すように、撮影地点を中心とした全方位を表す球面上の各点と対応付けられており、全方位が全天球画像上に対応付けられる。魚眼レンズで撮影された魚眼画像の平面座標と、全天球画像の球面上の座標とは、所定の変換テーブルにて対応付けされる。変換テーブルは、それぞれのレンズ光学系の設計データ等に基づいて、所定の投影モデルに従い製造元等で予め作成されたデータであり、魚眼画像を全天球画像へ変換するデータである。
ここで、全天球フレームデータ242が全天球動画を構成するものとして説明しているが、必ずしも図4に示すような合成後の全天球画像のフォーマットで各フレームが記録されていることを要するものではない。全天球フレームデータ242は、再生時に全天球動画が構成可能であれば、いかなる形態で記録されていてもよい。
例えば、再生時にフレームごとに魚眼画像から歪み補正および合成を行って全天球画像を生成することを前提として、撮像素子130A,130Bで直接撮像される2つの魚眼画像の動画データ(図4(A)に示す魚眼画像Aおよび魚眼画像Bそれぞれに対応する動画データ)、または、2つの魚眼画像を接合した接合画像の動画データ(魚眼画像Aおよび魚眼画像Bを並べて接合して1つの画像とした場合の動画データ)が記録されていてもよい。なお、以下、説明の便宜上、全天球フレームデータ242は、歪み補正および合成処理後の全天球画像のフォーマットで各フレームの画像を保持するものとして説明する。
また、「動画」と参照するが、動画が再生可能であれば、いかなる形態で記録されてもよい。例えば、H.264/MPEG-4 AVC(Advanced Video Coding)、H.265/HEVC(High Efficiency Video Coding)などの所定のコーデックで、複数のフレームを圧縮した動画データとして記録されていてもよい。また、Motion JPEG(Joint Photographic Experts Group)は、連続した静止画として動画を表現する形式であるが、このように、複数のフレームの静止画像の連続した系列として動画データが記録されていてもよい。あるいは、複数の静止画ファイルの集合として、連続画像ないし動画が構成されてもよい。
ここで、再び図3を参照する。天頂補正データ244は、全天球動画の各フレームに関連付けて記録される、撮影を開始してから終了するまでの全天球カメラ110の基準方向に対する傾き角の時系列データである。ここで、基準方向は、典型的には、重力加速度が作用する重力方向である。重力方向に対する傾き角は、姿勢角センサ136に含まれる加速度センサで計測された信号に基づいて生成される。傾き角は、典型的には、加速度の次元の値からなるベクトルまたは回転角の値として構成される。加速度センサは、重力と慣性力とを区別しないので、好ましくは、姿勢角センサ136に含まれる角速度センサで計測された信号に基づいて、加速度センサから得られた傾き角が補正されてもよい。ここで、傾き角は、全天球カメラ110が基準方向に対して傾いている程度を表すものであるが、その傾きキャンセルするように補正をかけるための天頂補正の補正値して用いることができる。天頂補正データ244は、天頂補正を行うために用いられる情報の時系列データであるが、必ずしも傾き角の時系列データであることを要さない。天頂補正データ244が、姿勢角センサ136に含まれる加速度センサで計測された信号の時系列データのような、より生のデータであることを妨げるものではない。
回転補正データ246は、撮影を開始してから終了するまでの全天球カメラ110の基準方向周りの回転角の時系列データである。ここで、基準方向周りの回転角は、姿勢角センサ136に含まれる角速度センサで計測される、3軸周りで生じた角速度の信号の時系列データに基づいて計算することができる。あるいは、姿勢角センサ136に含まれる地磁気センサにより方位角として計測される。回転角は、典型的には、角度を表すスカラー値として構成される。ここで、回転角は、全天球カメラ110が基準方向周りに所定の基準に対して回転している程度を表すものであるが、その回転をキャンセルするように補正をかけるための回転補正の補正値として用いることができる。回転補正データ246は、回転補正を行うために用いられる情報の時系列であり、必ずしも回転角の時系列データであることを要さず、姿勢角センサ136に含まれる角速度センサで計測された角速度の信号の時系列データのようなより生のデータであることを妨げるものではない。
天頂・回転補正部220は、記憶部218に記憶された全天球動画データ240を読み出し、全天球フレームデータ242の各フレームに対し、天頂補正および回転補正を施し、補正された全天球動画データを出力する。
ここで、図5および図6を参照しながら、天頂補正および回転補正について説明する。図5は、本実施形態において行われる全天球画像の天頂補正および回転補正を説明する図である。図6は、本実施形態において行われる全天球画像の天頂補正および回転補正によって得られる全天球画像を説明する図である。図6(A)は、天頂補正前の動画のフレームを示し、図6(B)は、天頂補正後の動画のフレームを示す。
上述したように、全天球画像フォーマットの画像データは、所定の軸z0に対してなす垂直角度φと、上記所定の軸z0周りの回転角に対応する水平角度θとを座標とした画素値の配列として表現される。ここで、所定の軸は、なんら補正がなされない場合は、全天球カメラ110を基準として定義される軸となる。例えば、図1に示す全天球カメラの撮像体12側を頭部としてその反対側を底部として、底部から頭部へ筐体の中心を通る中心軸を、水平角度θおよび垂直角度φを定義する所定の軸z0として全天球画像を定義することができる。また、例えば2つの結像光学系20A,20Bのうちの一方の光学素子の光軸方向が水平角度θで中心に位置するように、全天球画像の水平角度θを定義することができる。
天頂補正とは、図5の左図のように実際には基準方向(重力方向)に対して中心軸z0が傾いている状態で撮像された全天球画像(図6(A))を、図5の右図のようにあたかも中心軸z0が基準方向Zに一致した状態で撮影されたかのような全天球画像(図6(B))に補正する処理(Roll,Pitch方向の補正)をいう。これに対して、回転補正とは、天頂補正により基準方向に中心軸z0が一致するように補正された全天球画像において、さらに、基準方向Z周りの変動(図6の水平角度θ方向の変動)を低減する補正(Yaw方向の補正)をいう。
ここで、再び図3を参照する。天頂・回転補正部220は、天頂補正データ244に基づいて、全天球フレームデータ242の複数のフレーム各々に対し、画像の天頂方向が基準方向に一致するように全天球画像の天頂補正を施す。天頂・回転補正部220は、同時に、複数のフレームに対し、回転補正データ246に基づいて、基準方向周りの変動が低減されるように画像の回転を施す。
この際に、天頂・回転補正部220は、天頂補正データ244および回転補正データ246に直接基づいて補正しない。より精度の高い天頂補正および回転補正を行うために、天頂補正データ再計算部222および回転補正データ再計算部224により、フレームの基準時刻に合わせて補正値(傾き角および回転角)を再計算した上で、天頂補正および回転補正を行う。
天頂補正データ再計算部222は、各フレームのタイムスタンプを取得し、各フレームに対する基準時刻での天頂補正の補正値を、天頂補正データ244のうちの基準時刻近傍の複数の時点の傾き角を用いて補間して計算する。ここで、複数の時点の値を用いた補間は、詳細を後述するように、クォータニオンによる線形補間を含む。これに対して、回転補正データ再計算部224は、各フレームのタイムスタンプを取得し、各フレームに対する基準時刻での回転補正の補正値を、回転補正データ246のうちの基準時刻近傍の複数の時点の回転角の値を用いて補間して計算する。ここで、複数の時点の値を用いた補間は、線形補間である。
天頂補正データ再計算部222および回転補正データ再計算部224は、本実施形態において、それぞれ、傾き補正として天頂補正および回転補正を対象として、基準時刻近傍の複数の時点の傾きを用いて補間計算する、本実施形態における計算手段を構成する。天頂補正データ再計算部222および回転補正データ再計算部224は、また、各フレームに関連付けられた基準時刻を取得する時刻取得手段および基準時刻近傍の複数の時点の傾きを取得する傾き取得手段を構成する。
そして、天頂・回転補正部220は、動画の各フレームの画像に対し、各フレームに対する基準時刻での補正値に基づいて傾き補正をかける、本実施形態における補正手段を構成する。なお、説明する実施形態では、動画の各フレームの基準時刻は、フレーム単位で求められるものである。天頂・回転補正部220は、各フレームの画像に対し、フレーム単位で、天頂補正データ再計算部222および回転補正データ再計算部224により計算された基準時刻に対する補正値に基づき傾き補正をかける。
なお、全天球フレームデータ242中の各フレームの画像が合成後の全天球フォーマットの画像である場合は、天頂・回転補正部220は、各フレームの全天球画像の回転座標変換を行う。一方で、全天球フレームデータ242中の各フレームが、合成前の複数の魚眼画像である場合は、天頂・回転補正部220は、フレーム各々に対し天頂補正および回転補正を施すとともに、複数の魚眼画像から全天球画像への変換を行う。その場合は、上述した、魚眼画像の平面座標と全天球画像の球面上の座標とを対応付ける変換テーブルに対し、天頂補正および回転補正を反映させて、新たな変換テーブルが生成される。そして、生成された変換テーブルに基づいて全天球画像が生成され、これにより、魚眼画像から、天頂補正および回転補正が反映された全天球画像が生成される。
図3に示すように、説明する実施形態による全天球カメラ110の機能ブロック210は、さらに、画像出力部232を含み構成される。これに対して、情報端末150の機能ブロック250は、表示部254を含み構成される。
情報端末150は、ユーザによる各種指示を受領する。全天球カメラ110は、情報端末150から全天球動画の補正要求(例えば再生に際して補正後の全天球動画を求める要求)を受信すると、該要求に応答して、指定された全天球動画データ240の天頂補正および回転補正、並びに補正後の画像データの出力を開始する。画像出力部232は、天頂・回転補正部220により天頂補正および回転補正が施された複数のフレームに基づく全天球動画の画像データを要求元の情報端末150に出力する。なお、この際は、画像データは、補正された複数のフレーム各々の全天球画像に基づき、所定の動画圧縮形式でエンコードし、最終的な動画データとして出力されてもよいし、静止画の系列として出力されてもよい。
情報端末150は、全天球カメラ110と通信し、全天球画像を閲覧再生するためのアプリケーションがインストールされたスマートフォンやタブレットコンピュータ、パーソナルコンピュータなどの端末装置である。情報端末150は、アプリケーションを介して操作者から各種指示を受け付けて、全天球カメラ110に対し各種要求を発行する。情報端末150は、操作者からの指定の全天球動画の補正指示(例えば補正をしながらの動画再生の指示)を受け付けたことに応答して、全天球カメラ110に対し、所定の全天球動画の補正後の動画データを求める要求を発行する。情報端末150の表示部254は、全天球カメラ110から出力されてくる全天球動画の画像データに基づいて、情報端末150が備えるディスプレイ162などの表示装置上に全天球動画を表示する。
なお、情報端末150側で、補正後の画像データに基づいてどのような画像が表示されるのかは任意である。例えば、全天球画像をそのまま表示装置上に表示してもよいし、全天球画像を球体オブジェクトに張り付けて、所定の位置から所定の視野角のカメラで球体オブジェクトを観察した場合の画像をフレームとして動画表示することもできる。
なお、本実施形態では、情報端末150ではなく、全天球カメラ110側のリソースを用いて天頂補正および回転補正の実体的な処理を行い、情報端末150には補正結果を出力して表示させる構成を採用する。この構成により、情報端末150が備える処理性能にかかわらず、天頂補正および回転補正を施しながらの動画再生を安定に行うことが可能となる。しかしながら、他の実施形態では、これらの補正に関わる処理の少なくとも一部が、情報端末150側にあることを妨げるものではない。また、情報処理装置として、全天球カメラ110でははく、情報端末150が実装する機能として、これらの補正に関わる処理(フレームデータ、タイムスタンプおよび傾きデータを記録する部分を除く)の全部が、情報端末150側にあることを妨げるものではない。
なお、説明する実施形態では、出力の態様として、全天球動画の画像データを情報端末150へ送信するものとしているが、これに限定されるものではない。全天球カメラ110が表示装置を備える場合は、その表示装置上で表示する態様とすることもできる。あるいは、全天球動画の画像データを別のファイルとして保存する態様とすることもできる。
以下、図7~図13を参照しながら、本実施形態における補正データの再計算方法について、より詳細に説明する。図7は、本実施形態による全天球カメラ110が実行する撮像処理を示すフローチャートであり、まず、図7を参照しながら、撮影時の構成について説明する。
図7に示す処理は、全天球カメラ110が、動画の撮影要求を受け付けたことに応答して、ステップS100から開始される。ステップS101では、全天球カメラ110は、動画撮影を開始し、ステップS102~ステップS105の処理およびステップS106~ステップS108の処理が並列に行われる。
ステップS102~ステップS105の処理は、動画の各フレームを撮像するとともにタイムスタンプ付きでフレームデータを記録する処理である。
ステップS102では、全天球カメラ110は、全天球動画撮像部212により、各フレームの画像を撮像する。全天球カメラ110は、タイムスタンプ記録部214により、ステップS103で、露光中心タイミングを計算し、ステップS104で、露光中心タイミングを示すタイムスタンプをフレームに関連付けて記録する。
図8は、本実施形態による全天球カメラ110における露光シーケンス300および露光中心タイミングの求め方を説明する図である。図8に示すように、動画のフレームは、所定の間隔PFで撮像される。動画の各フレームは、複数の走査線により構成されており、CMOSセンサを代表するイメージセンサでは、ローリングシャッター歪みが存在している。これは、画像の読み出しタイミングが走査線ごとにわずかに違うことに起因している。ここで、フレームxの最初の走査線の露光終了タイミングをSOF(Start of Frame)とし、最初の走査線と最後の走査線との時間差をローリングシャッター歪み量PRとし、露光時間をPEとする。このとき、フレームxの露光中心タイミングT(x)は、下記式(1)で計算することができる。
SOFではなく、上記式で算出される露光中心タイミングT(x)を基準時刻としてタイムスタンプで記録することにより、フレームに対するより正確な基準時刻を定義することができる。
ここで、再び図7に戻る。ステップS105では、全天球カメラ110は、撮影が終了したか否かを判定し、撮影が終了するまで、所定のフレーム間隔PFあけて、ステップS102へループさせて、次のフレームの撮像を行う。
一方、ステップS106~ステップS108の処理は、ステップS102~ステップS105で示す動画の各フレームを撮像する処理と並列に行われる、傾きの時系列を記録する処理を示す。
全天球カメラ110は、ステップS106で、姿勢角センサ136により傾きを検出し、ステップS107で、傾き記録部216により、タイムスタンプとともにその時点の傾きを記録する。なお、ここで、姿勢角センサ136により検出され、傾き記録部216により記録される傾きとは、基準方向に対する傾き角や基準方向周りの回転角である。ステップS108では、全天球カメラ110は、撮影が終了したか否かを判定し、撮影が終了するまで、ステップS106へループさせて、次の時点の傾きの取得および記録を行う。
図9は、本実施形態による全天球カメラにおける傾き情報の取得タイミングを説明する図である。各フレームに対する傾きは、姿勢角センサ136の出力から計算されるが、姿勢角センサ136のサンプリングから任意のタイミングでタイムスタンプとともに保存することができる。例えば、図9の320に示すように、姿勢角センサ136のサンプリング周期PS毎に傾きを取得してもよい。あるいは、図9の310に示すように、姿勢角センサ136のサンプリング周期PSで取得されたデータに基づいて、さらに、略フレーム周期PF毎の傾きとして取得してもよい。
なお、図7においては、説明の便宜上、傾きを記録する処理が一つのループでまとめて描かれているが、傾き角および回転角が、それぞれのサンプリング周期や取得周期で、それぞれ別の時系列データとして記録されることを妨げない。また、説明の便宜上、動画の各フレームを撮像する処理と並列して、基準方向に対する傾き角や基準方向周りの回転角が計算されて、保存されるものとして説明するが、これに限定されない。他の実施形態では、動画の各フレームを撮像する処理と並列して、姿勢角センサ136の生のセンサ信号を記録しておき、撮影終了後の任意のタイミングで、各時点の傾き(基準方向に対する傾き角や基準方向周りの回転角)を計算し、傾きの時系列データとして保存することとしてもよい。
ここで、再び図7に戻る。ステップS105およびステップS108で撮影が終了すると判定された場合は、ステップS109へ処理が進められ、本撮像処理は終了する。
図10(A)は、本実施形態による全天球カメラにおいて記録されるフレーム毎のタイムスタンプを示し、図10(B)および(C)は、記録される傾きのデータ構造を例示する図である。
図10(A)に示すように、フレームのタイムスタンプデータは動画のフレーム(行番号がフレーム番号に対応する)に対してそれぞれ保存される。図10(B)は、略フレーム間隔で記録される傾きの時系列データを例示し、図10(C)サンプリング周期毎に記録される傾きの時系列データを例示する。図10(B)や(C)に示すように、補正データでは、タイムスタンプと、対応した傾きの補正値が保存される。なお、図10(B)および図10(C)は、基準方向に対する傾き角をX軸、Y軸およびZ軸の加速度の次元の値からなるベクトルで表現した例を示す。
図11は、本実施形態による全天球カメラ110が実行する補正データの再計算処理を示すフローチャートである。図11を参照しながら、撮像後の再計算処理について説明する。なお、本再計算処理の前に、任意のタイミングで、姿勢角センサ136の信号の生のデータに基づいて、基準方向に対する傾き角や基準方向周りの回転角が計算されて、時系列データとして準備されているものとする。また、図11に示す処理は、天頂補正データ再計算部222および回転補正データ再計算部224が行う、傾き角および回転角の両方に共通したフローとして説明する。天頂補正データ244および回転補正データ246を総称して、補正データというものとする。
図11に示す処理は、全天球カメラ110が、例えば所定の全天球動画の補正後の動画データを求める要求を受け付けたことに応答して、ステップS200から開始される。全天球カメラ110は、ステップS201では、所定の全天球動画データの最初のフレームを処理対象に設定し、ステップS202で、処理対象のフレームのタイムスタンプを取得する。
ステップS203では、全天球カメラ110は、処理対象のフレームのタイムスタンプ近傍(前後)にある補正データの補正値を検索する。
傾き角の再計算の場合、ステップS203では、処理対象フレームxのタイムスタンプをT(x)とし、所定時点mの傾き角をTilt(m)とし、そのタイムスタンプをTilt.T(m)として、下記式(2)を満たす、2つの時点の傾き角Tilt(n),Tilt(n-1)を検索する:
回転角の再計算の場合、ステップS203では、処理対象フレームxのタイムスタンプをT(x)とし、所定時点mの回転角をAngle(m)、そのタイムスタンプをAngle.T(m)として、下記式(3)を満たす、2つの時点の回転角Angle(n),Angle(n-1)を検索する。
ステップS204では、全天球カメラ110は、検索の結果、処理対象のフレームxが、補正データ中の最初の補正値の前のものであるか否かを判定する。ステップS204で、処理対象のフレームが、補正データ中の最初の補正値の前のものであると判定された場合(YES)は、ステップS205へ処理が進められる。ステップS205では、全天球カメラ110は、特に限定されるものではないが、最初の補正値に基づいて処理対象のフレームに対する再計算後の補正値を決定する。
傾き角の再計算の場合であって、T(x)<Tilt.T(0)の場合、ステップS205に分岐される。ステップS205では、処理対象フレームxの再計算後の補正値Zenith(x)は、補正データ中の最初の補正値Tilt(0)とされ、そのタイムスタンプZenith.T(x)は、処理対象フレームのタイムスタンプT(x)とされる。回転角の再計算の場合であって、T(x)<Angle.T(0)の場合、ステップS205に分岐される。ステップS205では、処理対象フレームxの再計算後の回転角YawAngle(x)は、補正データ中の最初の補正値Angle(0)とされ、そのタイムスタンプYawAngle.T(x)は、処理対象フレームのタイムスタンプT(x)とされる。
一方、ステップS204で、処理対象のフレームが、補正データ中の最初の値の前のものではないと判定された場合(NO)は、ステップS206へ処理が進められる。ステップS206では、全天球カメラ110は、さらに、検索の結果、処理対象のフレームが、補正データ中の最後の値の後のものであるか否かを判定する。ステップS206で、処理対象のフレームが、補正データ中の最後の値の後のものであると判定された場合(YES)は、ステップS207へ処理が進められる。ステップS207では、全天球カメラ110は、特に限定されるものではないが、前のフレームの再計算後の補正値に基づいて処理対象のフレームに対する再計算後の補正値を決定する。
傾き角の再計算の場合であって、T(x)>Tilt.T(nMax)(ここで、nMaxは傾き角の時系列の最後の番号を意味する。)の場合、ステップS207に分岐される。ステップS207では、処理対象フレームxの再計算後の補正値Zenith(x)は、前のフレームの再計算後の補正値Zenith(x-1)とされ、そのタイムスタンプZenith.T(x)は、処理対象フレームのタイムスタンプT(x)とされる。一方、回転角の再計算の場合であって、T(x)>Angle.T(nMax)(ここで、nMaxは回転角の時系列の最後の番号を意味する。)の場合、ステップS207に分岐される。ステップS207では、処理対象フレームxの再計算後の回転角YawAngle(x)は、前のフレームの再計算後の補正値YawAngle(n-1)とされ、そのタイムスタンプYawAngle.T(x)は、処理対象フレームのタイムスタンプT(x)とされる。
一方、ステップS206で、処理対象のフレームが、補正データ中の最後の値の後のものではないと判定された場合(NO)は、ステップS208へ処理が進められる。ステップS208では、全天球カメラ110は、検索された処理対象フレームのタイムスタンプ前後にある複数の補正値を用いて補間し、処理対象のフレームに対する再計算後の補正値を計算する。
図12および図13は、本実施形態による全天球カメラ110による補正値の再計算の仕方を説明する図である。図12は、略フレーム周期で補正データが記録される場合を例示し、図13は、サンプリング周期で補正データが記録される場合を例示する。図12に示すように、略フレーム周期で補正データが記録される場合、フレームxに対する補正値316は、時系列データ310において、フレームxのタイムスタンプの前後(近傍)にタイムスタンプ312a,312bがくる2つの補正値(例えばフレームxに対応する補正値314aと、フレームx+1に対応する314b)を補間計算して求める。サンプリング周期で補正データが記録される場合は、図13に示すように、フレームxに対する補正値326は、時系列データ320において、フレームxのタイムスタンプの前後(近傍)にタイムスタンプ322a,322bがくる2つの補正値324a,324bを補間計算して求める。
ここで、補間計算のための基準時刻の近傍の複数の時点は、図12および図13での例では、基準時刻を表すフレームxのタイムスタンプの直前の時点および直後の時点を含むが、これに限定されるものではない。好ましくは、フレームxのタイムスタンプの直前および直後の各1点を含むが、フレームxのタイムスタンプの直前および直後でそれぞれ複数点を含んでいてもよい。特に、終端または開始端のフレームについては、直前または直後の一方が存在しない場合もあり得る。
傾き角の再計算の場合であって、上記式(2)を満たす傾き角Tilt(n),Tilt(n-1)が見つかった場合に、ステップS208へ処理が進められる。ステップS208では、計算後の補正値は、傾き角を表すベクトル同士の線形補間をクォータニオンすることで計算する。ここで、線形補間のためのクォータニオンRot(x)の回転軸RotA(x)および回転角Rotθ(x)は、下記式(4)および(5)で計算される。
なお、RotA(x)は、1で規格化される。Tilt(n-1)は1で規格化されているものとする。そして、クォータニオンRot(x)を回転軸RotA(x)および回転角Rotθ(x)から生成し、Tilt(n-1)を回し、回転後のベクトルを計算し、適宜規格化を行って、得られたベクトルをZenith(x)とする。なお、同じベクトル同士の場合は、|RotA(x)|=0となるので、例えば、Tilt(n-1)をそのままZenith(x)とすればよい。タイムスタンプZenith.T(x)は、処理対象フレームのタイムスタンプT(x)である。
一方、回転角の再計算の場合、上記式(3)を満たす回転角Angle(n),Angle(n-1)が見つかった場合に、ステップS208へ処理が進められる。ステップS208では、計算後の補正値は、スカラー同士の線形補間を計算することができる。再計算後の回転角YawAngle(x)は、下記式(6)で計算される。
なお、最初のフレームの再計算後の回転角YawAngle(0)を0とするために、全体でYawAngle’(x)=YawAngle(x)-YawAngle(0)とし、YawAngle’(x)を最終的な回転角とすることができる。また、全天球カメラ110が上下反転状態で撮影されたと判定される場合には、YawAngle’’(x)=YawAngle(x)-YawAngle(0)+180°とし、YawAngle’’(x)を最終的な回転角とすることができる。
再び図11に戻る。ステップ205、ステップS207およびステップS208で、当該処理対象のフレームに対し再計算後の補正値が求められると、ステップS209へ処理が進められる。ステップS209では、全天球カメラ110は、最終フレームに到達したか否かを判定する。ステップS209で、最終フレームに到達していないと判定され場合(NO)、ステップS210へ分岐されて、次のフレームに処理対象を移した後、ステップS202へループさせる。一方、ステップS209で、最終フレームに到達したと判定され場合(YES)、ステップS211へ分岐させて、本再計算処理を終了させる。その後、適宜、天頂補正および回転補正が行われることになる。
なお、上述した実施形態では、動画の各フレームの基準時刻は、フレーム全体の露光中心タイミングとして、フレーム単位で求められるものであり、動画の各フレームの画像に対し、フレーム単位で傾き補正がかけられるものであった。しかしながら、他の実施形態では、動画の各フレームの基準時刻を、より精細に、各フレームの画像を構成する複数の走査線各々に対して求めることもできる。そして、この走査線毎に求められた基準時刻毎に補正値を再計算し、動画の各フレームを構成するライン各々に対し、走査線単位、または、複数の走査線単位で、各基準時刻での補正値に基づき傾き補正をかけることができる。
図14は、他の実施形態による全天球カメラによる走査線毎の補正データの求め方を説明する図である。図8を参照して説明した実施形態では、露光中心タイミングは、フレーム全体に対して計算されるものであった。フレーム全体の露光中心タイミングは、中央の走査線の露光中心タイミングに概ね一致する。これに対し、図14に示す他の実施形態では、走査線毎に露光中心タイミングを計算する。例えば、最初の走査線をNStart、最後の走査線をNEndとして、NStartからNEndまで順次各走査線について、ローリングシャッター歪み量PR(あるいは走査線毎のシフト量)に基づいて、各走査線毎の露光中心タイミングを計算することができる。例えば、最初および最後の走査線NStart,NEndに対する露光中心タイミングは、フレーム全体の露光中心タイミングT(x)から、PR/2前後したタイミング(T(x)-PR,T(x)+PR)として計算することができる。そして、各走査線の露光中心タイミングに対し、それぞれ補正値を計算することができる。その際には、各走査線毎の露光中心タイミングに対し、上述した方法によって補正値を計算してもよいし、あるいは、最初の走査線NStartおよび最後の走査線をについて計算された補正値を線形補間することによって、中間の走査線の補正値を求めることもできる。また、ローリングシャッターのセンサー方向と対応したモーションセンサーの出力から、振れ補正データの線形補間の傾きを求めてもよい。
以下、図15を参照しながら、図14に示すように走査線毎に補正値が求められた場合の補正方法について説明する。図15は、本実施形態における全天球画像の変換テーブルおよび走査線毎の補正値に応じた補正方法を説明する図である。図15(A)は、変換前後の画像座標値のマトリクスを示した変換テーブルを説明する図である。また、図15(B)は、変換後画像の座標値および変換前画像の座標値の関係を説明する図である。
上述した変換テーブルは、図15(A)に示すように、変換後画像の座標値(全天球画像の球面上の座標)である(θ,φ)(pix:ピクセル)と、それに対応する変換前画像の座標値(魚眼レンズで撮影された部分(魚眼)画像の平面座標)である(x,y)(pix)とのデータセットを、すべての変換後画像の座標値に対して有するものである。ここで、説明する実施形態では、変換テーブルとして、テーブル状のデータ構造を示しているが、必ずしもテーブル状のデータ構造でなくてもかまわない。つまり、変換データであればよい。
図15(A)に示した変換テーブルに従って、撮像された部分画像(変換前画像)から変換後画像を生成することができる。具体的には、図15(B)に示すように、変換前と変換後の変換テーブル(図15(A))の対応関係から、変換後画像の各画素を、座標値(θ,φ)(pix)に対応する変換前画像の座標値(x,y)(pix)の画素値を参照することによって、変換後の全天球画像を生成することができる。
この際に、変換テーブルを、上記天頂補正および回転補正を反映させるように作り直し、修正後の変換テーブルを用いて、魚眼画像から全天球画像を生成することによって、上記天頂補正および回転補正が反映された全天球画像を得ることができる。
より具体的には、画像全体にある補正値で天頂補正をかける場合は、補正後の変換テーブルの全天球画像の各座標値(θ’,φ’)に対し、初期の変換テーブルにおいてそこから補正値に応じて回転させた座標値(θ+Δθ,φ+Δφ)に関連づけられている魚眼画像の画素の座標値(θ,φ)を対応付け直すことによって、補正後の変換テーブルが生成される。
一方、走査線毎に異なる補正値が与えられる場合は、初期の変換テーブルにおいて、全天球画像の各座標値(θ,φ)に対し初期の魚眼画像の画素の座標値(x,y)が関連付けられているので、その関連付けられた画素が属している走査線yに応じた補正値(y)を求める。そして、補正後の変換テーブルの全天球画像の各座標値(θ’,φ’)に対し、そこから走査線に応じた補正値(y)に基づいて回転させた座標値(θ+Δθ(y),φ+Δφ(y))に初期の変換テーブルにおいて関連づけられている魚眼画像の画素の座標を対応付け直す。これにより、走査線毎に異なる補正値が与えられても、矛盾がない一枚の全天球画像が得られることになる。
図14および図15に示すように、1または複数の走査線単位で、個別に補正値を再計算し、適用することによって、撮像素子の中央に対応する部分のみならず、撮像素子の端部に近い部分に対しても、適切な補正をかけることが可能となる。
上述までの説明では、基準方向周りの回転角は、所定の方法で既に求められることを前提として説明した。以下、基準方向周りの回転角を、角速度センサの出力を用いた計算方法について補足する。
まず、上述した天頂補正データ244および角速度の時系列データが与えられているとする。天頂補正データ244のうちの先頭フレームの傾き角ベクトルTilt(0)に基づいて、先頭フレーム時点での全天球カメラ110の正面方向V(0)を計算する。まず、先頭フレームの傾き角ベクトルTilt(0)と、重力方向ベクトルG=(0,0,1)とのクォータニオンQ(0)が生成される。なお、全天球カメラ110が上下反転状態で撮影されたと判断される場合は、重力方向ベクトルG=(0,0,-1)として計算する。クォータニオンQ(0)の回転軸A(0)および回転角θ(0)は、下記式(7)および(8)で表される。そして、クォータニオンQ(0)は、回転軸A(0)周りの回転角θ(0)の回転を表す。
なお、重力方向ベクトルGと傾き角ベクトルTilt(0)とが同一である場合、A(0)=(0,1,0)および回転角θ(0)=0でクォータニオンQ(0)を生成する。そして、得られたクォータニオンQ(0)でグローバル正面ベクトル(0,1,0)を回転させて、全天球カメラ110の正面方向ベクトルの初期値V(0)を求める。そして、角速度の時系列データに基づいて、それぞれフレームに対応する複数の時点にわたる全天球カメラ110の正面方向ベクトルV(n)の時系列を計算する。各時点の正面方向ベクトルV(n)は、角速度データにおけるサンプリング間の時間差を求め、3軸周りの角速度Gyro(n)に応じた無限小回転をサンプリング毎に積算することにより、計算することができる。そして、先頭フレームの時点の正面方向ベクトルV(0)を起点として正面方向ベクトルV(n)の時系列が計算される。続いて、各フレームに対応するカメラ正面方向ベクトルV(n)を探し、天頂補正データ244に基づいて、回転補正のための補正角度を計算する。角速度の時系列データは、典型的にはフレームレートと異なるサンプリングレートを有し、ここでは、天頂補正データ244の各フレームとタイムスタンプと近い正面方向ベクトルVが探索される。
ここで、m番目のフレームに対する正面方向ベクトルがV(n)であったとする。まず、m番目のフレームの傾き角ベクトルTilt(m)から求められるクォータニオンQ(m)を計算する。このクォータニオンQ(m)の回転軸A(m)および回転角θ(m)は、上記式(7)および(8)と同様に、下記式(9)および(10)で表される。
そして、クォータニオンQ(m)でm番目のフレームに対する正面方向ベクトルがV(n)を回転させて、V’(n)を求める。そして、得られたベクトルV’(n)に基づいて、グローバル座標のXY平面内で、補正角度PreAngle(n)を下記式(11)により求める。
ここで、上記式(11)中の関数Math.atan2(y座標,z座標)は、逆正接を-180度~180度(-π~π)の範囲で返す関数である。
そして、ハイパスフィルタの前処理として、求められた補正角度を連続性が維持されるように調整し、調整後の補正角AngleIn(n)を計算する。
説明する実施形態において、補正角度PreAngle(n)は、逆正接により、-180度~+180度の定義域の範囲内の値として求められる。このため、補正角度PreAngle(n)は、時系列としてみたときに、+180度近傍から-180度近傍へ(あるいは反対方向に)飛んでしまう場合がある。下記疑似コードで表すように、補正角度PreAngle(n)の前後の変化量から補正角度が定義域をまたいで変化したことが検知され、調整値が加算または減算される。なお、下記疑似コード中、thresholdは、補正角度が定義域をまたいで変化したことを検知するための変化量に対する閾値である。また、最後のコードのPreAngle(0)は、上記式(5)で求められる補正角度の初期値であり、これを基準に補正が行われることを示している。
そして、注目フレームの時点の調整された補正角度AngleIn(n)に対し、高周波成分を通過させるハイパスフィルタ処理を施し、フィルタ処理後の補正角度AngleOut(n)を求める。ハイパスフィルタ通過後の補正角度AngleOut(n)は、下記式にて計算することができる。なお、下記式中Pは、サンプリング周期であり、Hcは、カットオフ周波数である。
そして、得られたAngleOut(n)が、上述した再計算前の回転補正の補正値(Angle(n))となり、これに基づいて、再計算が行われる。
以上説明したように、上述までの実施形態によれば、撮像される動画において、各フレームと、傾き補正の補正データとの同期の精度を向上することが可能な、撮像装置、情報処理装置、補正値計算方法およびプログラムを提供することが可能となる。
上述した実施形態においては、各フレームの基準時刻に対する補正値が、前後の補正値から補間計算により求められる。このため、フレームと、補正値との同期が精度高く行われる。そして、その再計算された補正データで補正処理を行うことで、傾き補正の性能を高めることが可能となる。
なお、本実施形態のよる全天球カメラ110は、複数の(より具体的には2つ)撮像素子22A,22Bを備えるものであり、この複数の撮像素子22A,22Bは、互いに同期して各魚眼画像を撮像する。一方、上述したフレームの基準時刻(例えば露光タイミング)は、必ずしも、各撮像素子22に求める必要はない。好ましい実施形態では、一方の撮像素子22Aについて求めたフレームの基準時刻を、他方の撮像素子22Bで撮像したフレームに対しても適用することができ、この基準時刻に基づいて天頂補正データ244および回転補正データ246が再計算することができる。したがって、本実施形態によれば、複数の撮像素子22のうち1つに対して同期を取ることで、自動的にもう1つの撮像素子に対しても同期を取ることが可能になり、同期を取る処理を片側だけで処理することで処理の簡略化、負荷の軽減および高速化を図ることができる。したがって、本実施形態による処理は、複数の撮像素子を備える撮像装置に対して好適に適用することができるといえる。
なお、上述した実施形態では、180度より大きな画角を有するレンズ光学系で撮像された2つの部分画像を重ね合わせて合成するものとしたが、これに限定されない。他の実施形態では、1または複数のレンズ光学系により撮像された3以上の部分画像の重ね合わせ合成に適用してもよい。また、上述した実施形態では、魚眼レンズを用いた撮像システムを一例に説明してきたが、超広角レンズを用いた全天球動画撮像システムに適用してもよい。さらに、傾き補正としては、全天球画像に対する天頂補正および回転補正に限定されるものではなく、他の画像の傾き補正一般に拡張することも企図される。
また、上記機能部は、アセンブラ、C、C++、C#、Java(登録商標)などのレガシープログラミング言語やオブジェクト指向プログラミング言語などで記述されたコンピュータ実行可能なプログラムにより実現でき、ROM、EEPROM、EPROM、フラッシュメモリ、フレキシブルディスク、CD-ROM、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、ブルーレイディスク、SDカード、MOなど装置可読な記録媒体に格納して、あるいは電気通信回線を通じて頒布することができる。また、上記機能部の一部または全部は、例えばフィールド・プログラマブル・ゲート・アレイ(FPGA)などのプログラマブル・デバイス(PD)上に実装することができ、あるいはASIC(特定用途向集積)として実装することができ、上記機能部をPD上に実現するためにPDにダウンロードする回路構成データ(ビットストリームデータ)、回路構成データを生成するためのHDL(Hardware Description Language)、VHDL(Very High Speed Integrated Circuits Hardware Description Language)、Verilog-HDLなどにより記述されたデータとして記録媒体により配布することができる。
これまで本発明の実施形態について説明してきたが、本発明の実施形態は上述した実施形態に限定されるものではなく、他の実施形態、追加、変更、削除など、当業者が想到することができる範囲内で変更することができ、いずれの態様においても本発明の作用・効果を奏する限り、本発明の範囲に含まれるものである。