Verwenden Sie opencv, um die Frame-Differenz-Methode und die Hintergrundsubtraktion zu kombinieren, um Szenenanomalien zu erkennen

1. Frame-Differenz-Methode zur Erkennung von Anomalien

Die Frame-Subtraktion ist eine einfache Hintergrundsubtraktionstechnik, mit der die Differenz zwischen dem aktuellen Frame und dem Hintergrund-Frame ermittelt wird. Das Folgende ist ein Beispiel für Python-Code, der OpenCV verwendet, um die Frame-Differenz-Methode zu implementieren:

import cv2

# 读取背景图像(背景应该是静止的)
background = cv2.imread('background.jpg', 0)

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取当前帧
    ret, frame = cap.read()
    
    if not ret:
        break

    # 将当前帧转为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 计算当前帧与背景的差异
    diff = cv2.absdiff(gray, background)

    # 设置一个阈值,根据阈值判断差异区域
    _, threshold = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    # 执行形态学操作,去除噪声
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    threshold = cv2.morphologyEx(threshold, cv2.MORPH_OPEN, kernel)

    # 查找轮廓
    contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 绘制检测到的轮廓
    for contour in contours:
        if cv2.contourArea(contour) > 1000:  # 设置一个面积阈值来排除小的轮廓
            x, y, w, h = cv2.boundingRect(contour)
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # 显示结果
    cv2.imshow('Frame', frame)

    if cv2.waitKey(1) & 0xFF == 27:  # 按Esc键退出
        break

cap.release()
cv2.destroyAllWindows()

Wird verwendet, um zu erkennen, ob es regnet, Wasser austritt usw.

2. Fangen Sie die Kamera 3 Sekunden lang ab und verwenden Sie dann die Bilddifferenzmethode

Um 3 Sekunden der Kamera abzufangen und die Frame-Differenz-Methode zur dynamischen Erkennung von Hintergrundunterschieden zu verwenden, können Sie diese Aufgabe mit der OpenCV-Bibliothek ausführen. Zuerst müssen Sie einen Timer einstellen, um 3 Sekunden Video aufzunehmen. Anschließend können Sie die Frame-Differenz-Methode anwenden, um Hintergrundänderungen zu erkennen.

import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

# 获取摄像头的帧速率
frame_rate = int(cap.get(5))

# 计时器(3秒)
duration = 3  # 3秒
frames_to_capture = frame_rate * duration

# 初始化背景
background = None

# 计数器
frame_count = 0

while True:
    ret, frame = cap.read()

    if not ret:
        break

    if frame_count < frames_to_capture:
        # 累积前景图像,以用于帧差法
        if background is None:
            background = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        else:
            current_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            cv2.accumulateWeighted(current_frame, background, 0.5)
            background = cv2.convertScaleAbs(background)

        frame_count += 1
    else:
        # 3秒时间结束,开始使用帧差法检测背景变化
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        diff = cv2.absdiff(background, gray)

        _, threshold = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
        threshold = cv2.morphologyEx(threshold, cv2.MORPH_OPEN, kernel)

        contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        for contour in contours:
            if cv2.contourArea(contour) > 1000:
                x, y, w, h = cv2.boundingRect(contour)
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.imshow('Motion Detection', frame)

        if cv2.waitKey(1) & 0xFF == 27:
            break

cap.release()
cv2.destroyAllWindows()

Dieser Code erfasst zunächst 3 Sekunden Video als Hintergrund und wendet dann die Frame-Differenz-Methode an, um Hintergrundänderungen nach Ablauf der 3 Sekunden zu erkennen. Erkannte Hintergrundänderungen werden mit grünen Rechtecken markiert. Sie können die Parameter nach Bedarf anpassen, um die besten Erkennungsergebnisse zu erzielen.

3. Hintergrundsubtraktion

Hintergrundsubtraktion ist eine Technik, die häufig bei der Videoanalyse und Objektverfolgung verwendet wird. Damit lassen sich bewegte Objekte in Videos erkennen und deren Unterschiede zum Hintergrund extrahieren. Das Folgende ist ein Python-Beispielcode, der die OpenCV-Bibliothek verwendet, um die Hintergrundsubtraktion zu implementieren:

import cv2

# 打开视频文件或摄像头
cap = cv2.VideoCapture('your_video.mp4')  # 替换为你的视频文件路径或0来使用摄像头

# 创建背景减法器
fgbg = cv2.createBackgroundSubtractorMOG2()

while True:
    ret, frame = cap.read()

    if not ret:
        break

    # 应用背景减法器
    fgmask = fgbg.apply(frame)

    # 反转前景掩码,以便提取前景对象
    fgmask = cv2.bitwise_not(fgmask)

    # 获取前景对象
    result = cv2.bitwise_and(frame, frame, mask=fgmask)

    cv2.imshow('Original', frame)
    cv2.imshow('Foreground', result)

    if cv2.waitKey(30) & 0xFF == 27:  # 按Esc键退出
        break

cap.release()
cv2.destroyAllWindows()

4. Andere Methoden von OpenCV

