前段时间我制作了笔记本利用Python自动拍摄照片并判断明亮度后按时间保存-CSDN博客 的py程序用于利用笔记本长期为自己监控笔记本前面的情况。运行一段时间时发现该程序内存泄漏,每5分钟增加几m的内存占用,用了很多方法都无法解决这个问题。所有对于有内存强迫症的我,就非常不舒服,用一二天就把他关闭重启。
今天,我突然有一个想法,我可以用我平时用dos命令运行py程序的方法,5分钟执行一次,每一次就只拍一张照片。分开写2个py程序,一个是拍照的程序,一个是定时运行拍照的程序。
拍照程序:
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 6 08:09:26 2024
@author: YBK
"""
import cv2
import os
import datetime
from PIL import Image
# 设置拍照参数
frame_width = 960
frame_height = 540
# 初始化摄像头
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]
date_str = now.strftime("%Y%m%d")
date_path = 'e:\\sxtpz\\' + date_str
# 读取一帧图像
ret, frame = cap.read()
# 如果成功读取图像,进行保存
if ret:
frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame1)
gray_img = img.convert('L')
# 计算平均亮度
# gray_img.show()
avg_brightness = sum(gray_img.getdata()) / (gray_img.width * gray_img.height)
# print(avg_brightness)
del(gray_img)
del(img)
if avg_brightness < 30:
print("照片是黑暗的,不保存")
else:
if os.path.exists(date_path):
pass
else:
print("创建文件夹")
os.makedirs(date_path, exist_ok=True)
cv2.imwrite(date_path + '\\' + filename + '.jpg', frame) # 保存图片为'snapshot.jpg'
print("照片已保存:" + filename + '.jpg')
else:
print("无法拍照")
# 释放摄像头
del(ret)
del(frame)
del(frame1)
cap.release()
cap = None
cv2.destroyAllWindows()
每5分钟运行上面的程序:
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 12 12:36:25 2024
@author: YBK
"""
from apscheduler.schedulers.blocking import BlockingScheduler
import subprocess
def rundos():
command = 'conda activate python38'
try:
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
print('38ok ' + result.stdout)
else:
print('38err ' + result.stderr)
except Exception as e:
print(f'发生异常:{e}')
command1 = 'python E:\.spyder-py3\拍照.py'
try:
result = subprocess.run(command1, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
print('ok ' + result.stdout)
else:
print('err ' + result.stderr)
except Exception as e:
print(f'发生异常:{e}')
rundos()
sched = BlockingScheduler()
sched.add_job(rundos, 'interval', minutes=5,)
sched.start()
这样运行下来,该程序平时就只有占用50多m内存。