অধ্যায়Phase 3 · ক্লাসিক্যাল কম্পিউটার ভিশন
3.6 10 মিনিট পড়া

Background Subtraction

MOG2, KNN পদ্ধতি।

🎬 গল্প দিয়ে শুরু
Frame differencing-এ background pixel level বদলালেই false alarm। স্মার্ট সমাধান — সময়ের সাথে background-এর একটি statistical model রাখা। MOG2, KNN — এই কাজের industry standard।

MOG2 — Mixture of Gaussians

python
mog2.py
import cv2

cap = cv2.VideoCapture("street.mp4")
bg  = cv2.createBackgroundSubtractorMOG2(
        history=500, varThreshold=16, detectShadows=True)

while True:
    ret, frame = cap.read()
    if not ret: break
    fg = bg.apply(frame)

    # Shadow gray (127) সরাও, শুধু সাদা (255) রাখো
    _, mask = cv2.threshold(fg, 200, 255, cv2.THRESH_BINARY)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN,
                            cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)))

    cv2.imshow("FG", mask)
    if cv2.waitKey(30) == 27: break
কীভাবে কাজ করে?
প্রতিটি pixel-এর intensity-কে একাধিক Gaussian distribution দিয়ে model করে। নতুন value যদি কোনো distribution-এ ফিট হয় → background, না হলে → foreground।

KNN — K-Nearest Neighbors

python
import cv2
bg = cv2.createBackgroundSubtractorKNN(
        history=500, dist2Threshold=400.0, detectShadows=True)

কম object থাকলে KNN দ্রুত; বেশি object থাকলে MOG2 বেশি stable।

Parameter Tuning Cheat Sheet

Paramপ্রভাব
historyকত আগের frame দিয়ে background শিখবে; বড় → stable, ধীরে adapt
varThresholdকত variance-এর মধ্যে background ধরবে; ছোট → sensitive
detectShadowsShadow কে gray (127) mark করবে; পরে remove সহজ

Pipeline — vehicle counting

python
import cv2

cap = cv2.VideoCapture("traffic.mp4")
bg  = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
line_y = 400; count = 0; centroids = []

while True:
    ret, f = cap.read()
    if not ret: break
    m = bg.apply(f)
    _, m = cv2.threshold(m, 200, 255, cv2.THRESH_BINARY)
    m = cv2.morphologyEx(m, cv2.MORPH_CLOSE,
            cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7)))

    cnts,_ = cv2.findContours(m, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for c in cnts:
        if cv2.contourArea(c) < 1500: continue
        x,y,w,h = cv2.boundingRect(c)
        cy = y + h//2
        if line_y-5 < cy < line_y+5: count += 1
        cv2.rectangle(f,(x,y),(x+w,y+h),(0,255,0),2)
    cv2.line(f,(0,line_y),(f.shape[1],line_y),(0,0,255),2)
    cv2.putText(f, f"Count: {count}", (20,40),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,255), 2)
    cv2.imshow("count", f)
    if cv2.waitKey(30)==27: break
প্র্যাকটিস টাস্ক
  1. MOG2 ও KNN-এর output পাশাপাশি render করুন একই video-তে।
  2. একটি static traffic video-তে gari count করার pipeline সম্পূর্ণ করুন।
  3. detectShadows=True/False তুলনা করে shadow false-detection প্রভাব দেখান।

সারসংক্ষেপ

  • Background subtraction = statistical foreground/background separation।
  • MOG2 = Gaussian mixture, robust; KNN = nonparametric, simple।
  • Shadow detection feature ব্যবহার করলে false detection কমে।
  • Vehicle, animal, intrusion counting — সব এই foundation।