マイコン工作実験日記

Microcontroller を用いての工作、実験記録

SXGAの画像とJPEG圧縮

2009-05-14 00:26:30 | CMOSカメラ
VGAで撮影した画像の確認が正常にできたので、続いてSXGA (1280*1024)で撮影した画像を確認することにしました。カメラのCOM7レジスタを0x00に設定してやることで、撮影画素数がSXGAに設定されます。プレビュー機能を使って、QVGAに縮小してのLCD表示はすでに問題なく動作しています。そこで、Codec path機能を使って取得したカメラの画像データをPC側に転送。今度は 1280 * 1024 * 2 = 2,621,440バイトのデータ量です。改めてデカイもんだと認識を新たにさせられます。

こうして取得した画像データを、JPEGへ変換してみたのですが、できた画像はこんな↓になってしまいました。



斜めに黒い線が入っていることから、水平方向の画素数が1280になっていないことは容易に推察されます。 COM7以外のレジスタの設定も調節しないと、カメラから正しく映像出力信号が出てこないということなのでしょうか? LCDでプレビューしていた時には何の問題もなかったのですが、ISIのプレビュー機能には指定された画素数よりも多くの画素データが与えられた場合に、自動的にクリッピングをおこなって表示データを生成するという、じつに賢い機能が用意されています。どうやら、このクリッピング機能が働いたために、LCD表示では何の問題もなく撮像できているように見えていたようです。

カメラのレジスタ設定をいろいろといじってみれば、正しく水平1280画素を出力する方法もわかるかもしれませんが、とりあえずJPEGへの変換処理を調整することで画像を修正することにしました。カメラからの出力は YCbCr 4:2:2形式ですので、出力される水平方向画素数は必ず偶数になっているはずです。1280よりも多いということで、試しに1282ドットと推測して変換してみたところ、ビンゴでした。↓



libjpegでは、JPEG圧縮する際に圧縮度と画質のトレードオフを調節するために、qualityというパラメータを指定することができるようになっています。前回の記事では書き忘れてしまいましたが、これまでJPEG化の際にはqualityを100に設定していました。上の画像もそうで、サイズは739Kもあります。これは、できるだけ画像の劣化を抑止して撮影画像を確認したかったためですが、反面圧縮率は悪くなっており実用的ではありません。試しに、qualityを75にして変換してみたのが次のふたつの画像です。





ファイルサイズを比較してみると、次の表のようになります。JPEGのありがたみが実感できました。

画像名画素数BMP形式quality=100quality=75
きなこチャンVGA900K224K35.4K
うりクンSXGA3.8MB739K106K


ようやくとカメラ本来の能力であるSXGA画像の確認ができて、自分ではけっこう満足しています。