OPCV 移动物体检测

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()
复制代码

 

posted @   HxxxTENCTION  阅读(194)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示