Teredo Blog

Zastosowanie cv2.compare do usuwania tła.

Usuwanie tła to jeden z problemów przetwarzania obrazów, który wydaje się być łatwy, a sprawia spore problemy.  W bibliotece OpenCV jest sekcja usuwania tła  w kontekście wideo. Pojawiają się tam funkcje typu: BackgroundSubtractorMOG , BackgroundSubtractorMOG2 czy BackgroundSubtractorGMG. Usuwają one tło z poszczególnych klatek tworząc maskę, którą można użyć do podświetlania interesujących nas obiektów. Z jednej strony te funkcje nie są idealne, z drugiej strony często posiadamy tylko dwie klatki, w których na jednej jest samo tło, a na drugiej mamy to samo tło z interesującym nas obiektem.  I chociaż możemy skorzystać z powyższych funkcji, to kusi skorzystanie z czegoś prostszego (może bardziej precyzyjnego).

 

Jeśli nasze klatki zawierają “laboratoryjnie” przygotowany obraz, czyli tło jest bez przesunięcia, a każdy piksel tła na jednym obrazie odpowiada pikselowi na drugim obrazie, również wartości tych pikseli są identyczne, sprawę można ograć funkcją compare. Oto jak można to zrobić:

Tworzenie maski zaczynamy od wrzucenia obrazu do cvtColor tworząc obraz jednowarstwowy, później obraz przechodzi przez węzeł compare z ustawionym code na CMP_NE.  Oprócz poszukiwanego śladu, mogą pojawić się artefakty w losowych miejscach, spowodowane one są kompresją. Niewielkie różnice w wartościach pikseli mogą zależeć od rodzaju kompresji oraz jej parametrów. Artefakty usuwamy funkcją erode. Tak przygotowaną maskę możemy wrzucić do bitwise i w efekcie można uzyskać obiekt bez tła.  Takie podejście jest autonomiczne i nie wymaga zmian parametrów dla innych przypadków.

 

Do usuwania tła jest też inna ciekawa metoda, oparta na funkcji watershed. Jest ona bardzo dokładna, jednak wymaga podania kluczowych regionów obiektu, który chcemy odseparować od tła.  Opiszę ją już następnym razem.

“Kompilacja” kodu Python-a

Czasami trzeba udostępnić komuś aplikacje chcąc jednoczenie zachować pewne fragmenty kodu jako ukryte. Dzieje się tak w przypadku aplikacji stacjonarnych, gdzie użytkownik ściąga sobie cały program, by później móc go uruchamiać na swoim komputerze bez potrzeby łączenia się gdziekolwiek. W Pythonie jest z tym mały problem, ponieważ  jest to język interpretowany. Szczerze  mówiąc jest to duży problem, gdyż na dzień dzisiejszy 2018 r. nie ma możliwości, by w 100%-tach zabezpieczyć kod pythona przed podglądnięciem.

Bez wchodzenia w szczegóły, przy pomocy samego Python-a można “skompilować” kod do postaci nie czytelnej dla człowieka. Dekompilacja takiego kodu nie jest trywialna nawet dla zaawansowanych użytkowników.  W większości przypadków jest to wystarczająca forma.

Kompilowanie wszystkich plików py w bieżącym katalogu:

python -m compileall .

Bibliografia:

  • http://effbot.org/zone/python-compile.htm
  • https://docs.python.org/3/library/compileall.html#module-compileall

O, o … ImportError: DLL load failed: The specified procedure could not be found.

Problem z plikami DLL pod Windows-em gdy używa się bibliotek takich jak numpy czy OpenCV , może przysporzyć sporo problemów. Często problem stanowi brak standardowych bibliotek VisualStudio, w których była kompilowana dana biblioteka, wtedy wystarczy  Visual C++ redistributable 2015  w odpowiedniej wersji lub Universal C Runtime. Choć czasem to nie wystarcza i pojawia się problem jakiej biblioteki nam brakuje i w jakiej powinna być wersji.

Z pomocą przychodzą nam dwa narzędzia.  Dependencywalker – sprawdzanie zależności w Windows.  Jest to bardzo stare narzędzie i nie zawsze umie sobie rozwiązać dobrze wszystkie zależności. I jest też procmon, tutaj można się dowiedzieć jakich i gdzie nasz Python szuka bibliotek i dlaczego to mu się nie udaje.

 

Copyright © 2018 Teredo Blog

Theme by Anders NorenUp ↑