Raspberry Pi3とPicameraでリアルタイム顔認識

Raspberry Pi3とPicameraを使ってリアルタイム顔認識・画像上書きを行ってみた。

内容はもう出尽くした感がありますが、PythonOpenCVを使っています。

いろんなサイトを見てはコピペ実行で作ったのでわからないまま作ってしまったのですが、

コメントを入れながら1行ずつ理解した感じです。

# coding:utf-8

import io
import picamera
import cv2

import numpy as np

# HAAR分類器の顔検出用の特徴量
cascade_path = "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"

# カスケード分類器の特徴量を取得する
cascade = cv2.CascadeClassifier(cascade_path)

stream = io.BytesIO()

CAMERA_WIDTH = 320
CAMERA_HEIGHT = 240

color = (255,255,255)

camera = picamera.PiCamera()
camera.resolution = (CAMERA_WIDTH, CAMERA_HEIGHT)

laugh = cv2.imread('laughingman.png', -1)  # 画像の読み込み。-1でアルファチャンネルを付けて読む
mask = cv2.cvtColor(laugh[:,:,3], cv2.cv.CV_GRAY2BGR)/255.0  # 画像からアルファチャンネルだけを抜き出して0から1までの値にする。あと3チャンネルにしておく
laugh = laugh[:,:,:3]  # アルファチャンネルを消したもの

while True:
        camera.capture(stream, format='jpeg')
        data = np.fromstring(stream.getvalue(), dtype=np.uint8)
        image = cv2.imdecode(data, 1)
        cv2.imshow('image',image)
        cv2.waitKey(16)

        # グレースケール変換
        image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)

        # 物体認識(顔認識)の実行
        # image – CV_8U 型の行列.ここに格納されている画像中から物体が検出されます
        # objects – 矩形を要素とするベクトル.それぞれの矩形は,検出した物体を含みます
        # scaleFactor – 各画像スケールにおける縮小量を表します
        # minNeighbors – 物体候補となる矩形は,最低でもこの数だけの近傍矩形を含む必要があります
        # flags – このパラメータは,新しいカスケードでは利用されません.古いカスケードに対しては,cvHaarDetectObjects 関数の場合と同じ意味を持ちます
        # minSize – 物体が取り得る最小サイズ.これよりも小さい物体は無視されます
        # facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=3, minSize=(10, 10), flags = cv2.cv.CV_HAAR_SCALE_IMAGE)

        facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

        image_output = image
        if len(facerect) > 0:


                # 検出した顔を囲む矩形の作成
                for rect in facerect:

                        # 画像のサイズ調整
                        rect[0] -= min(25, rect[0])
                        rect[1] -= min(25, rect[1])
                        rect[2] += min(50, image_output.shape[1]-(rect[0]+rect[2]))
                        rect[3] += min(50, image_output.shape[0]-(rect[1]+rect[3]))

                        # 笑い男とマスクを認識した顔と同じサイズにリサイズする。
                        laugh2 = cv2.resize(laugh, tuple(rect[2:]))
                        mask2 = cv2.resize(mask, tuple(rect[2:]))

                        # 笑い男の合成。
                        image_output[rect[1]:rect[1]+rect[3], rect[0]:rect[0]+rect[2]] = laugh2[:,:] * mask2 + image_output[rect[1]:rect[1]+rect[3], rect[0]:rect[0]+rect[2]] * (1.0 - mask2)
        cv2.imshow('image_out',image_output)
        cv2.waitKey(16)

        stream.seek(0)

        if cv2.waitKey(10) > 0:
            break

cv2.destroyAllWindows()

参考にさせていただいたサイトはこちら。 そのまんまのコピペで動きました。ありがとうございました。 peaceandhilightandpython.hatenablog.com

pythonのOpenCVでリアルタイムに笑い男 - BlankTar


結果はこちら! f:id:tomtech:20170603161049p:plain

思った通りの内容でした。 横顔の認識は今回読み込んだライブラリではできなかったです。

攻殻機動隊SAC笑い男の書き替え技術スゲーなーとあらためて思ったり・・・

HAAR分類器とかカスケード分類器とかまだまだわかっていない部分が多いですが、 これから中身を見ていきます。

Mac Safariで画像が表示されない件

いつの頃からかMacSafariでサイトを見た時に画像が数個表示されないときがあった。

 

