以下是一个基于Python OpenCV的排泥检测代码示例:\n\npython\nimport cv2\nimport numpy as np\nimport time\n\n# 前一帧图像\nprevious_frame = None\n# 变化帧计数器\nframe_count = 0\n# 开始时间\nstart_time = time.time()\n\n# 打开摄像头\nvideo_capture = cv2.VideoCapture(0)\n\nwhile True:\n # 读取当前帧\n ret, frame = video_capture.read()\n\n # 将当前帧转换为灰度图像\n gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n # 对灰度图像进行高斯模糊\n gray = cv2.GaussianBlur(gray, (21, 21), 0)\n\n if previous_frame is None:\n # 如果是第一帧,则将当前帧作为前一帧\n previous_frame = gray\n continue\n\n # 计算当前帧与前一帧的差异\n frame_delta = cv2.absdiff(previous_frame, gray)\n # 使用阈值将差异图像二值化\n thresh = cv2.threshold(frame_delta, 30, 255, cv2.THRESH_BINARY)[1]\n # 对二值图像进行膨胀操作\n thresh = cv2.dilate(thresh, None, iterations=2)\n\n # 寻找轮廓\n contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n\n # 初始化变化标识符\n motion_detected = False\n\n for contour in contours:\n # 如果轮廓面积小于一定阈值,则忽略\n if cv2.contourArea(contour) < 500:\n continue\n\n # 计算轮廓的边界框\n (x, y, w, h) = cv2.boundingRect(contour)\n # 在当前帧中绘制边界框\n cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)\n\n # 设置变化标识符为True\n motion_detected = True\n\n if motion_detected:\n frame_count += 1\n # 如果变化帧计数器达到一定阈值(例如10帧),则开始计时\n if frame_count >= 10:\n elapsed_time = time.time() - start_time\n # 如果变化持续一分钟\n if elapsed_time >= 60:\n cv2.putText(frame, "Alarm", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)\n cv2.putText(frame, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)\n else:\n # 重置变化帧计数器和开始时间\n frame_count = 0\n start_time = time.time()\n\n # 显示当前帧\n cv2.imshow("Motion Detection", frame)\n\n # 按'q'键退出循环\n if cv2.waitKey(1) & 0xFF == ord('q'):\n break\n\n# 释放摄像头和关闭窗口\nvideo_capture.release()\ncv2.destroyAllWindows()\n\n\n该代码通过比较当前帧与前一帧的差异,检测到图像中的运动(排泥)区域。如果变化帧持续一分钟,则在窗口中显示时间和"Alarm"。请注意,该代码仅适用于摄像头输入,如果要处理视频文件,需要进行适当的修改。

Python OpenCV 排泥检测代码:基于帧间差异分析

原文地址: https://www.cveoy.top/t/topic/p3qF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录