Uma das abilidades indispensável para um projetista de visão computacional é sobre o uso máscaras. A capa de invisibilidade é um excelente exercício para compreensão dessa técnica.
Para repetir esse experimento você vai precisar dos seguintes itens.
- Python3
- Opencv-python ou opencv-contrib-python
- numpy
- Video de fundo
- Uma toalha ou lençou de cor vermelho (com edição pode ser outra cor)
Podemos dividir esse propblemas nos seguintes tópicos:
- Obtenção do fundo
- mascaras para cor vermelha
- Operações lógicas
import cv2 import numpy as np cap=cv2.VideoCapture("input.mp4") cap_fundo=cv2.VideoCapture("fundo.mp4") mean_fundo=[] # calcula mediana de de 10 frame for i in range(10): fundo=cap_fundo.read()[1] mean_fundo.append(fundo) fundo = np.median(np.array(mean_fundo),axis=0) fundo=fundo.astype(np.uint8) #gravar resultado fourcc = cv2.VideoWriter_fourcc(*'mp4v') h, w, _ =fundo.shape out = cv2.VideoWriter('my_saida.mp4', fourcc, 30, (h, w)) while(cap.isOpened()): ret,frame=cap.read() if not ret: break print(frame.shape) hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_red = np.array([0, 120, 70]) upper_red = np.array([30, 255, 255]) mask1 = cv2.inRange(hsv, lower_red, upper_red) lower_red = np.array([120, 120, 70]) upper_red = np.array([180, 255, 255]) mask2 = cv2.inRange(hsv, lower_red, upper_red) mask1 = mask1 + mask2 mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8)) mask1 = cv2.morphologyEx(mask1, cv2.MORPH_DILATE, np.ones((3, 3), np.uint8)) mask2 = cv2.bitwise_not(mask1) res1 = cv2.bitwise_and(frame, frame, mask=mask2) res2 = cv2.bitwise_and(fundo, fundo, mask=mask1) saida = cv2.addWeighted(res1, 1, res2, 1, 0) cv2.imshow("janela", saida) k = cv2.waitKey(3) #out.write(frame) if k == ord("q"): break cv2.destroyAllWindows()
Das linhas 8 à 14 pegamos os 10 primeiros frames do fundo e criamos um fundo usando a mediana. Isso pode ser útil caso tenha alguma variação luminosa durante a gravação do video.
for i in range(10): fundo=cap_fundo.read()[1] mean_fundo.append(fundo) fundo = np.median(np.array(mean_fundo),axis=0) fundo=fundo.astype(np.uint8)
Das linhas 27 à 38 criamos as máscaras para detectar nossa capa
A segmentação realizada aqui segue os passos desse artigo link. Com excessão de que a cor vermelho esta entre 120 a 30 do canal H. Assim precisamos definir duas mascas porque o OpenCV mapear o canal H até 180.
Ou seja, uma mascara pega a região de 0 a 30 e a outra de 120 a 180.
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_red = np.array([0, 120, 70]) upper_red = np.array([30, 255, 255]) mask1 = cv2.inRange(hsv, lower_red, upper_red) lower_red = np.array([120, 120, 70]) upper_red = np.array([180, 255, 255]) mask2 = cv2.inRange(hsv, lower_red, upper_red) mask1 = mask1 + mask2
Linhas 40 e 41 Aplicamos duas operações morfológica para remover ruídos e preencher buracos na máscara.
mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8)) mask1 = cv2.morphologyEx(mask1, cv2.MORPH_DILATE, np.ones((3, 3), np.uint8))
A mask1 tem valor 1 para a capa e 0 para o restante. A operação cv2.bitwise_not inverte criando a mask2. Assim quando aplicamos na imagem original, apenas a capa é removida.
mask2 = cv2.bitwise_not(mask1) res1 = cv2.bitwise_and(frame, frame, mask=mask2) res2 = cv2.bitwise_and(fundo, fundo, mask=mask1) saida = cv2.addWeighted(res1, 1, res2, 1, 0)
Na saída combinamos res1 e res2.
Se ficou com alguma dúvida deixe um comentário abaixo.
Creditos: learnopencv
15 Replies to “Capa de invisibilidade usando OpenCV”
Good post. I will want some time to absorb your article.. Petronella Clevie Shabbir
Way cool! Some extremely valid points! I appreciate you writing this article plus the rest of the website is extremely good. Deni Phip Melville
Thank you very much
Wow, this article is nice, my younger sister is analyzing these things, therefore I am going to convey her. Fredra Herb Rolan
Thank you very much
Very good post! We will be linking to this great post on our website. Keep up the great writing. Carey Chaim Merola
Very informative post. Really looking forward to read more. Cool. Josey Nicol Neall
Appreciation to my father who shared with me about this webpage, this web site is truly awesome. Adriana Trumann Oribel
Utterly written written content , appreciate it for selective information . Ericha Booth Dahle
Thanks to my father who told me on the topic of this weblog, this weblog is really awesome. Katleen Kyle Papagena
Excellent, what a website it is! This weblog provides helpful information to us, keep it up. Clarette Stanley Singh
I think this is among the most vital info for me. And i am glad reading your article. Lizzy Hill Marisa
We are a group of volunteers and opening a new scheme in our community.
Your web site provided us with valuable info to work on. You have done a formidable job and our entire community will be grateful to you.
Wow, this paragraph is fastidious, my younger sister is analyzing these things, therefore
I am going to inform her.
Pretty! This was an extremely wonderful post. Many thanks for providing this info.