1.差值法检测 :
差值法是一种简单而有效的移动物体检测技术,适用于监控和实时跟踪系统。其核心思想是通过比较连续视频帧之间的差异来识别移动物体。
.1 >差值法原理
差值法的基本原理是比较连续两帧或多帧图像间的像素差异。对于静态背景,相邻帧间的差异较小,而对于移动物体,由于其位置的变化,相邻帧间的像素值会有较大差异。
.2 >差值法公式
设 I ( x , y , t ) I(x, y, t) I(x,y,t)为在时间 t t t时刻,图像在位置 ( x , y ) (x, y) (x,y)的像素值。差值法通过计算相邻两帧图像的差异来检测移动物体:
D ( x , y , t ) = ∣ I ( x , y , t ) − I ( x , y , t − 1 ) ∣ D(x, y, t) = |I(x, y, t) - I(x, y, t-1)| D(x,y,t)=∣I(x,y,t)−I(x,y,t−1)∣
其中, D ( x , y , t ) D(x, y, t) D(x,y,t)表示时刻 t t t与时刻 t − 1 t-1 t−1之间在位置 ( x , y ) (x, y) (x,y)的像素差异。\
代码实现:
import cv2 # # 初始化摄像头 # cap = cv2.VideoCapture(0) # 读取视频 cap = cv2.VideoCapture('video.mp4') # 读取第一帧 ret, frame1 = cap.read() gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) # 定义矩形结构元素 rectangle_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) while True: # 读取下一帧 ret, frame2 = cap.read() if not ret: break # 如果视频结束,跳出循环 gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) # 计算两帧的差异 diff = cv2.absdiff(gray1, gray2) # 二值化以突出差异 _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY) thresh = cv2.dilate(thresh, rectangle_kernel, iterations=2) # 膨胀操作,使轮廓更清晰 # 找出轮廓 _, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 识别面积最大的轮廓 if contours: largest_contour = max(contours, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(largest_contour) cv2.rectangle(frame2, (x, y), (x + w, y + h), (0, 255, 0), 2) # 用绿色矩形框出 # 显示结果 thresh_img = cv2.merge([thresh, thresh, thresh]) cv2.imshow('Difference', cv2.hconcat([frame2, thresh_img])) # 准备下一次迭代 gray1 = gray2 # 按'q'退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows()
标签:检测,物体,cap,cv2,OPCV,thresh,frame2,差值,差异 From: https://www.cnblogs.com/hetaoBlog/p/18078518