Pythonで自動画面ロック
画面ロックをすっごい忘れる!!
社会人になって一か月、すっごい画面ロックを忘れる
むかつくので自動で画面をロックしてくれるシステムを作る(๑`^´๑)
ざっくりなシステムの流れ
- カメラで画像を取得する
- 画像から人を認識する
- 人がいなければ画面をロックする
実際のコード
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()
感想
初めてのブログだったので読みにくかったと思います。すみませんでした。。。
また何かしたら書こうかなと思います(備忘録的に)