一些高级的笔电上都会有一个眼球追踪的装置,当电脑没有在用的时候会降低亮度,有人用的时候会恢复亮度,达到节电的目的。在这里通过调用摄像头,来识别电脑前是否有人,如果长时间没有人就会通过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文件链接:下载不要积分
不妨运行一下,挺好玩的。