Bakulog

獏の夢日記的な何か。

【小ネタ】M5Stackを多視点表示に使ってみる

「ちょっと作ってみました」的な内容です。

 

もくじ

  1. はじめに
  2. 必要なもの
  3. 作り方
  4. 知見とまとめ

 

1. はじめに

成果物はこちらの動画のツイートです。

 

いわゆる多視点表示とかレンチキュラーと呼ばれますが、上記ツイートのレベルだと見る向きで色が変わるシールと言っちゃった方がイメージしやすいですね。

本記事ではコレを作る流れを大まかに紹介します。

 

2. 必要なもの

物理的に必要なもの

  • M5Stack
  • Micro SDカード
  • レンチキュラーレンズのシート
  • SDカードが読み書きできる、M5Stackの開発用PC

手元ではM5Stack Basicを使っています。M5Stickだと画面サイズ的にしんどいと思います。

なお、レンチキュラーレンズのシートがどこで買えるかは私は知りませんハッカソンの参加賞で貰ったからです。

lookingglass.connpass.com

  

物理的ではない必要なもの

  • M5Stackの開発環境
  • 画像処理できる何かのソフト
  • レンチキュラーレンズの基礎知識

M5Stackの開発環境はググれば見つかるので省略します。

画像処理についてはOpenCVとか使うのが良いですが、今回は簡単な使い方なので、ビットマップ操作が出来れば最悪どうにかなります。

レンチキュラーレンズの基礎知識は下記などで勉強できます。

docs.google.com

 

なお上記資料はLooking Glass勉強会というイベントの資料です。

Looking Glassをもし知らない方が本記事を読んでいたら、こちらもあわせてご覧下さい。

 

3. 作り方

まずM5Stackの開発環境を整えて、ハローワールドとか、SDカードに画像ファイルを入れて表示できる事をチェックします。ここは多視点とあまり関係ないので基本割愛しますが、一点だけ注意を。

 

本記事で紹介している実装ではArduino IDEを用い、画像表示にM5.Lcd.drawJpgFile関数を使っています。手元環境ではM5.Lcd.drawBmpFileを試してもうまく動きませんでした。

 

なぜdrawBmpFileが動かなかったのかは詳細まで調べていませんが、もしメモリ起因の問題なら深追いしても仕方ないかな?と、一旦諦めています。

 

ともかく、今回は絵を出せればいいので、M5Stackで最終的に使うArduino IDE上のコードはこうなりました。開発環境が違う場合は適宜読み替えて下さい。

#include <M5Stack.h>

void setup(){

  M5.begin();
  M5.Lcd.clear();
  M5.Lcd.drawJpgFile(SD, "/lenna_cat.jpg");
}

void loop() {
  M5.update();
}

 

ここからが本記事に特有の実装ステップです。

 

まずレンチキュラーレンズを貼ります。M5Stackの場合、レンズの向きが液晶画面に対して真っすぐタテになるよう貼れます。

f:id:baku_dreameater:20190709221215p:plain

先ほど紹介した参考資料では「レンズはふつう斜めに貼る」とありますが、M5Stackの表示方式ではレンズがタテになっててもOKです。また、レンズの表裏についてはPC画面の白い所にあててRGB縞が出る当て方が正しいです。

f:id:baku_dreameater:20190709221217p:plain

恥ずかしい話ですが、私は最初しばらくレンズの表裏を間違えて「あれ?うまく映らないな~」ってやってました…。

 

無事にレンチキュラーレンズを貼ったら、適当に2枚の画像を用意します。今回はlennaと猫のフリー写真を使いました。

f:id:baku_dreameater:20190709221751j:plain

f:id:baku_dreameater:20190709221803j:plain

M5StackのLCDが320x240なのでサイズを合わせてあります。手法的には絵が3枚以上あってもいいですが、最初は2枚で表示がキレイになるところをゴールにすると無難です。

 

これらの画像は横方向に縮めて短冊状にブチブチ区切り、並べ直すことで合成します。具体的なコードは割愛しますが、操作イメージとしてはlennaをこうして

f:id:baku_dreameater:20190709223958p:plain

猫をこうして

f:id:baku_dreameater:20190709224058p:plain

二つを合わせるだけです。最悪手作業でも出来ますが、時間がかかるのでオススメしません。

f:id:baku_dreameater:20190709224113p:plain

短冊状にする部分の太さは下記のように、各画像のブツ切りがすべて1回ずつ出てくるピクセルの幅と、レンズの幅が一致するように合わせます。

f:id:baku_dreameater:20190709224856p:plain

数値の例を出すと、手元のレンチキュラーレンズではレンズのピッチが0.9mmだったので

みたいな計算でピクセル数が求まります。したがって2枚の画像を合わせるなら、例えば4ピクセルと3ピクセルの短冊状に区切って順番に並べれば7ピクセル幅となり、だいたいOKです。

 

ただし、これでも数値がまだ少しズレているため、いわゆる「うねり」が観察できます。

f:id:baku_dreameater:20190709230949p:plain

ふたつの画像が交互に見えちゃってますね。うねりが見えるのは調整がほぼあっている証拠でもあります。

 

この後は画像全体をちょっとずつ横に伸縮したものを入れてみて、ピッタリ来る値を探すことで、キレイに見える絵が得られます。この状態が、冒頭でツイートした下記動画の内容です。

 

4. 知見とまとめ

最初は「M5Stackの解像度だと厳しいかな?」と思っていたのですが、M5Stackが192DPIあるので思ったよりは行けそうなことが分かりました。

静止画や低FPSな動画でも見栄えがするので、M5Stackと相性がよい使い方だと考えられます。

 

ただ、多視点にチャレンジしてみた本来の動機としては「M5Stackで裸眼立体視って出来るかな?」という所からスタートしているので、せっかくなら立体視っぽい所まで進めたいと思っています。

立体視らしい所まで漕ぎつけたらまた記事になるので、続報にご期待下さい。