G850V向け動画作成
144x48という横長のアスペクト比の動画はあまり世の中には出回っていないので 自作したり加工したりする必要があります。また、モノクロ2値画像で視認性 良く見える動画というのが、そもそも難しいです。
いろいろと苦労したのでメモっておきます。
動画加工
中間階調を出す方法として、フレーム方向あるいは空間方向のディザが挙げられます。 フレーム方向のディザは、黒と白を交互に点灯させることで灰色を表現する方式で、 空間方向のディザは、黒と白をXY方向に散りばめることで灰色を表現する方式です。
いろいろやってみたのですが、フレーム方向のディザはチラツキが気になりすぎてボツ、 空間方向のディザは解像度がたりなさすぎて物足りないためボツとなりました。
そうなると、素材からモノクロアニメなものがよいと思います。
素材作成
既存の素材を転用するのはいろいろと難しいので、基本は自作になります。
動画の内容にこだわらなければ、blenderで物理演算ベースの動画を作るのが一番手間がないと 考え、blenderを選びました。ただ、blenderはグレイスケールなものは作れますが2値画像は 対応していません。面をレンダリングすると微妙なグレイ階調が必要になりますが、上記理由で 諦めざるをえません。
そこで、ワイヤーフレームならどうにかなるのでは、と考えました。blenderでワイヤーフレーム動画を 作るにはいくつか方法があります。
- レンダリングをワイヤーフレームにする方法
- メッシュをワイヤフレームに変換する方法
- エッジに枠を付けて面を暗くする擬似的なワイヤーフレーム化
最初の2つはこちらで紹介されています。 画面の解像度が十分あれば、この2つの方法でだいたい達成できるのですが、なにぶん低解像度すぎるので、すべての ワイヤーを表示していると画面がごちゃごちゃしすぎて辛いかんじになります。
そこで、隠面処理を行ったワイヤーフレームならスッキリするのではと考えました。それを擬似的に達成するのが第3の方法です。 こちらで紹介されていました。
- レンダーの解像度設定
144x48にしておきます。その下の100%はデフォルトで50%となっていて解像度が半分になって出力されるので注意。
- レンダー設定
PNGのRGB 8bitにしておきます。Freestyleにチェック。線幅は様子をみながら調整したほうがよいです。
- レンダーレイヤの設定
Freestyleのクリース角度を179度にします。
- マテリアルの設定
シェーディングで陰影なし、透過でにチェックを入れ、アルファを0にします。
- ワールドの設定
背景を白にします。
以上の設定で、ほぼ二値で、かつ線が最小限という動画を出力することができます。つまり、
というシーンが、
というふうにレンダリングされます。
あとはこれを二値化して、LCDパターンに合うように縦8bitのバイト列に並べ替えます。 二値化済の画像ファイルを読み込んで、縦8bitのバイト列に並べ替えるコードは例えば下記です。 ファイルを読み込むだけにopencvを持ち出すのはちょっと大げさかもしれません。
def load_file(filename):
img=cv2.imread(filename)
img=img.astype(np.uint8)
if type(img)==type(None):
return None
sizex=144
sizey=48
dat=[]
for yi in range(sizey//8):
y=yi*8
for x in range(sizex):
d=0
for yl in range(8):
if img[y+yl,x,0]>0:
d|=(1<<yl)
dat.append(d)
return dat
if img[y+yl,x,0]>0:
の行の0を、たとえば127とかに変更すれば簡単な二値化も同時に行えますが 二値化は画像を見ながら丁寧に行ったほうが良いと思います。