再読込すれば見れたり、キャッシュを削除してみたりしたけど、

Chromeだと正常に表示出来たりする。

 

なんだろうと思いながらだましだまし使っていたけど、

どうにも我慢できなくなって調べたら、

グローバルサインのルート証明書が一時的に失効して2016/10/7の証明書失効リスト(CRL)を、

OSCPのデータベースに取り込んだのが原因とのこと。

 

要はその画像の元が失効しているとして表示できなかったということなのでした。

復旧コマンドはOSCPのキャッシュを削除するというもの。

OS X Sierraの場合、ターミナルを開いて以下を実行する。

sqlite3 ~/Library/Keychains/*/ocspcache.sqlite3 'DELETE FROM ocsp;'

 

ばっちり画像が表示されるようになった。

 

元記事

it.srad.jp

support.globalsign.com

Andriod O のwi-fiデザリングは5GHz帯 NGか

調子に乗って、手持ちのNexus5xをAndoroid NからAndroid O Developer Previewにアップデートした。

 

バッテリーの持ちは良くなったような気がする。

 

 

たまにiPadと組み合わせてwi-fiテザリングを使ったりするのだが、

wi-fiアクセスポイントをタップすれども起動せず。

 

 

どうしたもんかなーと思っていて、ふと「wi-fiアクセスポイントをセットアップ」の「AP帯域幅」を

2.4GHzに変えたらwi-fiアクセスポイントが起動。

 

問題なく接続できました。

正式版ではもちろん修正されていると期待。

 

【追記】

Bluetoothテザリングは全く問題なかったです

 

 

Android O Developer Previewの壁紙は地球。なかなかGood。

f:id:tomtech:20170526145224j:plain

Raspberry PiにMacからVNC接続

Raspberry PiRealVNCを起動させて、MacからVNC接続するとエラーになる。

f:id:tomtech:20170523175905p:plain

 

Chrome VNCだと接続できるのでなんだろな~と思っていて、

どうしてもMacの画面共有(Finderでcommand+k)で接続したくなったのでちょっとだけ調べた。

どうもMacの画面共有はパスワード認証で通るようなので、パスワード認証(VNC Password)に設定。

Unix認証だとそもそもユーザが一致していないので)

f:id:tomtech:20170523175846p:plain

 

これでMacからも接続OK。

Mac SafariとChromeのキーボードショートカット

MacでのSafariChromeのキーボードショートカットを何回やってもど忘れしてしまうのでメモ。

キー 内容
command-T 新たなタブを開く
command-W タブを閉じる
command-L アドレスバーにフォーカスを移す
command-Return アドレスバーのURLを新たなタブに複製

タブを複製することがよくあるので、 キーボードショートカットで出来ると便利。

OS X が起動しないときの対処

長期の連休明け、大体何かの不具合があることが多いなぁと思いながら、

PCから目を離したら、画面がグレーになっていた。

ここ何日かそういうことがあって、マウスもキーボードも反応しないので、

電源ブチ切りで強制電源OFF、電源ONをした。

いつもだと、起動してくるんだが、今日はやはりグレーに。

 

Mac mini 2011 Lateを使ってるんだが、起動時のアップルのロゴマークが、

グレーとレッドに半分の線が!(写真取れず)

ディスプレイを繋ぎ替えても変わらず、これはグラフィックボードがイカれたかなーと思いながら以下を実行した。

次に備えての備忘録。

 

1.SMCのリセット → NG

 SMC(システム管理コントローラ)をリセットすると改善する場合あり

 Mac の SMC (システム管理コントローラ) をリセットする - Apple サポート

  1. Macの電源コードを外す
  2. 15秒待つ
  3. 電源コードを電源に入れる
  4. 5秒待つ
  5. 電源を入れる

 

2.NVRAM,PRAMのリセット → NG

  NVRAMをリセットすると改善する場合あり

 Mac の NVRAM をリセットする方法 - Apple サポート

 Option + Command + P + R で電源を入れる

 

3.セーフモードで起動 → OK

 必要に応じてディレクトリの問題を修復するとか

 セーフモードを使って Mac の問題を切り分ける - Apple サポート

 

 

Command + R で TimeMachineから復元とか、新しいMacbook Proにしようかなーなんて考えていたけど、とりあえず復旧。

ログを見たらKernel Panicで落ちたのはあったけど、どうもそれが引き金のような・・・根本解決になってないなー。