In OpenCV gibt es mehrere Methoden zum Erkennen von Anomalien in Standbildern, insbesondere zum Erkennen, ob Fremdkörper in die Ansicht eingedrungen sind. Hier sind einige häufig verwendete Methoden:

  1. Frame-Differenzmethode: Dies ist eine einfache Hintergrundsubtraktionstechnik, die sich bewegende Objekte erkennt, indem sie die Differenz zwischen dem aktuellen Frame und dem Hintergrundframe vergleicht. Überschreitet die Differenz einen bestimmten Schwellenwert, kann davon ausgegangen werden, dass ein Fremdkörper in den Betrachtungswinkel gelangt ist.

  2. Hintergrundsubtraktion: Dies ist eine komplexere Methode, die ein Modell des Hintergrunds erstellt und Bereiche erkennt, die nicht mit dem Modell übereinstimmen. Wenn sich ein Bereich im Laufe der Zeit verändert, können Anomalien erkannt werden.

  3. Optischer Fluss: Der optische Fluss kann sich bewegende Objekte erkennen und deren Geschwindigkeit und Richtung abschätzen. Wenn die Geschwindigkeit des optischen Flusses einen bestimmten Schwellenwert überschreitet, kann davon ausgegangen werden, dass sich ein Objekt bewegt.

  4. Kombination aus Bildsubtraktion und Hintergrundsubtraktion: Durch die Verwendung einer Kombination aus Bildsubtraktion und Hintergrundsubtraktion können Anomalien in Standbildern besser erkannt werden.

  5. Bewegungserkennungsalgorithmen: OpenCV bietet einige Bewegungserkennungsalgorithmen wie Mean-Shift und CamShift, die zur Erkennung bewegter Objekte in Videos verwendet werden können. Diese Algorithmen werden typischerweise zur Verfolgung bewegter Objekte verwendet, können aber auch zur Anomalieerkennung verwendet werden.

Sie können je nach Bedarf eine oder mehrere dieser Methoden zur Erkennung von Anomalien auswählen. Um den besten Erkennungseffekt zu erzielen, müssen Parameter und Schwellenwerte an die jeweiligen Umstände angepasst werden.

5. Kombination der Rahmendifferenzmethode und der Hintergrundsubtraktionsmethode

Es ist eine gängige Methode, die Bilddifferenzmethode und die Hintergrundsubtraktion zu kombinieren, um zu erkennen, ob sich im 3-Sekunden-Video der Kamera Änderungen ergeben. Hier ist ein Beispielcode, der zeigt, wie diese beiden Techniken kombiniert werden, um diese Aufgabe zu lösen:

import cv2
import time

# 打开摄像头
cap = cv2.VideoCapture(0)

# 创建背景减法器
fgbg = cv2.createBackgroundSubtractorMOG2()

# 读取第一帧作为背景
ret, background = cap.read()

# 设置计时器,记录运行时间
start_time = time.time()
run_time = 0

while run_time < 3:  # 运行3秒钟
    ret, frame = cap.read()
    
    if not ret:
        break
    
    # 应用背景减法器
    fgmask = fgbg.apply(frame)

    # 反转前景掩码,以便提取前景对象
    fgmask = cv2.bitwise_not(fgmask)

    # 获取前景对象
    result = cv2.bitwise_and(frame, frame, mask=fgmask)

    # 计算帧差
    frame_diff = cv2.absdiff(frame, background)

    # 设置阈值,用于检测帧差
    threshold = 30
    _, thresh = cv2.threshold(cv2.cvtColor(frame_diff, cv2.COLOR_BGR2GRAY), threshold, 255, cv2.THRESH_BINARY)

    # 计算帧差中非零像素的数量
    nonzero_pixels = cv2.countNonZero(thresh)

    if nonzero_pixels > 100:  # 如果帧差中的非零像素数量超过阈值
        print("有变化检测到!")

    cv2.imshow('Original', frame)
    cv2.imshow('Foreground', result)

    if cv2.waitKey(30) & 0xFF == 27:  # 按Esc键退出
        break

    # 计算运行时间
    run_time = time.time() - start_time

cap.release()
cv2.destroyAllWindows()

In diesem Beispiel schalten wir die Kamera ein und erstellen einen Hintergrundsubtrahierer. Zuerst lesen wir den ersten Frame als Hintergrund. Anschließend durchlaufen wir jedes von der Kamera erfasste Bild und wenden dabei einen Hintergrundsubtrahierer und eine Bilddifferenzmethode an, um festzustellen, ob es Änderungen gibt. Wenn eine Änderung festgestellt wird (die Anzahl der Pixel ungleich Null überschreitet einen Schwellenwert), wird eine Meldung gedruckt.

Dieser Code wird 3 Sekunden lang ausgeführt und dann beendet. Sie können die Parameter der Rahmendifferenzmethode und der Hintergrundsubtraktion nach Bedarf anpassen, um sie an unterschiedliche Szenarien und Anforderungen anzupassen.

おすすめ

転載: blog.csdn.net/March_A/article/details/133795314