python程序之調用攝像頭實現電腦亮度的自動調節(沒人時暗,有人時亮)

一些高級的筆電上都會有一個眼球追蹤的裝置,當電腦沒有在用的時候會降低亮度,有人用的時候會恢復亮度,達到節電的目的。在這裏通過調用攝像頭,來識別電腦前是否有人,如果長時間沒有人就會通過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文件鏈接:下載不要積分
不妨運行一下,挺好玩的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章