2014/06/04

PSoC 5LPと有機ELディスプレイで動画を描画させてみる

先日購入した有機ELディスプレイ(記事)、買った時から動画を表示させたいと思っていたので作りました。
むしろ、表示させるために買ったという表現のほうが正しいかもしれません。有機EL特有の応答速度とコントラスト比は動画で一層優位性が示されると思います。


前回(センサーデバッガ)は詰まる所もなくすんなり完成しましたが今回はそうは行かなかったです。
あの時は秋にやると書きましたが、目の前の諸問題が大きすぎる時、短期で終わるプロジェクトは非常に魅力的なものです。
鉄は熱いうちに打て」と言いますしね :D

 開発後記的な物 ->

目標フレームレート

目標とするフレームレートは30fpsです。
動画の再生は、
データの読み込み → デコード → 転送
によって行われますので、1000ms / 30fps = 33.3ms の間に1フレームの全処理を行う必要があります。

ディスプレイへの転送時間

転送時間は事前の調査(記事)でおおよその見当はついています。
実際に計測した所、最適化の前後の差は、
  最適化前 : 105ms
  最適化後 : 25ms
でした。これは、1024byteのバイナリデータをI2Cの400kbpsで転送した場合です。
"理論値では3.22倍程度の最適化"と書きましたが、アプリケーションでは4倍程度の差がでます。MCUのI2CComponentの処理の減少分でしょうか。
 ちなみに1000kbpsへオーバークロックすることで、転送時間は、14ms程度まで減少します。

動画の変換の必要性

1ピクセル1バイト(0〜255)の輝度情報持ったバイナリデータをmicroSDから読み出すのは約26ms程度必要でした。それをマイコンのCPUでディスプレイに転送可能な二値画像に変換するのにさらに15ms程度必要です。
ディスプレイの転送を最適化したのみで実装した所、14fps程度しか出ません。

1フレームあたり1024byteしか必要ないので、わざわざ8192byteも読み込む必要はありません。事前にエンコードしてmicroSDカードに保存しておけば、デコード時間もなくせますし、転送時間も減らす事ができます。そんなわけでエンコーダーを作ります。

1bpp用エンコーダーの作成

使うのは私だけなので、機能を絞ります。
・1bppでSSDシリーズに直に転送出来るようなバイナリデータを吐き出すだけのソフト
・リサイズ機能なし(事前にMediaCoderでリサイズしておく)
・読めるのはRawVideoだけでいい(MediaCoderで事前に無圧縮フォーマット”.yuv”に変換しておく)
・極力ファイル容量を抑える

バイナリエディタを見ながら実装。BZのビットマップ表示機能がとても便利。


また、閾値の調整にMPCのシェーダー機能を利用していた(気がついたらHSLSがちょっとだけ書けるように・・・)のですが、もともと二値な動画以外は極端に見栄えが悪いことに気が付きました。というか何が映ってるのかよく分かりません。
輪郭抽出して描画させれば良いかな・・・? ということで輪郭抽出はまずHLSLで調整して、Cで実装します。

余談 :
二値の動画がどんな感じか見てみたい人は、下記コードをメモ帳に貼り付けて、1bpp.hlslというファイル名で"C:\ #MPCのインストールフォルダ# \MPC-HC\Shaders"に保存。オプション→再生→シェーダの画面でリサイズ後のシェーダに1bppを追加すると雰囲気が味わえます。
/*1bpp.hlsl*/
sampler s0 : register(s0);
float4 main(float2 tex : TEXCOORD0) : COLOR
{
 float4 c0 = tex2D(s0, tex);

 if (c0.r+c0.g+c0.b < 1.5) {
  c0 = float4(0, 0, 0, 0);
 } else {
  c0 = float4(1, 1, 1, 0);
 }
 return c0;
}


輪郭抽出

フィルタは一次微分(Roberts)を利用。
アルゴリズムとそれに与えるフィルタ(行列)が複数あり、二値化時の閾値も適切に決める必要がありますが、チューンは未定。
極端に低解像度の状況でのアルゴリズムは何が良いのでしょうか。

輪郭の細線化

抽出した輪郭をそのまま二値化すると線が太いことがあります。ですので、細線化(Thinning)を施します。アルゴリズムは、Hilditchですが、これももう少し詰める余地がありますね。

5LPへの移植

今までPSoC 4で開発していたのですが、SD_Card ComponentのUnsupportedな感じがプンプンします。サンプルはあるのですが、Creatorのdefaultに入ってませんし。
不穏だったので5LPへ移行。移植自体はスムーズに進みました。メモリもフラッシュも多く、配線の自由度も高いので非常に楽でした。


・・・弊ブログ、電子工作ブログになりつつあるので、そろそろGamingしていきましょうか。

0 件のコメント:

コメントを投稿