電力使用量NOW

2011年5月12日木曜日

画像処理 第1章

画像処理という作業は、言ってしまえば「配列に格納されたピクセルのデータをどのようにいじくりまわすか?」という、極めて単純な作業である。しかし、その「配列」という代物がとんでもなく曲者で、配列と切っても切れない「アドレス」との戦いでもある。

コンピュータ上では、全てのデータは主記憶装置と呼ばれる「メモリ」に格納される。メモリというのは、広大な敷地のある土地のようなもので、そこに住所を割り振る作業…それを「マッピング」と呼ぶ。この作業は、基本的にはアプリケーションやOSが行い、普段我々が特別な意識を傾けることはない。しかし、この作業がなければ、広大なアドレス空間のどこに特定のデータを格納したか?の判別が出来ない。また、同じアドレスに重複してデータをしまってしまったりする。

今回の画像処理高速化のポイントは、この「アドレス」に直接データを取りに行き、配列へとコピーする作業をどうするか?ということであった。この一連の作業を「DMA(=Direct Memory Access)転送」と呼ぶらしい。

以前は、画像を1枚のBMP(ビットマップ)ファイルとして保存し、それを再び読み出し、APIを使って配列へと格納する作業を行っていた。この方法は、プログラムとしては極めてシンプルで見やすく、何をやっているかも分かりやすいアルゴリズムなのだが、肝心のスピードが出ない。保存と読み出しの課程で、どうしてもHDDを経由してしまうため、スピードが落ちてしまうのである。メモリとHDDのデータ転送速度は、人間の感覚には大差ないように思えるが、コンピュータ内部では雲泥の差なのである。

今回は、開発したアプリケーションソフトによってマッピングされた(正確に言えば、フレームグラバボードのドライバがマッピングした)アドレスへ直接データを取りに行き、それを配列へと格納することで、今までの数十倍のスピードを達成することが出来た。ただし、撮影するカメラの都合上、1秒間に撮影できる画面数は60枚である(=60fpsと呼ぶ)。1秒間に60枚ということは、1枚の撮影にかかる時間が1/60=17msである。今回用いたフレームグラバボードの転送速度は250MB/sである。1枚の画素数は640x485=310400pxである。画像の階調は256階調=8bitであるから、1ピクセルを1Byteと読み替えていいので、この画像は310400Byteである。よって、このフレームグラバボードは、単純計算で

250000000/310400=805.412371134020619
≒805

すなわち、805枚のデータを1秒間に転送できる計算となる。この数値と比較すると、1秒間に60枚のカメラの性能など低速もいいところ。今まで60枚の画像撮影に要していた時間は12秒程度であったが、60fpsをフルに生かして1秒で全ての作業が終了することとなる。

とりあえず今日はここまで。

以上。

0 件のコメント:

コメントを投稿