Как удалить тень движущегося объекта с изображения с помощью opencv (python)?

Я пытаюсь сделать вычитание фона с помощью 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)


0 ответов

Другие вопросы по тегам