一些高級的筆電上都會有一個眼球追蹤的裝置,當電腦沒有在用的時候會降低亮度,有人用的時候會恢復亮度,達到節電的目的。在這裏通過調用攝像頭,來識別電腦前是否有人,如果長時間沒有人就會通過wmi的方式,來降低屏幕亮度,當電腦前的人回來的時候,恢復亮度顯示。
打包後的exe文件鏈接:下載不要積分
首先,怎麼來判斷電腦前是否有人呢?在此採用opencv自帶的人臉分類器(忘了從哪裏看的了,如果作者看到請聯繫)
人臉 - haarcascade_frontalface_default.xml
其路徑一般爲
AppData/Local/Programs/Python/Python37/Lib\site-packages/cv2\data/haarcascade_frontalface_alt.xml
如果電腦前有人正視電腦的話,就會被檢測出來。
亮度的調節參考python設置筆記本屏幕背光亮度
代碼如下:
import wmi
c = wmi.WMI(namespace='root\WMI')
a = c.WmiMonitorBrightnessMethods()[0]
a.WmiSetBrightness(Brightness=80, Timeout=500)
其中Brightness爲亮度調節,在0-100之間調節,Timeout不需過度關心,時間調整。
調整代碼如下:
if num == 0:
if flag_1 > 5:
flag_1 = 6
print("\r",'檢測到人員離開,啓用低亮度',end="",flush=True)
a.WmiSetBrightness(Brightness=10, Timeout=5)
else:
flag_1 = flag_1 + 1
else:
flag_1 = 0
print("\r",' 正常運行 ',end="",flush=True)
a.WmiSetBrightness(Brightness=60, Timeout=5)
其中的num爲人臉數,flag_1爲一標誌位,如果有人的話flag_1=0,亮度正常,當電腦面前沒人經過一段時間之後,會觸發亮度調節,使之變暗,又當有人時,亮度恢復。
flag_1 = 6是爲了防止溢出,print前的"\r"是覆蓋,只輸出一行。
完整的代碼如下:
#coding:utf-8
from cv2 import cv2
import wmi
print("此軟件會獲取攝像頭用作分析,但不會發送出去,請放心使用。空格可退出")
cap = cv2.VideoCapture(0)
c = wmi.WMI(namespace='root/WMI')
a = c.WmiMonitorBrightnessMethods()[0]
face_detect = cv2.CascadeClassifier(r'c:/Users/liu\AppData/Local/Programs/Python/Python37/Lib\site-packages/cv2\data/haarcascade_frontalface_alt.xml')
flag_1 = 0
while True:
# 讀取視頻片段
flag, frame = cap.read()
if flag == False:
print("失敗")
break
# 灰度處理
gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
# 檢查人臉 按照1.1倍放到 周圍最小像素爲5
face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors = 5)
# 繪製圓形檢測人臉
num = 0
for x, y, w, h in face_zone:
num = num + 1
cv2.circle(frame, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2)
cv2.putText(frame, str(num), (x,y), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 1)
warn_dist = w//2
# 顯示圖片
cv2.putText(frame, "{}people".format(num), (10,50), cv2.FONT_HERSHEY_COMPLEX, 1, (142, 125, 52), 1)
cv2.imshow('video', frame)
if warn_dist > 140:
print("\r",' 太近了,端正坐姿 ',end="",flush=True)
if num == 0:
if flag_1 > 5:
flag_1 = 6
print("\r",'檢測到人員離開,啓用低亮度',end="",flush=True)
a.WmiSetBrightness(Brightness=10, Timeout=5)
else:
flag_1 = flag_1 + 1
else:
flag_1 = 0
print("\r",' 正常運行 ',end="",flush=True)
a.WmiSetBrightness(Brightness=60, Timeout=5)
# 以較慢幀率運行 空格退出 500爲了控制運行速度
if ord(' ') == cv2.waitKey(500):
break
cap.release()
cv2.destroyAllWindows()
最後會彈出視頻,並用橢圓把人臉圈起來。如果電腦前沒人一段時間,電腦屏幕亮度會降低,回來之後會立刻恢復,通過檢測臉的大小,還能判斷,是不是坐的太近,也會發出提醒。
打包後的exe文件鏈接:下載不要積分
不妨運行一下,挺好玩的。