プロジェクトKという名称で
ラズパイを使ってある事をしようと思います。
簡略な経緯

前回でラズパイとLINEを連携できるようにしました。

そして、いよいよ今回からプロジェクトの全貌を明かすとともに
プロジェクトを実行していきたいと思います。

何をするのか!?

コチラの記事にて
家のセキュリティの事について書いているのですが。
一戸建てだと、玄関の鍵を閉め忘れが、かなりのセキュリティリスクとなります。
子供がいるとなると、そちらに目が行ってしまい
意外と忘れることがあるのです。。

ということで、
ラズパイを使って、その玄関の鍵の締め忘れをチェックしたいと思います!

ちなみにプロジェクトKのKは=鍵のことでした。

ラズパイ設置

まず、ラズパイを玄関に設置します。
今の家では、鍵の前に下駄箱があり、そこに貼り付けました。
以下のはスマホで撮影
家に入りにくいと感じたことはないのですが、なぜこの位置に下駄箱を配置したのかは意味が分かりません。
ただ、ここに下駄箱があったことで、今回のプロジェクトを思いつきませんでした。

ラズパイについては、ガムテで汚くハリボテ満載で貼り付け。
以下のはスマホで撮影。

鍵の形状は以下となります。
以下のはスマホで撮影。

実行するpythonファイル設定

ここからはラズパイの設定です。
前回までの集大成です。
1. 比較用イメージを撮影しておく
2. ラズパイカメラで鍵を撮影する
3. 比較用画像と撮影画像を比較する
4. 比較値より条件に当てはまる場合、一定時間後にもう一度ラズパイカメラで鍵を撮影する
5. もう一度比較して条件に当てはまる場合、LINEで自分のアカウントにメッセージを送信する
6. 上記1~5までを一定期間で実行するようにする

としました。
1〜5までの処理を行うpythonファイルが以下となります。
match.pyとしました。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import cv2
import picamera
import requests
import time

# 比較元イメージを読み込む
okImage = cv2.imread("/home/pi/work/okImage.JPG",1)

def diff():
    # カメラでの撮影
    with picamera.PiCamera() as camera:
        # カメラでの撮影
        camera.resolution = (3280, 2464)
        camera.capture('/home/pi/work/taImage.JPG')
        taImage = cv2.imread("/home/pi/work/taImage.JPG",1)
        taImage = taImage[830:1110, 1070:1380]

        # 比較する
        try:
            orb = cv2.ORB_create()
            kpOk, desOk = orb.detectAndCompute(okImage, None)
            kpTa, desTa = orb.detectAndCompute(taImage, None)
            bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
            matches = bf.match(desOk, desTa)
            matches = sorted(matches, key = lambda x:x.distance)
            dist = [m.distance for m in matches]
            
            # 比較結果を出力する
            result = sum(dist) / len(dist)
            return result
        except Exception:
            return 99

result = diff()
if result < 54:
    time.sleep(10)
    resultSecond = diff()
    if resultSecond < 54:
        line_notify_token = '設定したLINEトークン'
        line_notify_api = 'https://notify-api.line.me/api/notify'
        message = '鍵開いてるよ'

        payload = {'message': message}
        headers = {'Authorization': 'Bearer ' + line_notify_token}
        line_notify = requests.post(line_notify_api, data=payload, headers=headers)

上記の補足をしていきます。

まず、作業フォルダは
/home/pi/work/
としています。

比較元イメージは先にラズパイで撮影していました。
こちらは鍵が開いている状態のものです。

比較値は今回は
54
としました。
この比較値を下回る場合、画像が近いことから
鍵が開いている
となります。

1回目のチェックから10秒後に2回目のチェックを行います。
2回目も比較値を下回ったら、LINEで自分のアカウントに通知するようにしました。
プログラムに関しては以上です。

次に6の処理を実装します。
実装にはcronライブラリを使用します。
ラズパイより以下コマンドを実行後、デフォルトは2となってますが、3を入力します。

$ crontab -e
no crontab for pi - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 

-> 3

#となってるコメント行の後の最後に1行追加しました。
今回は1分毎にmatching.pyファイルを実行するようにしました。

# Edit this file to introduce tasks to be run by cron.
....
# m h  dom mon dow   command
* * * * * python /home/pi/work/matching.py

以上で準備は完了です。
cron設定をした後から、すでに実行されています。

今回は以上です。

次回は実行編として上記の検証をしていきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です