マイコンあそび。

【M5StickV】カメラで認識した顔をオリジナル画像に差し替えてみよう!

2019年8月4日  2019年11月12日 

はじめに


M5StickVには OV7740 というカメラが付いていて、MaixPyで簡単にカメラ画像をLCDに表示させることができる。

M5StickVにはサンプルとして顔認識させるスクリプトがあって、顔と認識した枠を表示してくれるのだけど、その代わりにガイ・フォークスの画像を表示させる他愛もないオモチャを作ってみた。


解説

MaixPyには画像処理を扱う強力なImageモジュールがある。

その中の draw_image というプロシージャを使うと、好きな画像をM5StickVのLCDに表示させることができる。
image.draw_image(fimage, x, y[, x_scale=1.0[, y_scale=1.0[, mask=None]]])

引数のfimageにオリジナル画像のオブジェクトを設定して、maskはマスク画像をキーワード指定するわけだ。

この関数をどうやって使っていくかを説明する。


表示する画像の準備


ある意味、これがいちばんめんどくさいですね(^^;

表示する画像のオブジェクトはImageモジュールのコンストラクタで指定できるので
fimage = Image(path)
で読み出せる。pathはSDカードに保存してあるのであれば /sd/hoge.bmp といった具合だ。

公式の解説によると「Support image files in bmp/pgm/ppm/jpg/jpeg format.」となっているのだけど…bmpがなんだかんだで扱いやすいです。

そして、ただのbmpじゃなくて16ビット(RGB565)ビットマップファイルを作るといい。おそらくカメラ画像が16ビットからなんだろうけど、そうでないと上手く表示できないことがある。

16ビット(RGB565)ビットマップファイルを作るには、いろいろな方法があるけれど Linuxer御用達(笑)の「GIMP」というアプリを使うのが簡単だ。


GIMPを知らない方はすぐにググってダウンロードしてセットアップしておこう。まず損はしない。

例えば、ガイ・フォークスの画像をpngで手に入れることができたとする。pngはImageモジュールではサポートされていない形式なので、GIMPで開いて画像形式を変更しよう。



見てのとおり、たいへん小さい画像ファイルである…
ここから、「ファイル」→「名前をつけてエクスポート」すると、新たなダイアログが現れるので、エクスポートするファイルの形式を指定しよう。



Windows BMP 画像(*.bmp)」を選ぶ。

そうすると、またまたダイアログが現れて、ビットマップの詳細を指定できるのだ。


「詳細設定」→「16ビット」→「R5 G6 B5」を選んでエクスポートする。

ついでに マスク画像 を用意しよう。「マスク画像ってなんぞ?」という説明は割愛。要するに画像を重ねあわせるときに、背景画像を透過させるために必要な情報ですね。

MaixPyのImageモジュールの場合は二色指定で、黒が透過され、白色に重なった部分が描かれるようなので、


こんな画像を作って、同じように16ビットビットマップファイルに保存しておこう。


カメラ画像に上書きするぞ


ここまでできれば、あとは簡単。

MaixPyはカメラ画像を sensor.snapshot() で取得できるので、この上に draw_image で重ねあわせていけばいいわけだ。

つまり、こう。
front = image.Image("/sd/forks.bmp")        #ガイフォークスの表の顔
mask = image.Image("/sd/forksmask.bmp")     #ガイフォークスマスクのマスク(笑)

dsp = Image.Image()
img = sensor.snapshot()     # Take an image from sensor
dsp.draw_image(img,0,0) # カメラ画像をまず貼り付ける

<この間に顔認識画像の座標を獲得する処理を書く>

dsp.draw_image(front, x, y, x_scale=x_scale, y_scale=y_scale, mask=mask)


ね!簡単でしょう!?

他愛も無いプログラムだけど、好きな画像をLCDに映し出すって、うまくできたときに、ちょっと嬉しくなるし、プログラミングの面白さを感じやすいのですね!




ー記事をシェアするー
B!
タグ

コメント

Translate

テキスト大文字のデフォルトサイズ変更

人気の投稿