Forum Replies Created
- AuthorPosts
Pedro,
poderia compartilhar o fonte completo? Assim consigo analisar e testar aqui também.
Ah e quando for mandar o fonte, por favor não esqueça de mandar em uma mensagem separada, adicionando como bloco de código, assim o script não perde a formatação original.
- This reply was modified 3 years, 1 month ago by
Dalton Vargas.
import numpy as np import cv2 import sys from random import randint # Criar um vetor para gerar cores aleatoriamente (R,G,B) TEXT_COLOR = (randint(0, 255), randint(0, 255), randint(0, 255)) BORDER_COLOR = (randint(0, 255), randint(0, 255), randint(0, 255)) FONT = cv2.FONT_HERSHEY_SIMPLEX VIDEO_SOURCE = "videos/walking.avi" # vetor de background subtractors BGS_TYPES = ["GMG", "MOG", "MOG2", "KNN", "CNT"] # definir qual BGS usar, inserindo o número que corresponde ao BGS selecionado no vetor de background subtractors # 0 = GMG, 1 = MOG, 2 = MOG2, 3 = KNN, 4 = CNT BGS_TYPE = BGS_TYPES[2] # Kernel: Elemento estruturante 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 # Filtros morfológicos para redução do ruído def getFilter(img, filter): ''' Esses filtros são escolhidos a dedo, apenas com base em testes visuais ''' 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 == "GMG": return cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=120, decisionThreshold=.8) if BGS_TYPE == "MOG": return cv2.bgsegm.createBackgroundSubtractorMOG(history=200, nmixtures=5, backgroundRatio=.7, noiseSigma=0) if BGS_TYPE == "MOG2": return cv2.createBackgroundSubtractorMOG2(history=500, detectShadows=True, varThreshold=100) if BGS_TYPE == "KNN": return cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True) if BGS_TYPE == "CNT": return cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15*60, isParallel=True) print("Unknown createBackgroundSubtractor type") sys.exit(1) # Carregar o video cap = cv2.VideoCapture(VIDEO_SOURCE) bg_subtractor = getBGSubtractor(BGS_TYPE) def SubtractorTracker(): # Inicialização do TRACKER parameters_shitomasi = dict(maxCorners = 100, qualityLevel = 0.3, minDistance = 7) parameters_lucas_kanade = dict(winSize = (15, 15), maxLevel = 2, criteria = (cv2.TERM_CRITERIA_EPS | cv2. TERM_CRITERIA_COUNT, 10, 0.03)) 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) while (cap.isOpened): ok, frame = cap.read() if not ok: print("Frame capture failed, stopping...") 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() mask = cv2.line(mask, (a,b), (c,d), colors[i].tolist(), 2) frame = cv2.circle(result, (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) SubtractorTracker()
- This reply was modified 3 years, 1 month ago by
Dalton Vargas.
Olá Pedro!
Parabéns pela ideia do projeto, é bem interessante!
Pelo que entendi, a ideia é aplicar o algoritmo subtrator de fundo e depois usar o resultado para o algoritmo Optical Flow rastrear, seria isto?
Se sim, pelos fontes que você mandou, você estava chegando lá, só faltavam ajustar os parâmetros das imagens usadas entre os dois algoritmos.
Fiz uma implementação simples baseada nesta ideia, vou mandar na próxima resposta aqui. Provavelmente você terá que ajustar os parâmetros de cada algoritmo de acordo com seu projeto, pois deixei a parametrização padrão de cada um.
Poderia compartilhar o erro?
import numpy as np import cv2 import sys from random import randint TEXT_COLOR = (randint(0, 255), randint(0,255), randint (0,255)) BORDER_COLOR = (randint(0, 255), randint(0,255), randint (0,255)) FONT = cv2.FONT_HERSHEY_SIMPLEX # ////////////// # VIDEO_SOURCE =”Video/Traffic_4.mp4″ # Correção: VIDEO_SOURCE = "videos/Traffic_4.mp4" #print (TEXT_COLOR) # ///////////////// # BGS_TYPES = ('GMG', 'MOG', 'MOG2', 'KNN', 'CNT') # Correção: # Neste vetor de BGS deve ser em aspas duplas e não simples, # também estava entre parenteses e o correto é entre colchetes BGS_TYPES = ["GMG", "MOG", "MOG2", "KNN", "CNT"] #print(BGS_TYPES[1]) 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 #print(getKernel('opening')) def getFiltrer(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): # Correção: # deve ser em aspas duplas e não simples, # if BGS_TYPE == 'GMG': if BGS_TYPE == "GMG": return cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames = 120, decisionThreshold=0.8) # Correção: # deve ser em aspas duplas e não simples, # if BGS_TYPE == 'MOG': if BGS_TYPE == "MOG": return cv2.bgsegm.createBackgroundSubtractorMOG(history=200, nmixtures=5, backgroundRatio=0.7, noiseSigma=0) # Correção: # deve ser em aspas duplas e não simples, # if BGS_TYPE == 'MOG2': if BGS_TYPE == "MOG2": return cv2.createBackgroundSubtractorMOG2(history=500, detectShadows=True, varThreshold=100) # Correção: # deve ser em aspas duplas e não simples, # if BGS_TYPE == 'KNN': if BGS_TYPE == "KNN": return cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True) # Correção: # deve ser em aspas duplas e não simples, # if BGS_TYPE == 'CNT': if BGS_TYPE == "CNT": # Correção: # Precisa incluir o bgsem para acessar ao BG CNT # return cv2.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15*60, isParallel=True) return cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15*60, isParallel=True) print("Detector inválido") sys.exit(1) cap = cv2.VideoCapture(VIDEO_SOURCE) bg_subtractor = getBGSubtractor(BGS_TYPES[4]) def main(): while cap.isOpened(): ok, frame = cap.read() #print('frame.shape') if not ok: print('Erro') break frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5) #print(frame.shape) bg_mask = bg_subtractor.apply(frame) fg_mask = getFiltrer(bg_mask, 'dilation') cv2.imshow('Frame', frame) cv2.imshow('BG mask', bg_mask) cv2.imshow('BG mask filtrer ', fg_mask) if cv2.waitKey(1) & 0xFF == ord('q'): break main()
Luiz,
Fiz as correções no seu fonte e testei com todos os BGS, a princípio está tudo funcionando. Segue abaixo:
- This reply was modified 3 years, 1 month ago by
Dalton Vargas.
Oi Luiz!
Estou analisando o código, assim que eu terminar mando aqui pra você.
Certo Luiz, então precisamos revisar os seus fontes 😀
3º Caso o erro persista, encaminhe seu script completo e também compartilhe a mensagem de erro, assim consigo analisar melhor o que pode estar acontecendo.
Fico no aguardo.
Olá Luiz!
Normalmente o erro -215:Assertion failed ocorre quando não foi possível carregar a imagem/vídeo de entrada.
Poderia compartilhar o código completo? Preciso revisar todas as funções, o carregamento do vídeo, importação das bibliotecas… Este que você mandou tem só as chamadas.
Certo, agora se puder dar uma olhada nas outras duas sugestões que mandei na mensagem anterior:
2º Verifique se você fez a instalação do opencv-contrib (pip install opencv-contrib-python);
3º Caso o erro persista, encaminhe seu script completo e também compartilhe a mensagem de erro, assim consigo analisar melhor o que pode estar acontecendo.
Olá Luiz!
Seguem algumas sugestões para solucionar o problema:
1º Por favor, tente adicionar uma nova importação:
import bgsubcnt # Depois crie o subtrator de fundo desta maneira:
return bgsubcnt.createBackgroundSubtractor()
2º Verifique se você fez a instalação do opencv-contrib (pip install opencv-contrib-python);
3º Caso o erro persista, encaminhe seu script completo e também compartilhe a mensagem de erro, assim consigo analisar melhor o que pode estar acontecendo.
Olá Roberto!
Poderia compartilhar seu script e (se for possível) mandar uma cópia ou link do vídeo que você está testando? Já usei este algoritmo com vídeos nesta qualidade e a princípio não tive problemas, por isso imagino que pode ser algo na codificação, talvez o rastreador não está sendo inicializado ou atualizado para o frames subsequentes.
Olá Paula!
Para detectar quando algo se move e passa por determinado local, a ideia seria a mesma daquele exemplo aqui do curso, onde fazemos a contagem de veículos:
- neste exemplo analisamos o movimento dos objetos na vertical, certo?
- o ajuste que você precisaria fazer seria nisso, usar as coordenadas na horizontal para analisar o movimento na horizontal e definir os limites da ROI (linhas de entrada e saída), assim quando o objeto se move da esquerda para a direita, ou vice-versa, e entra nestes limites, ai você configura algum tipo de notificação como você falou acima. Neste mesmo exemplo foi implementada a ideia de tirar uma foto quando o objeto é detectado dentro destes limites.
Atenciosamente,
Dalton
Olá Felipe!
Poderia compartilhar seu script completo, assim consigo analisar melhor.
Fico no aguardo!
Atenciosamente,
Dalton
- This reply was modified 3 years, 5 months ago by
Dalton Vargas.
Olá Wagner!
Poderia compartilhar o erro?
- This reply was modified 3 years, 1 month ago by
- AuthorPosts