Responder a: Transformar “máscara” em vídeo

Home Fóruns Fórum Rastreamento de Objetos com Python e OpenCV Transformar “máscara” em vídeo Responder a: Transformar “máscara” em vídeo

#33706
PH1005
Participante

    Oi Dalton, consigo sim.

    import numpy as np
    import cv2
    import sys
    from random import randint
    
    ##################################################################################
    
    # Escolha do Vídeo
    VIDEO_SOURCE = "videos/Video_5.mp4"
    
    #Definindo as variáveis de cor/fonte aleatoriamente (R,G,B)
    
    TEXT_COLOR = (randint(0, 255), randint(0,255),randint(0,255))
    TRACKER_COLOR = (randint(0, 255), randint(0,255),randint(0,255))
    FONT = cv2.FONT_HERSHEY_SIMPLEX
    
    # Escolha do Background
    BGS_TYPES = ["MOG2", "KNN"]
    BGS_TYPE = BGS_TYPES[1]
    
    ##################################################################################
    
    # Escolha do Kernel
    def getKernel(KERNEL_TYPE):
    if KERNEL_TYPE == "dilation":
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
    if KERNEL_TYPE == "opening":
    kernel = np.ones((3,3), np.uint8)
    if KERNEL_TYPE == "closing":
    kernel = np.ones((3,3), np.uint8)
    
    return kernel
    
    ##################################################################################
    
    # Criação dos Filtros
    def getFilter(img, filter):
    if filter == 'closing':
    return cv2.morphologyEx(img, cv2.MORPH_CLOSE, getKernel("closing"), iterations=2)
    
    if filter == 'opening':
    return cv2.morphologyEx(img, cv2.MORPH_OPEN, getKernel("opening"), iterations=2)
    
    if filter == 'dilation':
    return cv2.dilate(img, getKernel("dilation"), iterations=2)
    
    if filter =='combine':
    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, getKernel("closing"), iterations=2)
    opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, getKernel("opening"), iterations=2)
    dilation = cv2.dilate(opening, getKernel("dilation"), iterations=2)
    
    return dilation
    
    ##################################################################################
    
    def getBGSubtractor(BGS_TYPE):
    if BGS_TYPE == "MOG2":
    return cv2.createBackgroundSubtractorMOG2()
    if BGS_TYPE == "KNN":
    return cv2.createBackgroundSubtractorKNN()
    print("Detector inválido")
    sys.exit(1)
    
    ##################################################################################
    
    # Carregando o vídeo
    cap = cv2.VideoCapture(VIDEO_SOURCE)
    bg_subtractor = getBGSubtractor(BGS_TYPE)
    minArea = 150
    
    ##################################################################################
    
    # Configuração dos parametros Shitomasi e Lucas Kanade
    def SK():
    parameters_shitomasi = dict(maxCorners=100, # máx de nós
    qualityLevel=0.05, # aumenta pra achar mais e diminui pra achar menos
    minDistance=30) # distancia entre pontos
    parameters_lucas_kanade = dict(winSize=(15, 15),
    maxLevel=2,
    criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.05))
    colors = np.random.randint(0, 255, (100, 3))
    
    ret, frame = cap.read()
    frame_gray_init = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    edges = cv2.goodFeaturesToTrack(frame_gray_init, mask=None, **parameters_shitomasi)
    mask = np.zeros_like(frame)
    # print(edges) #localização dos pontos inicias marcados
    print(len(edges)) # contagem de pontos indentificados
    # print(mask)
    # print(np.shape(mask)) #dimensão do vídeo
    
    while (cap.isOpened):
    ok, frame = cap.read()
    
    if not ok:
    print("ERRO...")
    break
    
    bg_mask = bg_subtractor.apply(frame)
    fg_mask = getFilter(bg_mask, 'combine')
    
    # Resultado da subtração de fundo
    result = cv2.bitwise_and(frame, frame, mask=fg_mask)
    
    # Passamos como parâmetro ao Tracker o resultado do BGS
    frame_gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)
    new_edges, status, errors = cv2.calcOpticalFlowPyrLK(frame_gray_init, frame_gray, edges, None, **parameters_lucas_kanade)
    news = new_edges[status == 1]
    olds = edges[status == 1]
    
    for i, (new, old) in enumerate(zip(news, olds)):
    a, b = new.ravel()
    c, d = old.ravel()
    
    a, b, c, d = int(a), int(b), int(c), int(d)
    
    mask = cv2.line(mask, (a, b), (c, d), colors[i].tolist(), 2)
    
    frame = cv2.circle(frame, (a, b), 5, colors[i].tolist(), -1)
    
    img = cv2.add(result, mask)
    
    cv2.imshow('BGS + Optical flow', img)
    
    if cv2.waitKey(1) == 13:
    break
    
    frame_gray_init = frame_gray.copy()
    edges = news.reshape(-1, 1, 2)
    
    cv2.destroyAllWindows()
    cap.release()
    
    # Acionamento do main()
    
    SK()
    
    ##################################################################################
    
    
    ERRO: 
    
    Traceback (most recent call last):
    File "C:\Users\Pedro Henrique\PycharmProjects\IC\main.py", line 137, in <module>
    SK()
    File "C:\Users\Pedro Henrique\PycharmProjects\IC\main.py", line 109, in SK
    news = new_edges[status == 1]
    TypeError: 'NoneType' object is not subscriptable