OpenCVでのオーバーヘッドの少ない静止画像撮影方法

はじめに

Amazon Rekognition を使った顔認識システムを検討しています。

  • Raspberry Pi 3 とカメラモジュールと OpenCV を使う
  • USBで接続したキーボードのEnterキーを押したら撮影
  • ASWへのリクエストで1秒程度必要になるので、撮影に要する時間はなるべく短く

シャッターボタン(Enterキー)を押してから画像データを取得するまでの遅延をなるべく小さくするためには、OpenCVでの処理にある程度のコツが必要なことが分かったのでこの記事にまとめてみました。

Raspberry Pi の準備

  1. Raspbeian Buster with desktop をインストール
  2. raspi-config を起動して Interfacing Options → Camera で カメラインタフェースを有効化
  3. apt-get install python-opencv

ダメダメな例

最初にうっかり書いてしまったバージョンです。
raw_input で入力待ちをして、入力があれば VedeoCapture オブジェクトを生成して read で画像を1枚読み込む、という処理を無限ループします。 一応動きますが、毎回 VideoCapture を作っているので遅い(キー入力から画像取得まで1秒弱)です。
さらに、後述の通り2回目以降正しく動作しません。

ダメな例

ループの外で VideoCapture を生成して使い回すようにしました。VideoCapture生成処理の分(0.4秒程度)早くなりました。
ただし、上のダメダメな例でもそうでしたが、2回目以降のシャッターは正しく動作しません。

  1. 顔をカメラに向けた状態で起動
  2. キー入力する
  3. 顔が写った画像が記録される
  4. 顔をフレームから外す
  5. キー入力する
  6. 顔が写った画像が記録される

といった具合です。2回目以降はキー入力された時点の映像がキャプチャされません。

正しいキャプチャの方法

VideoCapture を使うサンプルコードは世に溢れてますが、そのほとんどは動画のすべてのフレームを漏れなく処理するには、のようなパターンで、処理をブロックしておいて何らかのトリガで1枚だけキャプチャをするという今回のような使い方はあまりしないようです。
改めて VideoCapture の仕様を調べてみると、フレームレートに応じた頻度で read を呼び出して VideoCapture 内部のフレームを進めないと、過去のフレームを読み込んでしまうことになるようです。要するに、ダメな例のコードでは read の回数が少なすぎた訳です。

したがって、以下のような動作が必要になります。

  1. 適切なウェイト(50msec程度)を入れつつreadを繰り返し実行
  2. キー入力が発生したら最後に読み込んだ画像をメインの処理に渡す

こういう場合の定石は cv2.imshow して cv2.waitKey でタイムアウト有りのキー入力待ちをすることです。タイムアウトを50msecに設定すれば、キー入力が無ければ50msec毎に cv2.read を実行できます。

もっと動作を軽く

上の定番のやり方の場合、imshowするのでそれなりにCPU負荷が掛かります。カメラに映っている映像を表示しなくても良い用途のためにもっと軽い方法も欲しくなります。

select を使ってタイムアウト付きキー入力関数を自前で用意しました。

おわりに

imshowとwaitKeyを使う版だとほとんど何もしていないときでもCPU使用率が20%強になりますが、動画表示しない版だと3%程度まで抑えることができました。また、プログラムの構成上キー入力の前に画像読み込みが終わっているので、処理の遅延をなるべく小さくという意味でも非常に良いものになっています。

ハイスタがサブスクはじめるってよ

音楽って本当にいいですね。
マエダです。

僕らの青春時代を支えてくれたあのHi-STANDARDさんが各主要ストリーミングサービスで全楽曲を開放してくれましたよ!

https://music.apple.com/jp/artist/hi-standard/36223467

※ ハイスタと関係のない画像

ハイスタといえば名曲だらけです。
『Maximum Overdrive』のイントロ聴いたらアガる。
『Summber Of Love』とか『Saturday Night』とか最高すぎますね。
(『Growing Up』多め)

 

そういえば元ZOZOの前澤さんの「スタートトゥデイ」という社名はハイスタの『START TODAY』からなのかなーって思ったら全然違いました。

https://ja.wikipedia.org/wiki/ZOZO

