Python OpenCV 排泥检测代码:基于二值化处理的帧间差异分析
以下是一个基于Python和OpenCV的排泥检测代码示例:
import cv2
import datetime
def detect_mud():
cap = cv2.VideoCapture(0) # 打开摄像头,如果有多个摄像头,可以尝试不同的索引值
# 获取第一帧图像
_, frame1 = cap.read()
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
gray1 = cv2.GaussianBlur(gray1, (21, 21), 0)
# 初始化变量
alarm_triggered = False
start_time = None
while True:
_, frame2 = cap.read()
gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
gray2 = cv2.GaussianBlur(gray2, (21, 21), 0)
# 计算当前帧和前一帧的差异
frame_delta = cv2.absdiff(gray1, gray2)
thresh = cv2.threshold(frame_delta, 30, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.dilate(thresh, None, iterations=2)
# 寻找轮廓
contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 检测变化过大且持续一分钟
motion_detected = False
for contour in contours:
if cv2.contourArea(contour) > 500:
motion_detected = True
break
if motion_detected:
if not alarm_triggered:
# 变化开始时间
start_time = datetime.datetime.now()
alarm_triggered = True
else:
# 检测时间是否超过一分钟
elapsed_time = datetime.datetime.now() - start_time
if elapsed_time.total_seconds() >= 60:
# 在窗口中显示时间和"alarm"
cv2.putText(frame2, "Alarm", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.putText(frame2, str(datetime.datetime.now()), (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
else:
alarm_triggered = False
cv2.imshow("Mud Detection", frame2)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 更新前一帧
gray1 = gray2
# 清理资源
cap.release()
cv2.destroyAllWindows()
# 调用排泥检测函数
detect_mud()
这个代码通过打开摄像头,获取前后帧图像,并对其进行差分处理,然后通过阈值化和膨胀操作找出变化部分的轮廓。如果检测到变化过大且持续一分钟,就在窗口中显示时间和"alarm"。可以按下 'q' 键退出程序。
请注意,这只是一个简单的示例代码,可能需要根据实际情况进行调整和优化。另外,使用摄像头时,请确保摄像头设备可用,并在代码中正确设置摄像头索引值。
原文地址: https://www.cveoy.top/t/topic/p3pL 著作权归作者所有。请勿转载和采集!