Python+OpenCV相机条件拍照:重复打印与运行卡顿问题咨询
问题分析与优化方案
问题1:无物体状态重复打印的解决方案
原因:原代码在无物体的分支中,每帧都会执行print('No object Detected'),且直接把previous_flag同步为0,没有做状态变更判断,所以只要无物体就会每帧打印一次。
修改逻辑:仅当状态从「有物体」切换为「无物体」时,才执行一次打印,和物体进入时的判断逻辑保持一致即可。
问题2:死循环/sleep导致卡顿的优化方案
原因:
- 你添加的死循环会完全阻塞主线程,视频流读取、窗口刷新全部停止,必然出现卡顿
- 原代码中的
time.sleep(3)也会阻塞主线程3秒,期间程序无响应,无法处理窗口操作
优化思路: - 去掉死循环,仅靠
previous_flag状态就可以避免同一物体重复拍照:只要物体一直在监测区,current_flag保持为1,和previous_flag差值为0,就不会触发拍照逻辑 - 用时间戳计算等待时长,替代阻塞式的
time.sleep,计时期间程序可以正常处理视频流和窗口事件
其他已知bug修复
- 原代码缺少
import time语句,直接调用time.sleep会报错 - 图片保存路径的字符串拼接写法错误,
'.trial/cam+str(a).jpg'是固定字符串,不会替换变量a - 没有判断
./trial目录是否存在,目录不存在时保存图片会失败 - 没有加程序退出逻辑,只能强制结束进程
- opencv的
imwrite默认要求BGR色彩顺序,原代码直接存RGB格式的帧会导致颜色异常
完整修正代码
import cv2 import numpy as np import os import time os.chdir('C:/Users/Man/Desktop') # 先创建保存目录,不存在就新建 os.makedirs('./trial', exist_ok=True) previous_flag = 0 current_flag = 0 a = 0 # 计时用变量 trigger_time = None waiting_shot = False video = cv2.VideoCapture(0) while True: ret, frame = video.read() if not ret: break rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) cv2.imshow('Real Time', rgb) # 按q键退出程序 if cv2.waitKey(1) & 0xFF == ord('q'): break # 检测当前监测点状态 if rgb[400, 200, 0] > 200: current_flag = 0 else: current_flag = 1 # 状态变更判断 change_in_flags = current_flag - previous_flag if change_in_flags == 1: # 物体刚进入,记录触发时间,标记等待拍照 trigger_time = time.time() waiting_shot = True previous_flag = current_flag elif change_in_flags == -1: # 物体刚离开,仅打印一次无物体提示 print('No object Detected') waiting_shot = False previous_flag = current_flag # 等待3秒到点、处于等待拍照状态、且物体仍在监测区,才执行拍照 if waiting_shot and time.time() - trigger_time >= 3 and current_flag == 1: # 色彩空间转成BGR再保存,避免颜色异常 cv2.imwrite(f'./trial/cam{a}.jpg', cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)) a += 1 waiting_shot = False video.release() cv2.destroyAllWindows()
补充说明
如果需要保存物体刚出现时刻的帧,可以在change_in_flags == 1的时候把当前的rgb存到一个临时变量里,拍照的时候直接存这个变量即可。
内容的提问来源于stack exchange,提问作者Kimwaga Makono
相关产品推荐
相关产品推荐

