Jesteś jednym z fanów Harrego Pottera i jego pelerynki niewidki? Też chciałeś zawsze taką mieć? Teraz jest już na wyciągnięcie ręki 🙂

W tym materiale będziemy bazować na informacjach przekazanych w poprzedzającym artykule z którym warto się zapoznać:

Ten materiał pozwoli na samodzielną zabawę z peleryną niewidką generowana na obrazie Video. Nie będzie to w szczegółach opisane rozwiązanie, gdyż wiele z zagadnień zostało opracowanych w zaciszu laboratoriów i eksperymentów, które nie są niezbędne do wykorzystania ich efektów w praktyce. Natomiast na końcu każdy z nas będzie w stanie wykorzystać swoją własną pelerynę.

Biblioteki

Skorzystamy tutaj z podstawowych bibliotek do przetwarzania obrazu, które zostały omówione w innych materiałach:

import cv2
import numpy as np
import time
import argparse

OpenCV ( czyli cv2 w pythonowym środowisku), Numpy do działań na liczbach, time do zarządzania czasem oraz prosta biblioteka argparse która pozwala nam na przekazanie ścieżki do pliku jako argument.

Tworzenie miejsca do przechowywania video

Video jest bardzo podobne do przetwarzania obrazu. Video jest reprezentacją obrazów występujących jeden po drugim w określonej kolejności, jeśli jesteśmy w stanie przetworzyć jeden obrazek to jedyne co musimy zrobić w przypadku video to zrobić pętlę która zrobi wiele razy czynność która zdefiniowaliśmy dla pojedynczego przypadku.

Zdefiniujmy obiekt cap oraz out które pozwolą nam na przechwycenie obrazu z kamery oraz out do zapisu efektu końcowego

print("""

Pelerynka niewidka jest ładowana

Przygotuj się na Magię technologii :)

    """)

# Tworzenie obiektu pracującego na pliku video
cap = cv2.VideoCapture(0)
width=int(cap.get(3))
height=int(cap.get(4))

# Definicja atrybutów w tym kodeka który będzie użyty to zapisania pliku wyjściowego
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 30.0, (width,height))

# Czas dla kamery, aby zdążyła się wczytać
time.sleep(3)
count = 0
background=0

Przetwarzanie jednej klatki

Tak jak w przypadku róży korzystaliśmy z mask aby wyodrębnić jeden kolor tak w przypadku pelerynki niewidki skorzystamy z podobnego mechanizmu i powtórzymy go dla każdej z klatek video.

W moim wypadku, jako że mam czerwoną pelerynę niewidkę wykorzystam reprezentacje HSV koloru czerwonego:

# Zapisujemy pierwsze 60 klatek jako obraz podstawowy. Przy ustawieniu 30 klates/sek będą to pierwsze 2 sekundy
for i in range(60):
	ret,background = cap.read()

#background = np.flip(background,axis=1)

while(cap.isOpened()):
	ret, img = cap.read()

	if not ret:
		break
	count+=1
	#img = np.flip(img,axis=1)
	
	# Zamiana reprezentacji kolory z BGR na HSV
	hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

definicja koloru naszej peleryny:

	# Tworzenie maski kolorów które będą reprezentować "pelerynke niewidkę"
	lower_red = np.array([0,120,70])
	upper_red = np.array([10,255,255])
	mask1 = cv2.inRange(hsv,lower_red,upper_red)

	lower_red = np.array([170,120,70])
	upper_red = np.array([180,255,255])
	mask2 = cv2.inRange(hsv,lower_red,upper_red)

	mask1 = mask1+mask2

Kolejnym krokiem jest wykorzystanie maski naszej peleryny niewidki do stworzenia obrazu wyjściowego, robimy to wykorzystując transformację na które w łatwy sposób pozwala nam biblioteka OpenCV:

	# Działania przetwarzające maski niezbędne do stworzenia efektu pelerynki niewidki
	mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3,3),np.uint8),iterations=2)
	mask1 = cv2.dilate(mask1,np.ones((3,3),np.uint8),iterations = 1)
	mask2 = cv2.bitwise_not(mask1)

	# Tworzenie widoku wyjściowego przy użyciu maski
	res1 = cv2.bitwise_and(background,background,mask=mask1)
	res2 = cv2.bitwise_and(img,img,mask=mask2)
	final_output = cv2.addWeighted(res1,1,res2,1,0)

	print(type(final_output))

	out.write(final_output)

	cv2.imshow('Magia Technologi !!!',final_output)

Ostatnim krokiem jest wyłączenie kamerki oraz przetwarzania którą realizujemy przyciskiem ESC.

    # wciśnij ESC aby zatrzymać przetwarzanie/nagrywanie
	k = cv2.waitKey(30)
	if k == 27:
		break
        
cap.release()
out.release()
cv2.destroyAllWindows()

Wywołanie i korzystanie z pelerynki

Przygotuj swoją pelerynkę oraz potwierdź, że kolor jest rozpoznawalny, najlepiej wykonując testy włączając powyższy skrypt do momentu zadowalającego efektu.

Włącz skrypt nie będąc w kadrze po 3 sekundach wejdź w kadr weź do ręki pelerynę i zacznij z niech korzystać 🙂

Po skończeniu wciśnij przycisk ESC, plik „output.avi” zapiszę się do lokalizacji w której jest twój skrypt.

Możesz wywołać go podając ścieżkę do pliku już nagranego w tym wypadku jest to emil2.mp4

Bądź wywołać bez argumentu i włączy Ci się nagrywanie na żywo z kamerki komputera 🙂

python pelerynka_niewidka.py

Kod w jednej całości można znaleźć na koncie GitHub pod adresem

https://github.com/AnalitykEduPL/przetwarzanie-obrazu-AI/blob/master/peleryna_niewidka.py