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文件链接:下载不要积分
不妨运行一下,挺好玩的。

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