ゴリラ・ビスケッツさんの同名曲が由来とのこと。(豆知識)

 

僕は高校生のときに『New Life』のイントロベースを練習したなぁとしみじみ。

といいつつ僕はハイスタのコピーバンドはしていませんでした。
同級生の中でもイケてるヒトたちがコピーしていました。

僕は『セクシーコマンドー外伝 すごいよ!!マサルさん』が好きすぎてアニメの主題歌だった当時ビジュアル系バンドと呼ばれるPENICILLINのロマンスを友だちの家で練習していました。(黒歴史)

ギター、ベース、キーボードだけのバンド。
ドラムもボーカルもいないけど楽しかった思い出。
※ どんな曲か気になる方はYouTubeとかで探してみてください。^^

 

楽器といえば最近ドラムをしてませんが、僕の趣味の欄は「ドラム」にしておきます。

※ 僕の趣味はだれがなんと言おうと「ドラム」

趣味「ドラム」の僕のハイスタのプレイリストを置いておきますので、是非ハイスタをお供に最高の夏をお過ごしください!

https://playlist.surf/playlists/33968

[PR] ご視聴にはPLAYLISTとAppleMusicにてお楽しみください。

 

Hi-STANDARD 公式ウェブサイト: https://hi-standard.jp/

お家での過ごし方

こんにちわ。
リエです。

突然ですが、外出自粛の中、皆さんお家でどんな過ごし方をしていますか?
私は最初こんなに時間があっても外に出れないのなら出来ることなんて限られてるやん(TдT)と思っていましたが、発想の転換で充実した過ごし方をできるようになりました。
ということで、私のお家での過ごし方を今回はご紹介したいと思います🏠

その1.お家カフェ☕

私はカフェでお茶するのが大好きなのですが、今は行けません;;
お家でカフェ気分を味わえないかなと考え、色々工夫してみました。
最近作ったもの↓↓

ダルゴナコーヒーは韓国で話題のドリンクで、牛乳の上に「インスタントコーヒー」「砂糖」「お水又はお湯」を等比率で泡立ててホイップ状にしたものを冷たい牛乳の上に乗せたドリンクです。

〈材料〉
・インスタントコーヒー 大さじ2
・砂糖 大さじ2
・お水又はお湯 大さじ2

〈作り方〉
1.材料を全てボウルの中に入れる
2.泡立て器でホイップ状になるまでひたすら泡立てる
3.コップに牛乳を入れその上にホイップしたコーヒーの乗せる

〈アドバイス〉
・材料はきちんと計量しないとうまく泡立たないので、ご注意ください。
・泡立て器を使うと大変みたいなので、ハンドミキサー推奨。
私はミルクフォーマーを使いました。
・混ぜるとき、結構飛び散るので深いボウル推奨。

めっちゃ簡単です!
前に大さじ2で作ったとき、甘すぎるなと感じたので私は材料を大さじ1にしています。なので泡のボリュームが少ないです( ;∀;)でも材料を大さじ2にすれば、牛乳8:コーヒー2になり見た目は断然きれいになると思いますので、甘い飲み物大歓迎💕という方は大さじ2で作ってみてはいかがでしょうか。
ちなみに飲む時はストローで飲むことをおすすめします🌟

フレンチトースト大好き芸人なので普段からよく作るのですが、いつも適用に卵液を作ってしまいます。でも今は時間があるので美味しいフレンチトーストを作ろう!と思い話題になっていたホテルオークラさんのレシピで作ってみました。
レシピ🍴
ホテルオークラ特製フレンチトースト
※バニラエッセンスはなかったので入れませんでした。

フワフワの美味しいフレンチトーストができました🍞
食パンは厚切りでパン耳を切るのですが、どれだけ違うのか比べてみたくて、半分をパン耳ありにもう半分をパン耳なしで作ってみました。
確かにパン耳がない方がフワフワ感を存分に味わえるので、これからはパン耳なしで作りたいと思います。(切ったパン耳は美味しくいただきました)

もうひとつ気になっているフレンチトーストのレシピがあるので、こっちも早く作ってみたい!
https://macaro-ni.jp/88874

その2.お家ライブ🎤

