Pythonで自動画面ロック

画面ロックをすっごい忘れる!!

社会人になって一か月、すっごい画面ロックを忘れる
むかつくので自動で画面をロックしてくれるシステムを作る(๑`^´๑)

ざっくりなシステムの流れ

  1. カメラで画像を取得する
  2. 画像から人を認識する
  3. 人がいなければ画面をロックする

実際のコード

1. 2. をモジュールにして、3. をGUIも含めてメインプログラムとします。

1. のカメラ画像を取得するプログラムです。
import cv2
import datetime
import time
def main(in_num):
    fileName ='pic.jpg'
    # 内蔵カメラのデバイスIDは0、USBで接続したカメラは1以降。
    capture = cv2.VideoCapture(in_num)
    time.sleep(2)
    # 取得した画像データは変数imageに格納。retは取得成功したらTRUE,失敗したらFALSE。
    ret, image = capture.read()

    if ret == True:
        cv2.imwrite('../inputs/'+fileName, image)# 取得した画像を出力。fileNameは出力する画像名。

    return fileName

撮った写真をpic.jpgに保存
time.sleep(2)はカメラ起動時間を確保しないとちゃんと撮れないっぽいので入れてる。

次は2.の画像認識の方のプログラム

上半身認識もできたけど、デスクの前にいることを想定すると顔でいいかなと思い顔認識にした
pic.jpgを解析します

import ctypes
import cv2

def main(pic_path):
    cascade_path = "../models/haarcascade_frontalface_default.xml"

    # 使用ファイルと入出力ディレクトリ
    image_file = pic_path
    image_path = "../inputs/" + image_file

    #ファイル読み込み
    image = cv2.imread(image_path)

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

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

    color = (255, 255, 255) #白

    # 検出した場合
    flag = 0
    if len(facerect) > 0:
        flag = 1
    return flag

if __name__ == 'main()':
    main()

画像を顔を見つけたら1,見つけられなかったら0を返します。
これは
https://qiita.com/FukuharaYohei/items/ec6dce7cc5ea21a51a82
こちらのサイトのコードを参考にしました。
感謝しかないです。

次は3.のGUIと画面ロックについてです。

1.の以下のコードでin_numはカメラの種類によって番号が変わると書きました

capture = cv2.VideoCapture(in_num)

なので、これを使う側で選択できるようにします。
あとは開始と終了のボタンをつけて終わり☆
以下、3.のGUIと画面ロックのコード

import ctypes
import take_pic
import pic_analy
from time import sleep
import tkinter
import tkinter.ttk as ttk

def start_repeat():#人がいるかどうかを判定
    if combx.get():
        in_num = 0
    elif combx.get():
        in_num = 1
    elif combx.get():
        in_num = 3
    pic_path = take_pic.main(in_num)
    result = pic_analy.main(pic_path)
    if result < 1 :
        ctypes.windll.user32.LockWorkStation()
    Title.pack(side=tkinter.TOP)#ラベル表示
    window.after(1000, start_repeat)

def close_window():#アプリ終了
    window.destroy()

#--ウィンドウ表示--
window = tkinter.Tk()
window.title('画面自動オフ')
window.geometry('250x100+0+0')
#-----------------

#--実行中のラベル表示--
Title = tkinter.Label(window, text="実行中", font=("MSゴシック", "15", "bold"),fg='Red')
#--------------------

#--カメラ選択--
module = ('備え付けカメラ','USBカメラ1','USBカメラ2')
combx = ttk.Combobox(window,values=module,state="readonly")
#-------------

#--開始ボタン--
s_button = tkinter.Button(text = "開始", 
                   command = start_repeat)
#-------------


#--終了ボタン--
e_button = tkinter.Button(text = "終了", 
                   command = close_window)
#-------------

combx.pack(side=tkinter.TOP)#選択ボタン表示
s_button.pack(side=tkinter.TOP)#開始ボタン表示
e_button.pack(side=tkinter.BOTTOM)#終了ボタン表示
window.mainloop()

resultに解析結果が返ってくるので、resultが0なら人がいないと判断し画面をロックします。
start_repeat関数の中で画像を撮って解析しています。
また、start_repeat関数中にafter関数を用いてstart_repeat関数を実行することで、指定の間隔で画像を撮って解析しています。(再起処理)

ちなみに、画面ロックは簡単に以下のコードで実行できます。

import ctypes
ctypes.windll.user32.LockWorkStation()

感想

初めてのブログだったので読みにくかったと思います。すみませんでした。。。
また何かしたら書こうかなと思います(備忘録的に)