0

我正在尝试使用 MOG2 进行背景减法,它工作正常,但是当移动物体的阴影很深时,阴影被认为是前景物体,我不希望那个阴影作为前景物体(我正在运行 MOG2 13 张图像)。如何删除这些阴影,使其不会出现在前景中?

这是一个示例图像...

原图

应用 MOG2 后的图像

这是我的示例代码...

import os
import numpy as np
import cv2
import glob
import imutils
i=0
bg_flag = 0
image_list = []
bgs_list = []
#bgsfinal function
def detection(image_list):
    global i
    global bg_flag
    bgs3_img = None
    backsub = cv2.createBackgroundSubtractorMOG2(128, cv2.THRESH_BINARY, 1)
    print("start2")
    for k in range(len(image_list)):
        frame = image_list[k]
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imwrite('./gray/'+str(k)+'.jpg', frame)
        #blur = cv2.medianBlur(frame, 21)
        blur = frame
        bgs_list.append(blur)
    for bg in range(len(bgs_list)):
        rects = []
        #start_time = time.time()
        frame_blur = bgs_list[bg]
        img = image_list[bg].copy()
        s_frame = image_list[bg]
        new_frame = s_frame.copy()
        fgmask = backsub.apply(frame_blur)
        cv2.imwrite("./bgs/"+str(i)+".jpg", fgmask)
        fgmask[fgmask==127] = 0
        cv2.imwrite("./dilate/"+str(i)+".jpg", fgmask)
        thresh = cv2.threshold(fgmask, 128, 255, cv2.THRESH_BINARY)[1]
        thresh = cv2.erode(thresh, None, iterations = 1)
        thresh = cv2.dilate(thresh, None, iterations=1)
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cnts = imutils.grab_contours(cnts)
        for c in cnts:
            #M = cv2.moments(c)
            A = cv2.contourArea(c)
            (x, y, w, h) = cv2.boundingRect(c)
            
            cv2.rectangle(new_frame, (x, y), (x + w, y + h), (0,0, 255), 1)
            cv2.putText(new_frame, str(A), (x - 10, y - 10), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
            cv2.imwrite("./area/"+str(i)+".jpg", new_frame)
            cv2.rectangle(thresh, (x, y), (x + w, y + h), (255,255, 255), 1)
            cv2.putText(thresh, str(A), (x - 10, y - 10), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
            cv2.imwrite("./area_bgs/"+str(i)+".jpg", thresh)
        i+=1
    print("Done!")
#this folder contains 13 continuous images 
images = glob.glob('./inci4/*.jpg')

for j in range(len(images)):
    img = cv2.imread(images[j])
    img = cv2.resize(img, (360, 640))
    image_list.append(img)

detection(image_list)


4

0 回答 0