コロナの影響でたくさんのアーティストさんのライブが延期になったり中止になっていますよね。
悲しいなぁっと思っていましたが、私にはこれがある!ということで持っているRADWIMPSさんのライブDVDでお家ライブをすることに♫

臨場感を出すためにTVとスピーカーを繋いで音質をよくしたのですが、もう最高で約2時間のライブを存分に楽しむことができました。
実際のライブのように飛び跳ねたり大声で歌ったりはしませんが、手を振って全力口パクで楽しみました。(※やばい人ではありません)
欲を言うとプロジェクターに繋いで壁に映すとより楽しめると思うので、配線してプロジェクターで映せるようにしたいと思います。

3.デジタル旅行

今は旅行も行けません☓
でも大好きなYouTuberさんのVlogを見てデジタル旅行した気分になっています✈
後は、旅行へ行けるようになった時に着るお洋服や靴などをネットで探したりするのも旅の準備気分を味わえて中々高まります👗

というような感じで、「○○できない」ではなく「〇〇したいからこうやってみよう」と思うとお家時間も充実してくるんじゃないかなと思います。
今はインターネットでオンライン飲み会ができたり、好きなアーティストさんのライブが見れたり旅気分を味わえたりと恵まれた環境だと思います。
様々な企業様が本来有料サービスであるものを無料で提供してくださっているので、それも活用させていただいております。
工夫すればもっと色々な事が実現できると思うので、さらなるお家時間の充実を目指し楽しみたいと思います\(^o^)/

誰でもできるプログラミング

こんにちは。開発担当のマットです。

以前も言ったことがありますが、開発はとても楽しい仕事です。
PCに文字を打ち込むだけで、コンピュータがその指示を従って、面白いものを生み出せます。

でも、一度もプログラムを書いたことがない人は、どこから始まればいいかわからないでしょう。私も長いこと、プログラムの書き方を一切わからなくて、不思議な魔法のようでした。

それで、誰でもすぐに作れるプログラムを紹介したいと思います。

必要な準備

多くのプログラミング・プロジェクトに特殊な言語やコンパイラーのインストールが必要です。今回は、めっちゃ簡単に、ブラウザーとテキスト・エディター(メモ帳など)さえあれば、動くJavaScriptのプログラムを作ろうと思っています。

つまり、特に必要な準備はありません。

始めましょう〜

まずは、テキストエディターを開いて、「Hello」を書きましょう!
終わったら、program.html として保存しましょう!
保存先はどこでもいいです。デスクトップでも問題ありません。

HTMLファイルなので、ダブルクリックすると規定のブラウザーで開かれるでしょう。私の場合、Chromeで「Hello」が表示されます。

これはプログラム?

いや、今やったことは(とても簡単な)ウェブページの作成です。
動的な内容を出力する何かを開発しないと、「プログラム」と呼べないでしょう。

では、それを作りましょう!
現代のブラウザーは JavaScript という言語を解釈する能力を持っています。
Helloの後ろに、Javascriptのコードを書く部分を定義しましょう!これはHTMLタグというものでできます。

書き方は簡単です。
Javascriptのコード部分の開始は <script> で定義する。
Javascriptのコード部分の終了は </script> で定義する。

なお、コード部分にアラートを出す処理を入れましょう!
Javascriptでは、 alert(‘ホゲホゲ’); でできます。 

先程のファイルに以下を書きましょう〜

Hello
<script>
    alert('こんにちは!');
</script>

保存して、ブラウザーをリロードすると、アラートが表示されます!

やった!なんか動き出しましたよ!

基礎の準備ができ、初めてのスクリプトを書きましたので、面白いものを作りましょう!

スプラウティモン

せっかく、スプラウト株式会社のブログなので、スプラウティモンという、モンスター・ゲームを作りましょう!
150匹のモンスターがいて、全部集めることが目標!

150匹のモンスターの名前を決めなければならないことが面倒ので、プログラムで自動にやりましょう。こうやってします。

  1. スプラウティモンの名前のパーツを手動で決める。
  2. 名前のパーツを適当に組み合わせて、名前を作り出す。
  3. その名前をページに出力
  4. それを150回繰り返します。

