【M5StickV】カメラで認識した顔をオリジナル画像に差し替えてみよう!
はじめに
M5StickVには OV7740 というカメラが付いていて、MaixPyで簡単にカメラ画像をLCDに表示させることができる。
M5StickVにはサンプルとして顔認識させるスクリプトがあって、顔と認識した枠を表示してくれるのだけど、その代わりにガイ・フォークスの画像を表示させる他愛もないオモチャを作ってみた。
— 疲労コンパイラー (@phillowcompiler) July 28, 2019
解説
MaixPyには画像処理を扱う強力なImageモジュールがある。その中の draw_image というプロシージャを使うと、好きな画像をM5StickVのLCDに表示させることができる。
引数のfimageにオリジナル画像のオブジェクトを設定して、maskはマスク画像をキーワード指定するわけだ。
この関数をどうやって使っていくかを説明する。
表示する画像の準備
ある意味、これがいちばんめんどくさいですね(^^;
表示する画像のオブジェクトはImageモジュールのコンストラクタで指定できるので
公式の解説によると「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 で重ねあわせていけばいいわけだ。
つまり、こう。
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に映し出すって、うまくできたときに、ちょっと嬉しくなるし、プログラミングの面白さを感じやすいのですね!
コメント
コメントを投稿