摸鱼必备,BossSensor
原始代码写于2017年,时间过于久远,对代码进行了重新实现。
整体配置流程不变,在环境中可能会用到pyqt5、opencv3.4.2、keras2.2.4这些组件
实现功能做了简化,有兴趣可以补全。判断屏幕前方是否有人面向你走来,并进行切屏。
距离你三到五米就可以判断出来并切屏了,如果对特定人物有要求,可以加入一些人脸识别模型至test文件注释位置即可。
直接上代码
import cv2
#from My_model import Model
from image_show import show_image
import PyQt5
if __name__ == '__main__':
cap = cv2.VideoCapture(0)
cascade_path = "haarcascade_frontalface_default.xml"
result = 0
#--------------加载人脸识别模型-------------#
# model = Model()
# model.load()
continue_nums = 0 #防止误判
while(True):
# 获取每帧图像
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人脸检测
cascade = cv2.CascadeClassifier(cascade_path)
facerect = cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(10, 10))
print(len(facerect)) # 打印前方人脸数量
# 判断逻辑
if len(facerect) > 0:
print('face detected')
color = (255, 255, 255) # 白
for rect in facerect:
cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), color, thickness=2)
x, y = rect[0:2]
width, height = rect[2:4]
image = frame[y - 10: y + height, x: x + width]
#--------------接入其他推理模型-------------#
result = 1#model.predict(image)
#--------------识别灵敏度,防误触-------------#
if len(facerect)>0:#result==1:
continue_nums += 1
else:
continue_nums = 0
#--------------图片覆盖(伪切屏)-------------#
if continue_nums>5:
show_image()
continue_nums = 0
# if cv2.waitKey(25) & 0xFF == ord('q'):
# break
#--------------显示图像-------------#
#cv2.imshow('frame',frame)
#cv2.waitKey(25)
cap.release()
cv2.destroyAllWindows()
用pyqt实现伪切屏
实际上就是做个全屏前置页面,覆盖掉你当前的屏幕,并不是真正的切屏
def show_image(image_path='test.png'):
app = QtWidgets.QApplication(sys.argv)
pixmap = QtGui.QPixmap(image_path)
screen = QtWidgets.QLabel()
screen.setWindowFlags(PyQt5.QtCore.Qt.WindowMinimizeButtonHint | # 使能最小化按钮
PyQt5.QtCore.Qt.WindowCloseButtonHint | # 使能关闭按钮
PyQt5.QtCore.Qt.WindowStaysOnTopHint) # 窗体总在最前端
screen.setPixmap(pixmap)
screen.showFullScreen()
#sys.exit(app.exec_())
app.exec_()