要实现监控摄像头画面变动报警,特别是检测到有人闯入时发出警报,可以使用Python结合OpenCV和一些深度学习模型来实现。
以下是一个基本的示例代码,它使用OpenCV来捕获摄像头画面,并通过帧间差分法来检测运动。
所需库安装
首先,你需要安装一些必要的Python库:pip install opencv-pythonpip install opencv-python-headlesspip install numpy以下是一个基本的示例代码,使用OpenCV来捕获摄像头画面,并检测画面中的变化:
import cv2 import numpy as np # 初始化摄像头 cap = cv2.VideoCapture(0) # 读取第一帧 ret, frame1 = cap.read() gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) gray1 = cv2.GaussianBlur(gray1, (21, 21), 0) while True: # 读取下一帧 ret, frame2 = cap.read() gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) gray2 = cv2.GaussianBlur(gray2, (21, 21), 0) # 计算两帧之间的差分 delta_frame = cv2.absdiff(gray1, gray2) thresh = cv2.threshold(delta_frame, 25, 255, cv2.THRESH_BINARY)[1] thresh = cv2.dilate(thresh, None, iterations=2) # 查找阈值图像中的轮廓 contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: if cv2.contourArea(contour) < 500: continue # 画出轮廓(即检测到的运动区域) (x, y, w, h) = cv2.boundingRect(contour) cv2.rectangle(frame2, (x, y), (x + w, y + h), (0, 255, 0), 2) print("有人闯入!") # 显示结果帧 cv2.imshow("Frame", frame2) # 更新前一帧 gray1 = gray2.copy() # 按下 'q' 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头并关闭所有窗口 cap.release() cv2.destroyAllWindows()
代码解释
初始化摄像头:使用 cv2.VideoCapture(0) 打开默认摄像头。
读取第一帧:读取第一帧并转换为灰度图,然后进行高斯模糊处理。
循环读取帧:在循环中不断读取下一帧,并转换为灰度图和进行高斯模糊处理。
计算差分:计算当前帧和前一帧之间的差分,得到运动区域。
阈值处理:对差分图像进行阈值处理和膨胀操作,以获得更明显的运动区域。
查找轮廓:在阈值图像中查找轮廓,即检测到的运动区域。
画出轮廓:对运动区域画出矩形框,并打印报警信息。
显示结果帧:显示当前帧。
更新前一帧:将当前帧更新为前一帧,以便进行下一次比较。
退出循环:按下 'q' 键退出循环。
释放资源:释放摄像头并关闭所有窗口。
注意事项
这个示例代码是一个基本的运动检测器,它通过帧间差分法来检测运动。
实际应用中可能需要更多的优化和处理,例如减少误报、使用更高级的运动检测算法(如深度学习模型)等。
如果需要更精确的入侵检测,可以考虑使用预训练的深度学习模型(如YOLO、SSD等)进行目标检测和分类。
网友回复