2006年07月03日

カラーにしたい症候群①

ここ数日、AIBO君に搭載されているCCDカメラからデータを取得するサンプルプログラムを弄って 反応する色を増やしてみたりしてたわけだけど…色々弄ってるうちに"TELNET"出力前にデータを圧縮すればPC側にカラーでデータをリアルタイム送信できるんじゃない?とか思い始め、いつのまにか本来の目的を脱線してPC側にカラーでデータを送るための圧縮アルゴリズムの開発に着手していた(笑)AIBO君の"CCD"は"YCrCb信号"を各(YとCrとCb)256階調、176×144、88×72、44×36ドットの3つの解像度で毎秒25フレーム処理しているらしいんだけど、TELNETが遅いせいか?リアルタイムでTELNET送信するには YかCrかCbのどれか1つを86階調、22×18ドット、毎秒4.167フレーム程度が限界。現在利用している先輩AOK氏が作ったプログラムは 44×36ドットでCCDから取得してきた256階調のYデータを フレーム単位で一端AIBO上のメモリに詰め込み、そこから各データを取り出して 22×18ドット 86階調化処理してTELNETで出力している。形式は「 23 24 85 3 13 5 12」のような1ドットにつき3バイトを要するものであり、この例だと7ドットで21バイトのデータを出力しているわけだ。これを1ドットにつき1バイトにすると、1ドットにつき2バイトの余裕ができるわけで…そこにCrとCbのデータを入れればカラーにできるんじゃない?というわけ。単純に各ドットデータを26で割って 0~9 の間に収めちゃえばできるわけだけど、10階調のカラーが86階調のモノクロよりも表現能力に優れていとは到底思えず…目標は最低86階調のカラー!よくありがちな「5555232111」というデータを「5423213」にするような圧縮方法は明らかに使えないし、"ハフマン法"によるビット圧縮をチョコっとやってみたら AIBO君の脳味噌(CPU)じゃリアルタイムで処理しきれない感じ(笑)もっとメモリもCPUも使わずにサックリ確実に 0~85 のデータを1バイトにする方法はないものか…"ストロベリー・オンザ・ショートケーキ"の再放送をボーっと見ていると、ふと文字列を用いた圧縮方法を思いついた。さすが"深田恭子"!彼女のパワーは計り知れない(関係ない気もするけど… 笑)半角英数字ってのは"アスキーコード"と呼ばれる規則に従って表されるもので、32~126 の値が図形文字(aとかBとかrとか)であり、94個のデータを1バイトで表現することができる。つまり…86階調にした 0~85 の各データに32を足して文字列としてTELNET出力されば 0~85 のデータが必ず1バイトになるというわけだ。理論がまとまったところで早速実装作業に取り掛かったのだが、途中で友人SHIが新たな実験計画法の計算シートの作成依頼に来たり、"バーミヤン"に夕飯を食べに行ったりしてなかなか作業が進まず…研究室に泊り込んで朝まで作業して 1時限の授業に出てそのまま帰宅するプランを実行しようとしたのだが、何故か手続きが上手く行ってなくて研究室に泊まれず、友人SHIと私の自宅で一晩を過ごす事になった(苦笑)"チョコビ"を食べながら夜中3時頃まで新たな実験計画法の作業をし、明け方5時までお酒を飲んで過ごした。

チョコビの箱 チョコビ

投稿者 zeratinman : 2006年07月03日 00:00