
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