よっし!目標を設定しました。まずは名前のパーツを手動で決めましょう。
プログラミングで、何かのコレクションを「配列」といいます。
名前のパーツのコレクションが必要ので、まずはpartsという配列を作りましょう。
言語によって、やり方が違いますが、Javascriptの場合は以下です。

Hello
<script>
	var parts = ['ほげ', 'ホゲ'];
</script>

「ほげ」と「ホゲ」で、あまりいい名前作れないので、「ファイヤ」とか「アイス」とかを勝手に決めて、面白さそうなリストを作りましょう。

Hello
<script>
	var parts = ['ファイヤ','アイス','ウィング','ライオン','イシ','デビル','ウルトラ','スーパー','デンキ','パワー','ブリザード','フラワー','ドラゴン','ロック','メガ','ワニ','ドロ','クマ','ヘビ','サメ'];
</script>

これでパーツを定義しましたが、プログラムで3つをランダムに組み合わせて、スプラウティモンの名前を決めましょう。

では、ランダムなパーツを選択する方法はちょっとややこしいですが、以下となります。

parts[Math.floor(Math.random() * parts.length)];

 これを完全に理解しなくてもいいですが、「parts配列の中から、最初から、最後までの中、どれかランダムなものを返す」という意味です。

alertで出してみましょう!

Hello
<script>
	var parts = ['ファイヤ','アイス','ウィング','ライオン','イシ','デビル','ウルトラ','スーパー','デンキ','パワー','ブリザード','フラワー','ドラゴン','ロック','メガ','ワニ','ドロ','クマ','ヘビ','サメ'];
	alert(parts[Math.floor(Math.random() * parts.length)]);
</script>

僕の場合、「メガ」が出ました。リフレッシュする度に、違う名前が出てきます。
ところで、アラートじゃなくて、直接ページに書き出す場合、「document.write」を使えます。それ使いましょう。なお、3つを組み合わせたいので、その行を3回書きましょう。

Hello
<script>
	var parts = ['ファイヤ','アイス','ウィング','ライオン','イシ','デビル','ウルトラ','スーパー','デンキ','パワー','ブリザード','フラワー','ドラゴン','ロック','メガ','ワニ','ドロ','クマ','ヘビ','サメ'];
	document.write(parts[Math.floor(Math.random() * parts.length)]);
	document.write(parts[Math.floor(Math.random() * parts.length)]);
	document.write(parts[Math.floor(Math.random() * parts.length)]);
</script>

すると、

なんか面白いですね。
7才の息子に聞いたら、100点満点で「100点」の名前だそうです!(笑)

どうやって150回?

プログラミング言語でループを書く事ができます。
ループとは、何かの作業を繰り返す時に使うものです。
Javascript では、以下のように書きます。

for (i = 0; i < 150; i++) {
    //150回実行したいコード
}

「Hello」をもっと適切な言葉に変えて、
各スプラウティモンの名前の前に改行(HTMLで「<br />」と書く)も入れましょう!

名前のパーツを150回も定義する必要はないので、ループの外で問題ありません。

すプラウティモンのリスト!
<script>
	var parts = ['ファイヤ','アイス','ウィング','ライオン','イシ','デビル','ウルトラ','スーパー','デンキ','パワー','ブリザード','フラワー','ドラゴン','ロック','メガ','ワニ','ドロ','クマ','ヘビ','サメ'];
	for (i = 0; i < 150; i++) {
		document.write('<br />');
		document.write(parts[Math.floor(Math.random() * parts.length)]);
		document.write(parts[Math.floor(Math.random() * parts.length)]);
		document.write(parts[Math.floor(Math.random() * parts.length)]);
	}
</script>

こうすると・・・・

できました!おめでとうございます!
プログラムを書くことに成功しました。

まとめ

今回、とても簡単なプログラムを紹介しました。
よく考えたら、重複の名前がでてくる可能性もあり、「ドロドロドロ」のような変わった名前も出力されるかもしれません(確率が低くても)。
プログラマはこういうことを考慮して、プログラムを柔軟に作らなければなりません。

とても楽しい仕事で、今後も多くのプログラムを作るチャンスを楽しみにしています。

リモートワークをしてみてのいろいろ

