Lorsque j'ai essayé de binariser les personnages de la vidéo, seuls la personne et le telop ont été extraits probablement parce que l'arrière-plan n'était pas dans l'environnement naturel et que rien n'était reflété, mais si la couleur de fond était jaune Je pensais que cela ressemblerait à un Grand Prix IPPON, alors je l'ai implémenté.
import cv2
import numpy as np
if __name__ == '__main__':
cap = cv2.VideoCapture('one_minutes.mp4')
cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
telop_height = 50
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
writer = cv2.VideoWriter('threshold_raw.mp4',fourcc, fps, (cap_width, cap_height + telop_height))
kernel = np.ones((3,3),np.uint8)
count = 0
try :
while True:
if not cap.isOpened():
break
if cv2.waitKey(1) & 0xFF == ord('q'):
break
ret, frame = cap.read()
if frame is None:
break
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ret2, frame = cv2.threshold(frame, 0, 255, cv2.THRESH_OTSU)
#Rétrécir->expansion
frame = cv2.morphologyEx(frame, cv2.MORPH_OPEN, kernel)
background = np.zeros((cap_height, cap_width, 3), np.uint8)
background[:] = tuple((80,235,247))
telop = np.zeros((telop_height, cap_width, 3), np.uint8)
telop[:] = tuple((128,128,128))
#Une fois monochrome(dim=1)De la couleur(dim=3)Conversion en
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
#Couleur et composition d'arrière-plan
frame = cv2.bitwise_and(frame, background)
images = [frame, telop]
frame = np.concatenate(images, axis=0)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, "{:.4f} [sec]".format(round(count/fps, 4)),
(cap_width - 250, cap_height + telop_height - 10),
font,
1,
(0, 0, 255),
2,
cv2.LINE_AA)
writer.write(frame)
count += 1
except cv2.error as e:
print(e)
writer.release()
cap.release()
ret2, frame = cv2.threshold(frame, 0, 255, cv2.THRESH_OTSU)
Il est binarisé avec. Ici, l'algorithme d'Otsu est utilisé.
frame = cv2.morphologyEx(frame, cv2.MORPH_OPEN, kernel)
Maintenant rétrécissez-> augmentez à partir de l'image binarisée et les taches blanches sont noircies au stade de la contraction pour éliminer le bruit.
background = np.zeros((cap_height, cap_width, 3), np.uint8)
background[:] = tuple((80,235,247))
background[:] = tuple((80,235,247))
#Une fois monochrome(dim=1)De la couleur(dim=3)Conversion en
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
#Couleur et composition d'arrière-plan
frame = cv2.bitwise_and(frame, background)
Crée une seule couleur d'arrière-plan jaune et la combine avec l'image binarisée avec bitwise_and
.
Cela peut être un peu déroutant, mais si vous regardez les noms des groupes ci-dessus, vous pouvez voir que le bruit disparaît lorsque la contraction est réduite.
J'ai pu séparer les objets assez proprement, donc la prochaine fois j'essaierai d'extraire les personnages.