以下、本発明の実施の形態について、図面を参照して詳細に説明する。なお、本発明は以下の例に限定されるものではなく、本発明の要旨を逸脱しない範囲で、任意に変更可能であることは言うまでもない。
本発明は、例えば図1に示すような構成の撮像装置100に適用される。
図1に示す撮像装置100は、撮像レンズ101、絞り102を介して撮像光が入射される撮像素子103、この撮像素子103により得られる撮像出力信号が供給されるカメラ信号処理回路104、画像メモリ106A,106B,106C,106D群、及び、画像メモリ107A,107B,107C,107D群、上記カメラ信号処理回路104の出力信号が供給される画像メモリ105、上記画像メモリ106A,106B,106C,106D群から読み出された画像データが供給される画像解析回路108、上記画像メモリ107A,107B,107C,107D群から読み出された画像データが供給される画像解析回路109、上記撮像素子103による撮像動作を制御するタイミングジェネレータ110、このタイミングジェネレータ110に付随するレジスタ110A、これらを制御する制御回路111、この制御回路111に制御情報を与えるための操作入力部112等を備えてなる。
この撮像装置100において、撮像素子103は、レンズ101、絞り102を介して入射される撮像光を電気信号に変換する。この撮像素子103からの電気信号である撮像出力信号は、カメラ信号処理回路104により処理されて、画像メモリ105に格納される。また、上記撮像素子103からの撮像出力信号は、上記画像メモリ105とは別の画像メモリ106A,106B,106C,106D群、及び、画像メモリ107A,107B,107C,107D群にも格納できるようになっている。上記4つの画像メモリ106A〜106Dから読み出されるデータは、画像解析回路108に入力され、この画像解析回路108内で後述する適切な処理が行われる。同様に、上記4つの画像メモリ107A〜107Dから読み出されるデータは、画像解析回路109に入力され、この画像解析回路109内で後述する適切な処理が行われる。また、タイミングジェネレータ110は、撮像素子103での撮影タイミング、及び、読み出す画素の制御を行う。このタイミングジェネレータ110に付随するレジスタ110Aは、後述するブロックの位置に関する情報を保持するためのものである。また、制御回路111は、この撮像装置100全体の制御を行う。
なお、通常、撮像素子の直後には、相関2重サンプリング回路とA/Dコンバータが付いており、レンズ101、絞り102を介した入射光は、撮像素子の各受光部に到達し、受光部での光電変換によって電気信号に変換され、相関2重サンプリング回路によってノイズが除去され、A/Dコンバータによってデジタル化され、通常8ビットのデータとなる。しかしながら、このような一般的な事柄は本発明の要点に直接関係ないので、図1に示した撮像装置100では相関2重サンプリング回路とA/Dコンバータを省略して、撮像素子からは各画素のデジタルデータが直接出力されるとして説明を進めていくことにする。
この撮像装置100においては、好適には、撮像素子103として、例えばCMOSイメージセンサを使用する。CMOSイメージセンサの特徴として、画素のランダムアクセスが可能である点があげられる。例えば、MICRON社製のCMOSイメージセンサ(型番:MT9T001)は、その仕様書のWindow Controlという項目にランダムアクセスによる読み出し方が説明されており、また、読み出す領域を限定することで、そのフレームレートを上げることもできることが、記載されている。また、2箇所以上の矩形領域を指定して、その2つの領域内の画素のみを読み出すことができるイメージセンサもある。本発明においては、このランダムアクセスという特徴を利用している。CCDイメージセンサにおいても、このように一部分だけ高速に読み出すモードを設けたものも存在しているので、そのような撮像素子でも、本発明は適用できる。
そして、この実施の形態における撮像装置100では、例えば、撮像素子103は、400万(4メガ)画素とし、1画素あたりの読み出し時間を1/960マイクロ秒、すなわち、960MHzで、画素を次々と読み出すことができるものとする。従って、通常の画像を撮影(400万画素全部を使って撮影)する場合は、400万×1/960マイクロ秒で1枚、つまり、240fps(毎秒240枚)のフレームレートで、動画像として読み出すことができる。また、例えば、2箇所の200×200画素の矩形領域を読み出すには、合計で8万画素を読み出すことになるので、80000/960マイクロ秒で読み出すことができ、すなわち、12kHzで、2箇所の200×200画素の矩形領域を読み出すことができる。
図1において、撮像素子103の画素数を400万としているので、画像メモリ105は、その画素数と同じ400万ワードの領域を持っている。1画素の語長を8ビットとすると、画像メモリ105は、400万ワード×8ビットの容量である。ここでは、本発明の要点とは関係ないので、言及はしないが、もし、カラー画像であれば、1画素は通常24ビットなので、画像メモリ105は、400万ワード×24ビットの容量となるが、ここでは、黒白画像、即ち、400万ワード×8ビットとして話を進めていく。
図1において、読み出す矩形領域は、200×200画素としているので、画像メモリ106A〜106D及び画像メモリ107A〜107Dは、それぞれ、その画素数と同じ4万ワードの領域を持っている。1画素の語長は8ビットなので、それぞれ、4万ワード×8ビットの容量である。
なお、以下の説明のため、撮像素子103は、横2000画素、縦2000画素とする。また、各画素の位置は、(X,Y)で表される。ここで、Xは横方向の位置を表し、0以上2000未満である。Yは縦方向の位置を表し、0以上2000未満である。
ここで、本発明に係る撮像装置の他の構成例を図2に示す。
図2に示す撮像装置200おいて、図1に示した撮像装置100と同じ構成要素は、同一符号を付して、その説明を省略する。この撮像装置200は、上記撮像装置100における画像メモリ106A〜106D,107A〜107D群及び画像解析回路108,109に代わる画像メモリ201とDSP(Digital Signal Processor)202を備える。
画像メモリ201は、撮像素子103からの撮像出力信号が格納される。その容量は、図1に示した撮像装置100おける8個の画像メモリ106A〜106D,107A〜107Dの合計と同じであり、上記図1における8個の画像メモリ106A〜106D,107A〜107Dに格納される画像データと全く同じものが画像201に格納される。画像メモリ201から読み出されたデータは、DSP202に入力される。DSP202は、図示しないプログラムコードに則り、所望の計算を行う。その計算内容は、図1の画像解析回路108,109で行われる処理と等価なものである。画像解析回路108,109での処理を、DSP202で行わせることで、より汎用性(拡張性)を持たせることができる。つまり、例えば、プログラムコードを変更することで、矩形領域の大きさを変更したりすることができる。
図1に示した撮像装置100のように専用の画像解析回路108,109を用いることで回路規模は最適化されるという利点があり、一方、図2に示す示した撮像装置200のようなプログラマブルなDSP202を用いることで拡張性を持たせることができるという利点がある。逆に言えば、図1に示すように専用の画像解析回路108,109を用いることで拡張性は失われる。そして、図2に示すようなプログラマブルなDSP202を用いることで回路規模が大きくなるという欠点がおきる。図1、図2に示す構成は、一長一短があり、実際の製品としては、コストと、その利便性を考えて、それぞれの用途に合ったものを選ぶことになる。
次に、図1に示した撮像装置100について、詳しく述べる。
図3には、上記撮像装置100では、図3に示すように、時間の経過に従い、画像読み出しモードと、情報読み出すモードの2つのモードが交互に実行される。図3において、横軸は時間軸である。
この撮像装置100では、従来と異なり、情報を読み出すモードのときに、撮像素子103内の画素をすべて読み出さずに、一部分(ここでは、2箇所の200×200画素の部分としている)のみを読み出すようにしている。これにより、より高速な連続撮影が可能となる。
すなわち、図3に示すように、まず、時刻0秒から時刻4/240秒の間は、画像読み出しモードとして動作する。次の時刻4/240秒から時刻8/240秒の間は、情報読み出しモード(情報AB読み出しモードと名づけている。)として動作する。次の時刻8/240秒から時刻12/240秒の間は、画像読み出しモードとして動作する。次の時刻12/240秒から時刻16/240秒の間は、情報読み出しモード(情報AB読み出しモードと名づけている。)として動作する。以降、同様である。
画像読み出しモード(例えば、時刻0秒から時刻4/240秒の間)に関して、図4を用いて詳細に説明する。このモードでは、通常のデジタルスチルカメラやデジタルビデオカメラと同様の動作が行われる。
すなわち、時刻t0秒において、1つ目の画素(通常、位置(0,0)の画素)のリセットが行われ、時刻3/240秒まで電荷の蓄積が行われ、時刻3/240秒において、その画素の値として電荷に比例した値が103の出力端子より出力され、カメラ信号処理回路104を介して画像メモリ105に格納される。この画素の露光時間は、図4のT1である。
時刻(T0+1/960000000)秒において、2つ目の画素(通常、位置(1,0)の画素)のリセットが行われ、時刻(3/240+1/960000000)秒まで電荷の蓄積が行われ、時刻(3/240+1/960000000)秒において、その画素の値として電荷に比例した値が103の出力端子より出力され、カメラ信号処理回路104を介して画像メモリ105に格納される。この画素の露光時間は、図4のT2である。
時刻(T0+2/960000000)秒において、3つ目の画素(通常、位置(2,0)の画素)のリセットが行われ、時刻(3/240+2/960000000)秒まで電荷の蓄積が行われ、時刻(3/240+2/960000000)秒において、その画素の値として電荷に比例した値がイメージセンタ103の出力端子より出力され、カメラ信号処理回路104を介して画像メモリ105に格納される。この画素の露光時間は、図4のT3である。
以下、同様に、ラスタスキャン順に画素がリセットされ、露光され、読み出され、カメラ信号処理回路104を介して画像メモリ105に格納される。
そして、最後の画素であるN番目の画素(通常、位置(1999,1999)の画素)について処理が行われる。すなわち、時刻(t0+(N−1)/960000000)秒において、N番目の画素(通常、位置(1999,1999)の画素)のリセットが行われ、時刻(3/240+(N−1)/960000000)秒まで電荷の蓄積が行われ、時刻(3/240+(N−1)/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、カメラ信号処理回路104を介して、画像メモリ105に格納される。この画素の露光時間は、図4のTNである。
なお、ここでNは400万である。また、時刻t0は、制御回路111により決定される。具体的には、図示しない露出計からの値が制御回路111に入力され、被写体の明るさを検知して、撮像素子103で撮影する際に最適な露出時間が決定される。この露出時間に基づいて、t0=(3/240)−(露出時間)と決定される。この露出の決定は、従来からデジタルスチルカメラや、デジタルビデオカメラにおいて行われているので、その詳細を省略する。また、各画素のリセット、露光、読み出しのタイミングの制御は、タイミングジェネレータ110にて行われる。
なお、先に述べたように、撮像素子103からは、1画素あたりの読み出し時間は1/960マイクロ秒であり、全画素(N個の画素)を読み出すのに、400万×(1/960)マイクロ秒=1/240秒かかるので、時刻4/240秒において、画像読み出しモードは終わる。
なお、ここで、カメラ信号処理回路104での処理について説明する。カメラ信号処理回路104では、通常のデジタルスチルカメラやデジタルビデオカメラにおいて処理される画像処理と同じ処理が行われる。すなわち、γ補正やエッジ強調などによる見栄えの良い画像への変換などであり、さらに、撮像素子がベイヤー配列の場合はデモザイク処理、カラー画像の場合はホワイトバランス調整などが挙げられる。このような処理は、通常のデジタルスチルカメラやデジタルビデオカメラを使用して撮影する場合に、必ずカメラ内で行われている処理であるので、詳細説明を割愛する。
このように、4/240秒間に行われる画像読み出しモードが終了するたび、画像メモリ105には、撮像素子全体を使って撮影された「鑑賞用の綺麗な画像」が格納されることになる。
次に、情報AB読み出しモード(例えば、時刻4/240秒から時刻8/240秒の間)に関して、図5を用いて詳細に説明する。このモードでは、通常のデジタルスチルカメラやデジタルビデオカメラとは違い、撮像素子の一部分の読み出しのみが行われる。
なお、このモードに入る時点よりも前に、レジスタ110Aに、ブロックAの矩形領域(200×200画素)を示すデータと、ブロックBの矩形領域(200×200画素)を示すデータが保持されているとする。具体的には、レジスタ110Aは、ブロックAの左上の画素の位置を示す(ia,ib)と、ブロックBの左上の画素の位置を示す(ib,jb)という2つの2次元ベクトルの値を保持している。
タイミングジェネレータ110は、レジスタ110Aに格納されている情報を使って、撮像素子内の一部であるブロックAの部分とブロックBの部分のみを読み出すように、撮像素子103を制御する。
すなわち、時刻4/240秒において、ブロックA内の1つ目の画素(通常、位置(ia,ib)の画素)のリセットが行われ、時刻(4/240)+(80000/960000000)秒まで電荷の蓄積(図5のT11)が行われ、時刻(4/240)+(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。そして、同時に、この画素のリセットが再度行われ、時刻(4/240)+2×(80000/960000000)秒まで電荷の蓄積(図5のT21)が行われ、時刻(4/240)+2×(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。そして、同時に、この画素のリセットが再度行われ、時刻(4/240)+3×(80000/960000000)秒まで電荷の蓄積(図5のT31)が行われ、時刻(4/240)+3×(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。以降、同様にして、合計でS回、この操作が行われる。ここで、Sは199である。図5には、最後の操作での電荷の蓄積について、TS1として記してある。
また、時刻(4/240+1/960000000)秒において、ブロックA内の2つ目の画素(通常、位置(ia+1,ib)の画素)のリセットが行われ、時刻(4/240+1/960000000)+(80000/960000000)秒まで電荷の蓄積(図5のT12)が行われ、時刻(4/240+1/960000000)+(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。そして、同時に、この画素のリセットが再度行われ、時刻(4/240+1/960000000)+2×(80000/960000000)秒まで電荷の蓄積(図5のT22)が行われ、時刻(4/240+1/960000000)+2×(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。同時に、この画素のリセットが再度行われ、時刻(4/240+1/960000000)+3×(80000/960000000)秒まで電荷の蓄積(図5のT32)が行われ、時刻(4/240+1/960000000)+3×(80000/960000000)秒において、その画素の値として電荷に比例した値が103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。以降、同様にして、合計でS回、この操作が行われる。ここで、Sは199である。図5には、最後の操作での電荷の蓄積について、TS2として記してある。
また、時刻(4/240+2/960000000)秒において、ブロックA内の3つ目の画素(通常、位置(ia+2,ib)の画素)のリセットが行われ、時刻(4/240+2/960000000)+(80000/960000000)秒まで電荷の蓄積(図5のT13)が行われ、時刻(4/240+2/960000000)+(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。そして、同時に、この画素のリセットが再度行われ、時刻(4/240+2/960000000)+2×(80000/960000000)秒まで電荷の蓄積(図5のT23)が行われ、時刻(4/240+2/960000000)+2×(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。そして、同時に、この画素のリセットが再度行われ、時刻(4/240+2/960000000)+3×(80000/960000000)秒まで電荷の蓄積(図5のT33)が行われ、時刻(4/240+2/960000000)+3×(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ106A〜106Dのいずれかに格納される。以降、同様にして、合計でS回、この操作が行われる。ここで、Sは199である。図5には、最後の操作での電荷の蓄積について、TS3として記してある。
以下、同様に、ブロックA内の40000個の画素に対して、ラスタスキャン順に、リセットされ、露光され、読み出され、画像メモリ106A〜106Dのいずれかに格納される。
そして、さらに続けて、同様に、ブロックB内の40000個の画素に対して、ラスタスキャン順に、リセットされ、露光され、読み出され、画像メモリ107A〜107Dのいずれかに格納される。
すなわち、ブロックA内の画素に対しては、画像メモリ106A〜106Dのいずれかに格納していたが、ブロックB内の画素に対しては、画像メモリ107A〜107Dのいずれかに格納される。
そして、ブロックB内の最後の画素である40000番目の画素(通常、位置(ib+199,jb+199)の画素)について処理が行われる。なお、この画素は、ブロックAの最初の画素から数えてM番目である。ここで、Mは2×200×200=80000である。時刻(4/240+(M−1)/960000000)秒において、ブロックB内の40000番目の画素(通常、位置(ib+199,jb+199)の画素)のリセットが行われ、時刻(4/240+(M−1)/960000000)+(80000/960000000)秒まで電荷の蓄積(図5のT1M)が行われ、時刻(4/240+(M−1)/960000000)+(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ107A〜107Dのいずれかに格納される。そして、同時に、この画素のリセットが再度行われ、時刻(4/240+(M−1)/960000000)+2×(80000/960000000)秒まで電荷の蓄積(図5のT2M)が行われ、時刻(4/240+(M−1)/960000000)+2×(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ107A〜107Dのいずれかに格納される。そして、同時に、この画素のリセットが再度行われ、時刻(4/240+(M−1)/960000000)+3×(80000/960000000)秒まで電荷の蓄積(図5のT3M)が行われ、時刻(4/240+(M−1)/960000000)+3×(80000/960000000)秒において、その画素の値として電荷に比例した値が撮像素子103の出力端子より出力され、画像メモリ107A〜107Dのいずれかに格納される。以降、同様にして、合計でS回、この操作が行われる。ここで、Sは199である。図5には、最後の操作での電荷の蓄積について、TSMとして記してある。
ここで、ブロックA内とブロックB内にある画素の個数は合計で80000個であり、これら画素が時間的に順番に1/960マイクロ秒ごとに読み出されており、さらに、各画素について199回の読み出しがあるので、最終的には、時刻8/240以前にこの全ての処理を終えることができる。つまり、情報AB読み出しモードは、時刻4/240秒から時刻8/240秒の間に行うことができる。
なお、ブロックA内の各画素について合計で199回のメモリへの書き込みが行われるが、画像メモリ106A〜106Dに順番に各画素に対応した番地に書き込むことで、常に、時間的に最新の4つの値が書き込まれていることになる。ブロックB内の各画素についても合計で199回のメモリへの書き込みが行われるが、画像メモリ107A〜107Dに順番に各画素に対応した番地に書き込むことで、常に、時間的に最新の4つの値が書き込まれていることになる。最新の4つ以外の値は上書きされるので、その値は消される。
なお、画像読み出しモードでは、観賞用の画像の撮影のため適正な露光時間が必要であったが、情報AB読み出しモードでは、時間的に各画素のデジタルデータの値の増減があったかどうかを知りたいだけなので露光時間が少なくて暗めの画像になっていても問題はない。事実、図4のT1〜TNで示した露光時間よりも、図5のT11〜TSMで示した各露光時間は短くなっている。
時刻4/240秒から時刻8/240秒の間では、さらに、画像メモリ106A〜106D内に格納されているデータを読み出し、画像解析回路108で、以下の処理が行われる。
ブロックA内のある画素に着目すると、80000/960000000秒(すなわち、12kHz)ごとに画像メモリ106A〜106D内の一番時間的に古い時刻に撮影されたデータが、新しいデータに更新される。各画素について、この80000/960000000秒ごとの更新の度に、差分DIFF=F(n)+F(n−1)−F(n−2)−F(n−3)を、画像解析回路108で計算する。ここで、F(n)は現在更新されたデータ(つまり、最新のデータ)の値、F(n−1)は80000/960000000秒前に更新されたデータ(つまり、古い方から数えて3番目のデータ)の値、F(n−2)は2×80000/960000000秒前に更新されたデータ、つまり、古い方から数えて2番目のデータの値、F(n−3)は3×80000/960000000秒前に更新されたデータ、つまり、一番古いデータの値である。これら4つのデータは、先に説明したように、画像メモリ106A〜106D内にあり、画像解析回路108へ読み出されて差分DIFFの計算が行われる。
さらに、画像解析回路108では、この差分DIFFと閾値との大小関係を調べる。そして、DIFFの値が、ある閾値以上であれば、その画素に投影された光源からの光が、この時刻において、オフ(消灯)からオン(点灯)に変化したと判断する。また、DIFFの値が、別の閾値以下であれば、その画素に投影された光源からの光が、この時刻において、オン(点灯)からオフ(消灯)に変化したと判断する。
最新の2つの時刻に撮られたデータ(F(n)とデータF(n−1))を加算し、古い2つの時刻に撮られたデータ(F(n−2)とデータF(n−3))を加算することで、時間方向のノイズに対してロバスト(安定性)なものとし、これら2つのデータの引き算により、時間的変化の度合いを求めている。この変化の度合いを、閾値と比較することで、その画素の値の変化を検知することができる。もちろん、この他に時間方向の一次微分などで、その画素の値の変化を検知することができるが、それらは公知の方法であり、それら各種「値の変化の検知」方法については、ここで言及はしない。
このように画像解析回路108にて、ブロックA内の各画素について、80000/960000000秒(すなわち、12kHz)ごとに、その投影像が点滅しているか、さらに、点滅している場合には、その点滅パターンを検知することができる。
同様に、画像解析回路109にて、画像メモリ107A〜107DからブロックB内の各画素を読み出すことにより、ブロックB内の各画素について、80000/960000000秒(すなわち、12kHz)ごとに、その投影像が点滅しているか、さらに、点滅している場合には、その点滅パターンを検知することができる。
なお、各画素について、上述したようにS(つまり199)回の撮影が行われることと、時間的に4回の撮影から差分DIFFが計算されることより、S+1−4(つまり196)回のオン/オフ変化を検知することができる。従って、この長さよりも短い点滅パターン長を発する情報源について検知することができる。また、これ以上に長い点滅パターン長を発する情報源については、情報AB読み出しモードの時間を長くすれば対処できる。
図3に示したように、画像読み出しモードと情報AB読み出しモードを交互に行うことで、105には1/30=8/240秒ごとに画像の更新が行われる。つまり、30fpsの動画像が、リアルタイムで105に格納されていく。そして、12kHzでブロックAおよびブロックB内の各画素に投影された投影像の点滅パターンを画像解析回路108,109で検知することができる。
次に、この撮像装置100を使用した2つの応用例を説明する。すなわち、1つ目は、画像を撮影しながら、さらに、撮影されている領域内に発光する光の点滅パターンにより、データを転送するシステムにおける撮像装置である。2つ目は、スリット光を回転ミラーで反射させることで三角測量の原理を使った、画像を撮影しながら、その被写体までの距離を求める装置における撮像装置である。
まず、1つ目の応用例についての説明を行う。図6のフローチャートに、その処理の流れを示す。
ここでは、図7に示すように、4KHzの周波数で点滅駆動することで情報を発信している複数のLED10A〜10Nを含む風景(被写体)Aを撮像装置100を使用して撮影しているものとする。
図6に示すフローチャートおいて、まず、ステップS1では、ブロックAの位置を決めるための横軸座標の値(ia)に0をセットする。そして、ステップS2に進む。
ステップS2では、ブロックAの位置を決めるための縦軸座標の値(ja)に0をセットする。そして、ステップS3に進む。
ステップS3では、図4を用いて説明した画像読み出しモードにて、撮影を行い、撮影された画像を画像メモリ105に格納する。ステップS3に要する時間は、4/240秒である。そして、ステップS4に進む。
ステップS4では、ブロックAの位置を決定する。すなわち、ブロックAは、「左上の画素の位置を(ia,ja)とする200×200画素のブロック」であるという情報を、レジスタ110Aに格納させる。そして、ステップS5に進む。
ステップS5では、ブロックBの位置を決めるための横軸座標の値(ib)にia+150をセットし、縦軸座標の値(jb)にjaの値をセットする。そして、ステップS6に進む。
ステップS6では、ブロックBの位置を決定する。すなわち、ブロックBは、「左上の画素の位置を(ib,jb)とする200×200画素のブロック」であるという情報を、レジスタ110Aに格納させる。そして、ステップS7に進む。
ステップS7では、図5を用いて説明した情報AB読み出しモードにて、撮影を行う。すなわち、画像解析回路108でブロックA内に投影されているLEDの有無と、もし有れば、ブロックA内でのLEDの位置(tmpIA,tmpJA)と、その点滅パターンを求める。「LEDの有無」、「ブロックA内でのLEDの位置」、「点滅パターン」は、制御回路111に送られる。同時に、画像解析回路109でブロックB内に投影されているLEDの有無と、もし有れば、ブロックB内でのLEDの位置(tmpIB,tmpJB)と、その点滅パターンを求める。「LEDの有無」、「ブロックB内でのLEDの位置」、「点滅パターン」は、制御回路111に送られる。ステップS7に要する時間は、4/240秒である。そして、ステップS8に進む。
ステップS8〜ステップS11では、別のブロックについての処理を行うための操作が行われる。すなわち、ステップS8で、iaの値が1500未満であるかを判断し、真であれば、横軸方向に1段ずらすために、ステップS9にて、iaの値を300だけインクリメントしてステップS3に戻る。偽であれば、縦軸方向に一段ずらすために、ステップS10に進む。ステップS10では、jaの値が1800未満であるかを判断し、真であれば、縦軸方向に1段ずらすために、ステップS11にて、jaの値を150だけインクリメントしてステップS2に戻る。偽であれば、ステップS12に進む。なお、ステップS8の判定から分かるように、一番右端の部分にブロックを設定して探索を行ってはいない。これは、ユーザーが明示的に情報を取得しようとしてLEDに向けて撮影を行っているわけであり、一番はじにはLEDの投影像がないと仮定しているからである。
ステップS12では、ステップS7において求まった「各ブロックの位置におけるLEDの有無」より、どの位置にブロックを設定したときにLEDが有ったかを判定する。ここでは、LEDは2つ有ったとして話を進めていく。3つ以上の場合については、後述する。LEDが有ったと判定された時の2つのブロックの位置の左上を(tmpI1,tmpJ1)と(tmpI2,tmpJ2)とする。また、「そのブロック内でのLEDの位置(tmpIA,tmpJA)あるいは(tmpIB,tmpJB)」もステップS7において求まっているので、この値を使用して、撮像素子における2つのLEDの位置を求める。つまり、(tmpI1+tmpI*,tmpJ1+tmpJ*)あるいは(tmpI2+tmpI*,tmpJ2+tmpJ*)を計算する。ここで添え字“*”は、AあるいはBである。そこで、これら位置を中心とするブロックをブロックAとブロックBとする。具体的には、ブロックAは「左上の画素の位置を(tmpI1+tmpI*−100,tmpJ1+tmpJ*−100)とする200×200画素のブロック」であるという情報をレジスタ110Aに格納させる。そして、ブロックBは「左上の画素の位置を(tmpI2+tmpI*−100,tmpJ2+tmpJ*−100)とする200×200画素のブロック」であるという情報をレジスタ110Aに格納させる。これらの処理は、制御回路111内で行われる。そして、ステップS13に進む。
ここで、ステップS13以降の説明を行う前に、ステップS1〜ステップS12までの補足説明をしておく。最初に撮像装置を使って撮影しても、どの方向(即ち、どの画素)に情報を発信しているLEDがあるか不明である。そこで、400万画素(2000×2000画素)のすべての位置にブロックを設定して、そのブロック内で発光パターンを検知できるか調べる必要がある。それが、ステップS1〜ステップS11である。そして、求まったLEDの投影像の位置を中心とするようにブロックAとブロックBを指定しているのが、ステップS12である。
また、ステップS5、ステップS9、ステップS11から分かるように、次々と探索していくブロックは50画素ずつの交わり部分がある(図8参照)。図8において、領域A0は撮像素子全体(2000×2000画素)を示している。例えば、ブロックAとして図8に示す領域A1が設定されているときには、ブロックBとして領域A2が設定される。さらに、縦方向に一段ずらして計算するときには、ブロックAとして領域A3が設定され、ブロックBとして領域A4が設定される。図8に示すように各ブロックには50画素ずつの重なり部分がある。これは、LEDの検出をする際に、ブロックの一番はじにLEDが投影されていると判定ミスを起こす可能性があるので、それを避けるためである。つまり、位置P0にLEDが投影されていたとすると、領域A1のブロック内での判定では、LEDを検出できない可能性もあるが、この場合、領域A2のブロック内での判定で、見つけることができる。
さて、このようにステップS12までの処理で、2つのLEDの投影像の位置が判明するので、その投影像を中心とする2つのブロックの位置情報がレジスタ110Aに設定される。
ステップS13では、図4を用いて説明した画像読み出しモードにて、撮影を行い、撮影された画像を画像メモリ105に格納する。ステップS13に要する時間は、4/240秒である。そして、ステップS14に進む。
ステップS14では、図5を用いて説明した情報AB読み出しモードにて、撮影を行う。即ち、画像解析回路108でブロックA内に投影されているLEDの有無と、もし有れば、ブロックA内でのLEDの位置(tmpIA,tmpJA)と、その点滅パターンを求める。「LEDの有無」、「ブロックA内でのLEDの位置」、「点滅パターン」は、制御回路111に送られる。同時に、画像解析回路109でブロックB内に投影されているLEDの有無と、もし有れば、ブロックB内でのLEDの位置(tmpIB,tmpJB)と、その点滅パターンを求める。「LEDの有無」、「ブロックB内でのLEDの位置」、「点滅パターン」は、制御回路111に送られる。ステップS7に要する時間は、4/240秒である。そして、ステップS15に進む。
ステップS15では、ブロックAの更新を行う。即ち、(tmpIA,tmpJA)の値をチェックして、この値が(100,100)であれば、ブロックAの中心にLEDの投影像が来ているので更新を行わない。しかし、それ以外の値の場合には、ブロックAの中心にLEDの投影像がないので、このままでは、時間とともに、LEDの投影像がブロックAの範囲外に行ってしまうことが考えられる。そこで、ブロックAは「左上の画素の位置を(tmpI1+tmpIA−100,tmpJ1+tmpJA−100)とする200×200画素のブロック」であるという情報をレジスタ110Aに格納させ、ブロックAの位置情報の更新を行う。これにより、次の撮影においては、LEDの投影像はブロックAの中心近辺となる。そして、ステップS16に進む。
ステップS16では、同様にブロックBの更新を行う。すなわち、ブロックBは「左上の画素の位置を(tmpI2+tmpIB−100,tmpJ2+tmpJB−100)とする200×200画素のブロック」であるという情報をレジスタ110Aに格納させ、ブロックBの位置情報の更新を行う。そして、ステップS17に進む。
図9には、2つのLEDの投影像の位置P1,P2と、ステップS15、ステップS16で更新されたブロックAの領域A5とブロックBの領域A6)が示されている。この図9においてA0は撮像素子全体(2000×2000画素)を示している。
ステップS17では、ユーザーからの「終了するかどうか」の要求を受付け、終了したければ、この一連の処理を終了し、終了したくなければ、ステップS13に戻り、一連の処理を続行する。
なお、当然、ステップS14において、LEDの有無を調べたときに、無いと判定されれば、それは、今まで撮影していたLEDの投影像の位置を見失ったか、あるいは、そのLED自体が情報の発信を中止してしまったかが考えられるので、図6に示す処理を強制終了させて、再度、ステップS1から処理をやり直す必要がある。また、見失った場合には、見失った位置の近傍にブロックを設定して探索すれば、撮像素子すべての位置における探索を行わなくても、短時間で探索できる。
また、以下のようにして見失ったLEDの投影像の位置を迅速に見つけ出すこともできる。見失ったブロックがブロックAの場合について述べる。見失う直前における画像読み出しモードで撮影した画像から、「左上の画素の位置を(tmpI1+tmpIA−100,tmpJ1+tmpJA−100)とする200×200画素のブロック」を切り出す。次に、見失った直後における画像読み出しモードで撮影した画像の中で、先に切り出したブロック部分と同じ部分を探し出す。具体的には、ブロック内の対応する画素の差分絶対値和が最小となる位置を求めるというブロックマッチング法を行えばよい。これにより、求まった位置がLEDの投影像を中心とするブロックであるので、この部分をブロックAとすれば良い。このように、画像間の相関を利用したブロックマッチング法で、撮像素子内のLEDの投影像を含む部分が、どちらに移動したかを求めることができ、見失ったLEDの投影像の位置を求めることができる。ブロックBを見失った場合も同様である。
さて、このようにして、図3に示したように画像読み出しモードと情報AB読み出しモードが交互に行われ、画像メモリ105には1/30=8/240秒ごとに画像の更新が行われる。つまり、30fpsの動画像が、リアルタイムで画像メモリ105に格納されていく。そして、12kHzでブロックA及びブロックB内の各画素に投影された投影像の点滅パターンを画像解析回路108,109で検知することができる。この結果は、表示を行いながらユーザーに情報を提供することができる。すなわち、画像メモリ105の画像(2000×2000画素)を30fpsで図示しない表示デバイスにて表示して、さらに、その表示画像上の位置(tmpI1+tmpIA,tmpJ1+tmpJA)及び(tmpI2+tmpIB,tmpJ2+tmpJB)にLEDから発信されている情報をオーバーレイすることで、ユーザーに分かりやすい形式で画像と情報を伝えることができる。
なお、ステップS1からステップS12までの処理を行っている時は、まだLEDの投影像を確定させていないので、表示デバイスには画像メモリ105の画像のみが30fpsで表示されるだけである。
ここで、幾つかの変形例について説明する。
1つ目の変形例は、動画像を30fpsで表示する必要はないが、その代わりに、頻繁にLEDの発光パターンを検知したい場合である。この場合には、図10に示すような動作を行えば良い。すなわち、0秒から4/240秒の間は、画像読み出しモードにて撮影を行う。そして、4/240秒から8/240秒の間は、情報AB読み出しモードにて撮影を行う。さらに、8/240秒から12/240秒の間も、情報AB読み出しモードにて撮影を行う。さらに、12/240秒から16/240秒の間も、情報AB読み出しモードにて撮影を行う。そして、16/240秒から20/240秒の間は、情画像読み出しモードにて撮影を行う。以降、図10に示すように、1回の画像読み出しモードと3回の情報AB読み出しモードの繰り返しを行う。これにより、撮像素子103全体を使って撮影された画像は15fpsの動画像となり、画像メモリ105を介して、図示しない表示デバイスにて15fpsで表示される。情報に関しては、図3に示した動作に比べて、時間的に1.5倍密に検知を行うことができる。
2つ目の変形例は、4つのLEDが情報を発信している場合である。この場合、図6のステップS12までの処理で、4つのLEDの投影像が検知される。この場合には、例えば、図11に示すようにブロックのサイズを1/2に縮小することで、全ブロック内にある総画素数の数を80000に抑えることができる。この場合、ブロックA内の画素についての撮像素子103からの読み出しは、領域A51内と領域A52内の画素についての読み出しとして、「ブロックA内の画素についての発光パターンの検知」の変わりに「領域A51に示すブロック内の画素についての発光パターンの検知」と「領域A52に示すブロック内の画素についての発光パターンの検知」を画像解析回路108で行えばよい。画像解析回路108では、図11の位置P1,P2において2つのLEDの発光パターンを検知する。同様に、ブロックB内の画素についての撮像素子103からの読み出しは、領域A61内と領域A62内の画素についての読み出しとして、「ブロックB内の画素についての発光パターンの検知」の変わりに「領域A61に示すブロック内の画素についての発光パターンの検知」と「領域A62に示すブロック内の画素についての発光パターンの検知」を画像解析回路109で行えばよい。画像解析回路109では、図11の位置P3,P4において2つのLEDの発光パターンを検知する。
4つのLEDが情報を発信している場合、あるいは、図12と図13に示す動作を行っても良い。すなわち、図12に示すように、4つのLEDの投影像の位置P1,P2,P3,P4を中心とするブロックAの領域A5、ブロックBの領域A6、ブロックCの領域A7、ブロックDの領域A8を設定する。いずれのブロックの大きさも200×200画素である。そして、図13に示すように、画像読み出しモードと、情報AB読み出しモードと、画像読み出しモードと、情報CD読み出しモードを繰り返す。ここで、画像読み出しモードは、図4を用いて今までに説明した動作と同じである。そして、情報AB読み出しモードも、図5を用いて今まで説明したブロックAとブロックB内の検出の動作と同じである。情報CD読み出しモードは、図5を用いて今まで説明したブロックAをブロックCと思い、ブロックBをブロックDと思い、その2つのブロック内の検出を行うものである。これにより、ブロックA、ブロックB、ブロックC、および、ブロックD内のLEDの発光パターンの検出は、16/240秒に1回、つまり、15fpsとなり、発光パターンのアップデートには時間がかかるが、4つのLEDの発光パターンを検出できる。ちなみに、図3の動作では、ブロックAとブロックB内のLEDの発光パターンの検出は、8/240秒に1回、つまり、30fpsであった。
なお、上述の例では、通常の画像を撮影(400万画素全部を使って撮影)するモード(画像読み出しモード)と、2箇所の200×200画素を使って情報を取得するモード(情報AB読み出しモード)の2つが、時間的に交互に繰り返されるとして説明した。しかしながら、例えば、画像は、最初の1枚だけ静止画として撮影して、それ以外の画像が不要な場合には、当然、最初の時刻において、400万画素全部を使って撮影した後は、常に、2箇所の200×200画素を使って情報を取得するモード(情報AB読み出しモード)で、装置を動作させれば良い。また、さらに、画像自体が不要な場合には、最初から最後まで常に2箇所の200×200画素を使って情報を取得するモード(情報AB読み出しモード)で、装置を動作させれば良い。
また、さらに、画像自体が不要な場合には、最初から最後まで常に2箇所の200×200画素を使って情報を取得するモード(情報AB読み出しモード)で装置を動作させておき、LEDの投影像の位置を見失ったときのみ、画像読み出しモードにして、画像全体を読み出し、画像メモリ106A〜106Dあるいは画像メモリ107A〜107D内にある見失う直前の200×200画素のブロックとブロックマッチング法により、再度、見失ったLEDの投影像を検出するようにして、見失った後のブロックAあるいはブロックBの設定をする際にこのブロックマッチング法で見つけた部分を採用しても良い。
また、ステップS15とステップS16での更新のために、LEDの投影像をトラッキングしていき、常に200×200画素の中心になるように、読み出すべき200×200画素を、400万画素の撮像素子103の中からリアルタイムで決定していると述べたが、投影像をトラッキングする代わりに、撮像装置100内に設けた図示しないジャイロセンサを使って、撮像装置100の移動量を検出して、それを補正しながら200×200画素の位置を決定して、その部分を読み出していけば、常に、点滅パターンは200×200画素の中心に来るようになる。つまり、画像処理により、投影像をトラッキングしていかなくても、ジャイロセンサを用いても良い。このようにして、手持ちで撮影している場合の手ブレによるLED投影像の画面上でのふらつきを補正することができる。
次に、2つ目の応用例についての説明を行う。図14のフローチャートに、その処理の流れを示す。
ここで、前提として、例えば図15に示すように、光源51から出射されるスリット光を回転ミラー52で反射させて撮像領域Aを走査する光学走査装置50と組み合わせて三角測量の原理を使い、撮像装置100で画像を撮影しながら、その被写体までの距離を求めるものとする。
図14において、まず、ステップS101では、ブロックAの位置を決めるための横軸座標の値(ia)に0をセットする。そして、ステップS102に進む。
ステップS102で、ブロックAの位置を決めるための縦軸座標の値(ja)に0をセットする。そして、ステップS103に進む。
ステップS103では、図4を用いて説明した画像読み出しモードにて、撮影を行い、画像メモリ105に撮影された画像を格納する。ステップS103に要する時間は、4/240秒である。そして、ステップS104に進む。
ステップS104では、ブロックAの位置を決定する。即ち、ブロックAは、「左上の画素の位置を(ia,ja)とする200×200画素のブロック」であるという情報をレジスタ110Aに格納させる。そして、ステップS105に進む。
ステップS105では、ブロックBの位置を決めるための横軸座標の値(ib)にia+150をセットし、縦軸座標の値(jb)にjaの値をセットする。そして、ステップS106に進む。
ステップS106では、ブロックBの位置を決定する。即ち、ブロックBは、「左上の画素の位置を(ib,jb)とする200×200画素のブロック」であるという情報をレジスタ110Aに格納させる。そして、ステップS107に進む。
ステップS107では、図5を用いて説明した情報AB読み出しモードにて、撮影を行う。すなわち、画像解析回路108でブロックA内の各画素に対して、時間とともに変化する光量を調べ、すなわち、スリット光が通過したタイミング(時刻)を調べ、ブロックA内の各画素における距離情報を取得する。同時に、画像解析回路109でブロックB内の各画素に対して、時間とともに変化する光量を調べ、すなわち、スリット光が通過したタイミング(時刻)を調べ、ブロックB内の各画素における距離情報を取得する。なお、スリット光が通過したタイミングから距離情報を計算する方法に関しては、従来から知られている方法を採用することができ、その詳細説明を割愛する。
ステップS108〜ステップS111では、別のブロックについての処理を行うための操作が行われる。即ち、ステップS108で、iaの値が1500未満であるかを判断し、真であれば、横軸方向に1段ずらすために、ステップS109にて、iaの値を300だけインクリメントしてステップS103に戻る。偽であれば、縦軸方向に一段ずらすために、ステップS110に進む。ステップS110では、jaの値が1800未満であるかを判断し、真であれば、縦軸方向に1段ずらすために、ステップS111にて、jaの値を150だけインクリメントしてステップS102に戻る。偽であれば、ステップS112に進む。
ステップS112では、ユーザーからの「終了するかどうか」の要求を受付け、終了したければ、この一連の処理を終了し、終了したくなければ、ステップS101に戻り、一連の処理を続行する。
このように、画像全体のすべての画素について一度に距離情報を求めるのではなく、ブロックに分割して、各ブロック内の画素について距離情報を求めるようにしている。これにより、各画素に着目すると、画像撮影モードにより更新される画像データは30fpsであるが、距離情報の更新は、自分を含んでいるブロックがブロックAあるいはブロックBとして処理されるときだけなので、30fpsよりかなり遅くなるが、これは仕方のない事である。
また、上述の例では、自動で200×200画素の位置を変更(光点滅パターンの検出時には、その投影像をトラッキングしていき、常に200×200画素の中心になるように、読み出すべき200×200画素を、400万画素の撮像素子の中からリアルタイムで決定している。スリット光による3次元計測においては、左上から順番に自動で変更していき、すべての箇所において3次元計測を行う。)しているが、この装置を操作するユーザーが明示的に指定するようにしても良い。例えば、複数の光点滅パターンを撮影しているが、ユーザーが特定の光源(情報源)の情報のみを欲しているときなどは、その情報源(点滅パターン)が投影されている部分のみをユーザーが指定することにする。これにより、その部分についてのみ、200×200画素を使って情報を取得するモードで動作させることで、その点滅パターンのみを取得し、他の点滅パターンを取得することがなくなる。つまり、不要な情報源からの情報をシャットアウトすることができる。また、3次元計測を行いたい物体が投影されている部分をユーザーが指定すれば、その部分についてのみ、200×200画素を使って情報を取得するモードで動作させることで、その部分のみの3次元計測を行うことができる。
上記情報源は、1つあるいは複数が密に並べられた点光源とし、該点光源のそれぞれが時間とともにオン/オフすることで、二進数の情報を伝えるものとすることができる。
また、上述の例では、画像読み出しモードにおいては、400万画素を全部読み出し、図示しない表示デバイスに表示すると説明したが、解像度が必要のない場合には、400万画素の画像を縮小して、たとえば600×600画素程度の画像にして、表示デバイスに表示しても良い。
また、上述の例では、特定の画素数、特定の動作周波数について述べていたが、上記以外のスペックの装置でも適用できることは言うまでもない。
10A〜10N LED、100,200 撮像装置、101 レンズ、102 絞り、103 撮像素子、104 カメラ信号処理回路、105,106A〜106D,107A〜107D,201 画像メモリ、108,109 画像解析回路、110 タイミングジェネレータ、110A レジスタ、111 制御回路、202 DSP