こんにちわ。
リエです。

新型コロナウイルスの感染拡大を受けて、#StayAtHome の毎日ですが、現在弊社は完全リモートワークを実施しております。
オフィスではなく在宅で仕事をするということで、仕事をする環境はかなり変わりました。
ということで、リモートワークをしてみて思ったことや気づいたことなどを今回は書いていきます。

そもそも家で仕事ができるのか

はっきりいうとリエ家は仕事に適した環境ではありません。
お家ではリラックスできるようにしているので誘惑がたくさんあります。当たり前ですが、普段は会社に行って仕事をしているので仕事用のデスクもなければイスもない。
数時間であれば仕事できますが、まる1日、それも数ヶ月となると色々弊害がでてきます。
ということで、快適にお家で仕事ができるよう工夫することにしました。

お家で快適に仕事ができるよう工夫したこと

このGoogleさんの記事を参考にさせていただいたのですが、
■上手な「在宅勤務」のコツ
https://cloud.google.com/blog/ja/products/productivity-collaboration/make-work-from-home-work-for-you

私はお家で快適に仕事ができるよう以下のことを実践しました。
・生活リズムを崩さないよう、会社に行くときと同じ時間に起きる
・メンバーに会わないとはいえ、メイクも普段通りきちんとする
・ついつい楽な服装をしてしまいがちだが、普段通りの服を着る
・アクセサリーをつける
・面倒で水分を取らなくなるので、500mlのステンレスマグにお水を入れてPCの横に置く(これはむくみ対策にもなる)
・仕事前にラジオ体操第一・二をして身体を動かし、頭を仕事モードにする。
・1時間に1回は立ち上がり身体を伸ばす。

誰にも合わない日って日焼け止めだけでメイクしないんですよね。。(女性あるあるだと思ってる)服もお家だとラクなパンツとかになっちゃってスカート履かないし。でもそれだと気持ちがシャキっとしないので、誰にも会わないとはいえアクセサリーもつけて背筋を伸ばすことは大事だなと思いました。

あと意外とよかったのが、仕事前にラジオ体操第一・二をすることです。
これはメンバーがSlackでラジオ体操がいいよと書いてたのを見て始めたのですが、私は超低血圧で通勤中に寝ぼけた頭を起こしていたので、ラジオ体操をして身体を動かすことで目が覚め頭を仕事モードに切り替えることができました。

リモートワークで気づいた良いこと

リモートワークしてて気づいた良いことがたくさんあります。
・通勤時間がないのでゆっくり朝ごはんが食べれる
いつも時間なくて食べない日も多かった。

・通勤のストレスがない
これはリモートワークされている方がよく言われていることですよね。

・マスクをしないからリップメイクが楽しめる
外へ行くときは必ずマスクをしているので、リップメイクが楽しめませんでした。でもお家だとマスクをしないので好きにリップメイクできるのが嬉しい。

・カラーメイクができる
メイクネタが続きますが、普段会社に行くときは塗らないアイシャドウが塗れるのが楽しいです。※会社に禁止されているわけではありません。
メンバーとの打ち合わせの時はGoogle Meetを使うのですが、PCカメラはそんなに解像度が高くないので問題なし\(^o^)/むしろ解像度が高くないのでしっかり目にカラーを乗せないと顔色がゾンビです。

・マスクでの肌荒れが減った
毎日マスクをしていると肌荒れませんか?私はマスクの肌荒れにすごく悩まされています(TдT)でもマスクをする頻度が減ると肌荒れの治りも早い気がします。

・日焼けをしない
女性の大敵、日焼けをしないというのは大きなメリットだと思います。


そしてリモートワークになって1番思ったことは、[会社は本当に快適な仕事環境を作ってくれていたということ]です。
普通に思っていたことが普通じゃなかったんだなとしみじみ感じております。
そして国は企業にリモートワークをお願いしていますが、リモートワークができず外で仕事をしている方はたくさんいらっしゃいます。
その方たちのおかげで、日々の暮らしが守られていることを痛感し感謝しかありません。
今自分にできることは体調管理に努め、不要不急の外出は控え#StayAtHome することなので、引き続きリモートワークでしっかりと仕事をしていきたいと思います。