用opencv python 写一个排水管排水超过一分钟就产生报警的代码排泥通常是排出大量的水产生与上一帧图像差别超过百分之50的区别。报警方式选择声音报警
下面是一个使用OpenCV和Python编写的排水管排水报警代码示例:
import cv2
import numpy as np
import winsound
def calculate_frame_difference(prev_frame, curr_frame):
# 将图像转换为灰度图
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)
curr_gray = cv2.cvtColor(curr_frame, cv2.COLOR_BGR2GRAY)
# 计算两帧图像之间的差异
frame_diff = cv2.absdiff(prev_gray, curr_gray)
frame_diff_percentage = np.mean(frame_diff) / 255.0 # 计算差异的百分比
return frame_diff_percentage
def main():
# 打开视频文件或捕捉摄像头
cap = cv2.VideoCapture(0) # 如果要使用视频文件,传入文件路径作为参数
# 读取第一帧
ret, prev_frame = cap.read()
prev_frame = cv2.flip(prev_frame, 1) # 水平翻转图像
# 设置报警阈值和报警时长
difference_threshold = 0.5 # 差异阈值为50%
alarm_duration = 60 # 报警时长为60秒
alarm_triggered = False
current_alarm_duration = 0
while True:
# 读取当前帧
ret, curr_frame = cap.read()
curr_frame = cv2.flip(curr_frame, 1) # 水平翻转图像
# 计算当前帧与上一帧的差异
frame_diff_percentage = calculate_frame_difference(prev_frame, curr_frame)
# 如果差异超过阈值,则触发报警
if frame_diff_percentage > difference_threshold:
if not alarm_triggered:
print("排水管排水超过阈值!")
winsound.PlaySound("alert.wav", winsound.SND_ASYNC | winsound.SND_ALIAS)
alarm_triggered = True
else:
current_alarm_duration += 1
if current_alarm_duration > alarm_duration:
alarm_triggered = False
current_alarm_duration = 0
else:
alarm_triggered = False
current_alarm_duration = 0
# 显示当前帧
cv2.imshow("Video", curr_frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 更新上一帧
prev_frame = curr_frame
# 释放资源
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
在上述代码中,我们首先定义了calculate_frame_difference函数,用于计算两帧图像之间的差异百分比。然后,在main函数中,我们按照以下步骤进行操作:
- 打开视频文件或捕捉摄像头。
- 读取第一帧图像作为上一帧。
- 设置报警阈值和报警时长。
- 在一个无限循环中,读取当前帧图像。
- 计算当前帧与上一帧的差异百分比。
- 如果差异超过阈值并且报警未触发,则触发报警,并播放声音。
- 如果报警已触发,则增加当前报警时长。
- 如果当前报警时长超过报警时长阈值,则重置报警状态和时长。
- 在窗口中显示当前帧图像。
- 按下 'q' 键退出循环。
- 更新上一帧图像为当前帧图像。
- 释放资源。
请注意,这只是一个示例代码,您可能需要根据您的具体要求进行修改和优化。另外,您需要将报警声音文件(例如alert.wav)放置在与代码文件相同的目录下
原文地址: https://www.cveoy.top/t/topic/hYzo 著作权归作者所有。请勿转载和采集!