有时笔记本在公共场合使用,人离开了笔记本,又想知道有没有人偷看自己笔记本的内容,或者为了监控在公共场所的情况。为此,我写了一段python程序,利用cv2拍照,监控在笔记本前的情况,5分钟拍照一次,如果是夜晚,拍摄的照片是黑色的,选择不保存。程序如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 6 08:09:26 2024
@author: YBK
"""
import cv2
import time
import datetime
from io import BytesIO
from PIL import Image
def is_photo_black(image_path):
# 打开图片
with Image.open(image_path) as img:
# 将图片转换为灰度模式
gray_img = img.convert('L')
# 计算平均亮度
avg_brightness = sum(gray_img.getdata()) / (gray_img.width * gray_img.height)
# print(avg_brightness)
# 如果平均亮度低于某个阈值(例如5),则认为图片基本是黑色的
return avg_brightness < 30
# 设置拍照参数
frame_width = 960
frame_height = 540
while True:
# 初始化摄像头
cap = cv2.VideoCapture(0) # 0 通常是默认摄像头的标识
# 检查摄像头是否成功打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)
now = datetime.datetime.now()
filename = str(now).replace('-','').replace(':','').replace(' ','').replace('2024','').split('.')[0]
# 读取一帧图像
ret, frame = cap.read()
# 如果成功读取图像,进行保存
if ret:
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
_, buffer = cv2.imencode('.jpg', frame, encode_param)
memory_file = BytesIO(buffer.tobytes())
memory_file.seek(0)
if is_photo_black(memory_file):
print("照片是黑暗的,不保存")
else:
cv2.imwrite('e:\\sxtpz\\' + filename + '.jpg', frame) # 保存图片为'snapshot.jpg'
print("照片已保存:" + filename + '.jpg')
else:
print("无法拍照")
# 释放摄像头
cap.release()
time.sleep(300)
这样就可以每5分钟观察谁在笔记本前干什么。非常实用的程序。