Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP i analiza zdjęć ?
Forum PHP.pl > Forum > PHP
marcus753
Witam jeśli źle wybrałem temat to proszę o jego przeniesienie i z gory przepraszam

Interesuje mnie czy jest możliwość analizy zdjęcia za Pomocą PHP ew, jakiś JS itp.

Mianowicie chciałbym napisać program który porównuje 2 zdjęcia i pokazuje różnice na tych dwóch zdjęciach

Czy coś takiego jest wogóle możlie ? przy użyciu tych języków czy muszę w to angażować "normalne" języki takie jak c++ czy delphi

Z góry dziękuję za pomoc i pozdrawiam, mam nadzieje że nie jest to OFF TOPIC ...
Pawel_W
Temat: klasa Porwnanie dwch obrazkw
marcus753
Dzięki właśnie czegoś takiego szukałem

  1.  
  2. <?php
  3. 2.
  4. $compare = new ImageCompare('sim1.jpg', 'sim2.jpg');
  5. 3.
  6. // Najpierw skrypt wyswietli skale podobienstwa w procentach a potem poda liczbe p
  7. odobnych punktow
  8. 4.
  9. $echo = $compare->drawPercentage()." - ".$compare->similarity."/25";
  10. 5.
  11. echo $echo;
  12. 6.
  13. ?>


zastanawiam się tylko czy jest jakaś możliwość ustawienia tolerancji
rozumiem że jeżeli w similarity wpisze zamiast 25 np 100 to liczba punktów zostanie zwiększona do 100 ?

Ogólnie mam chytry plan

Mianowicie chce napisać program który pobierał by zdjęcia z kamer na ulicach np. w krakowie a następnie w tabeli pokazywał by jaki ruch jest na jakiej ulicy...

Zadanie karkołomne wiem dlatego na razie zbieram materiały i rozplanowuje grafik prac

Myślę że na początku przydało by się zdjęcie zupełnie pustej drogi które było by porównywalne ze zdjęciem aktualnym (szukali byśmy odstępstw od orginalnego zdjęcia) im było by ich więcej tym większy byłby ruch.

musze poszukać w bibliotekach PHP jakiś gotowców które się dobiorą do konkretnych pikseli mam nadzieje że coś takiego istnieje...
Fifi209
A zastanawiałeś się może, że przy zmiennych warunkach atmosferycznych czy upływie czasu będą bardzo duże odstępstwa od zdjęcia "czystego" (bez aut) ?
marcus753
biorę wszystkie rozwiązania pod uwagę myślę że można to wyeliminować biorąc za szukany cel światła samochodów ile będzie tych świateł na drodze tak duży będzie ruch problemem są warunki atmosferyczne deszczowo słonecznie (możliwość odbijania się swiateł) problem ze skrzyżowaniami dróg (trzeba by było wtedy wyznaczyć obszar przeszukiwania zdjęcia) najgorsze są właściwości obrazu z różnych kamer...
Crozin
Eee... takie coś jak kombinujesz nie przejdzie. Wspomniane powyżej warunki atmosferyczne już właściwie dyskwalifikują Twój pomysł. Poza tym jak rozróżnisz w taki sposób jeden stojący TIR na skrzyżowaniu od grupy 60 osób np. na jakiejś manifestacji?

Zadanie rzeczywiście jest trudne ponieważ ciężko w ogóle zdefiniować kiedy ruch jest duży, kiedy mały. Zależy to od dziesiątek zmiennych, które trzeba by było uwzględnić w takich algorytmie. Ruch może zostać zablokowany przez jeden pojazd. Równie dobrze w tym samym miejscu może płynnie poruszać się 30 pojazdów. IMO musiałbyś jakoś sprawdzać płynność ruchu rozpoznanych obiektów itp. Ich wykrycie samo w sobie wcale nie wydaje mi się najtrudniejszym zadaniem.
marcus753
co do liczby osób myślę że kierowanie się liczbą świateł na zdjęciu rozwiązuje ten problem
Jeżeli chodzi o częstotliwosć jeżeli ruch jest duży mamy więcej samochodów (czyli więcej świateł) keżeli jest korek jest jeszcze więcej bo samochody stoją w małych odstępach od siebie mniej niż 1m jak jedziesz 50 km/h to odstęp wynosi trochę więcej więc i liczba samochodów możliwych do uchwycenia na jednym zdjęciu się zmniejsza...

Przykładowe zdjęcie

aktualne zdjęcie:

zdjęcie z 20:15 :


Trzeba by było tutaj wydzielić obszar który algorytm by brał pod uwagę tak aby ominąć latarnie itp. wystarczy policzyć tylko liczbę świateł w danym fragmencie zdjęcia (muszę porównać to zdjęcie ze zdjęciem zrobionym w dzień i zobaczyć jak bardzo różnią się światła... Problemem może być grupka samochodów po lewej stronie ale biorąc pod uwagę że przed droga jest prawie pusta można by wywnioskować że są to tylko światła a nie korek na całej drodze.

Myślałem o tym chwile i wymyśliłem taki mechanizm

Algorytm stosuje się tylko do jednego obrazu z kamery dla każdej kamery będzie on się nieco różnił

Najpierw sprawdzamy która jest godzina (dzień czy noc) (w zależności od tego jaki światła w samochodzie będą miały kolor
Następnie robimy pętle która
dzieli zdjęcie (wyznaczony obszar) na poszczególne piksle
sprawdza czy odcień danego piksla zgadza się z pikslem wzorcowym oraz zapisuje w zmiennej pozycję każdego takiego piksla
gdy mamy już całe zdjęcie przeskanowane zajmujemy się analizą wyników
musimy rozważyć możliwość zagęszczenia pojazdów jezeli w promieniu kilkudziesięciu pkt. piksle które znaleźliśmy tworzą jednolitą plame oznacza o że mamy zgrupowanie pojazdów musimy sprawdzić fragment drogi przed nimi jeżeli jest pusty jeśli tak wystarczy nam przyblizona wielkość takiej plamy przypisana do zmiennej którą wykorzystamy potem a całą tą plamę ignorujemy dla dalszego kroku jeżeli taka plama pokrywa całą drogę oznacza to że jest mocno zakorkowana.
jeżeli odległość od siebie wyszukanych piksli jest mała np 15 pkt ignorujemy takie piksle (w ten sposób jednemu światłu samochodu które składa się z kilku piksli będzie odpowiadał jeden piksel właściwy)
liczymy liczbę piksli właściwych i dzielimy na 2 w ten sposób mamy przybliżoną liczbę samochodów na zdjęciu teraz trzeba się jeszcze zająć tą plamą znając jej wielkość można również w przybliżeniu podać liczbę samochodów tworzących taką plamę

Fragment poddanego analizie w ten sposób zdjęcia będzie pokrywał jeden kierunek ruchu fragment zdjęcia po którym samochody jadą z przeciwnej strony będzie trzeba poddać podobnej analizie

Co o tym myślicie ? teraz pytanie jak to wszystko napisać...

znalazłem na necie algorytm wycinający fragment zdjęcia

  1. 1. header("Content-type: image/jpeg");
  2. 2. $image = imagecreatefromjpeg("tygrys.jpg");
  3. 3. list($width, $height) = getimagesize("tygrys.jpg");
  4. 4. $new_width = 780;
  5. 5. $new_height = 840;
  6. 6. $image_new = imagecreatetruecolor($new_width, $new_height);
  7. 7. imagecopyresized($image_new, $image, 0, 0, 140, 100, $new_width, $new_height,
  8. 260, 280);
  9. 8. imagejpeg($image_new);


zastanawiam się jak ustalić kolor wycięteg w ten sposób piksla ;/

pewnie będę miał potężny problem z napisaniem czegoś takiego bo nigdy nie korzystałem z biblioteki GD ciekawe jak będzie wyglądała wydajność można by było ew. zliczać nie 1 piksel a 4...

żeby nie było za prosto znalazłem jeszcze takie zdjęcie:



widzimy tutaj światło samochodu które odbija się od drogi w takim przypadku mój algorytm uznał by że jest to zgrupowanie pojazdów jak to wyeliminować ? nie mam pojęcia sciana.gif
thek
To nie jest takie proste. W ciągu dnia zwłaszcza. Co z tego, że światła będą widoczne w nocy, skoro w dzień kompletnie nie zauważysz ich latem choćby. Wtedy algorytm możesz wyrzucić do kosza. duże gabarytowo pojazdy zakłamują wynik bo nigdy nie wiesz tak naprawdę z jaką ilością masz do czynienia. Mógłbyś zawęzić analizę zdjęcia do określonego obszaru wielokątnego i wprowadzać filtry choćby na zasadzie dużych różnic w luminescencji, choć moim zdaniem najbardziej sensowny byłby tu filtr mieszany związany, między innymi z detekcją kształtu. tyle, że tego typu rozwiązania mogą być na zwykłym obrazie kolorowym mało widoczne. Musiałby więc być wcześniej potraktowany funkcją detekcji krawędzi lub inną, bardziej uwyraźniającą szczegóły. Potem filtr związany z detekcją reflektorów. Dopiero ileś testów mogło by Cię upewnić czy działa ona wydajnie i poprawnie. Poza tym tutaj działałbyś na pojedynczych zdjęciach i informacje uzyskane z iluś pomiarów byłyby dopiero bazą do stwierdzenia jaki ruch panuje. Informacje więc musiałyby być dla każdego zdjęcia w jakiejś formie o położeniu świateł i ich ilości przechowywane. Korek to byłoby wiele świateł z niewielką zmianą ich położenia. Mały ruch niewielka ilość, duży ale płynny to światła w większej ilości, ale z dużymi zmianami pomiędzy kolejnymi ujęciami. Trzeba też wziąć pod uwagę zasłanianie się świateł pojazdów. Czyli nie zawsze dwa światła to jeden pojazd, tylko dwa stojące w ciągu. Sześć reflektorów to mogą być nie trzy samochody, ale jeden widoczny w całości i cztery za nim tutaj musiałbyś się posługiwać eliminacją reflektorów na zasadzie różnic "w poziomie". Te na tej samej wysokości to zapewne jeden pojazd. Na różnych to może być albo kilka pojazdów, albo jeden zakręcający. Wiele musisz przemyśleć smile.gif
Crozin
Pomysł z liczeniem świateł nie jest zbyt dobry:
1) Nie masz gwarancji, że wszyscy mają je włączone
2) W słoneczne dni ich wykrycie może być problematyczne
3) Ktoś może mieć więcej niż parę włączonych świateł z przodu (od chociażby przeciwmgielne)
4) Motocykle mają tylko jedno źródło światła
5) Jak już wyżej wspomniano możesz mieć problem z lokalizacją świateł - mogą być przysłonięte nawet niedużym pojazdem (stojąc blisko siebie w korku)
6) Na drodze mogą pojawić się inne źródła światła (np. podczas robót drogowych)

Można by pewnie jeszcze kilka rzeczy wymienić
marcus753
witam prace nad algorytmem cały czas trwają a oto pierwsze efekty:

opracowałem 2 metody filtracji wyjątków (krawędzie światła itp) każda z metod jest w 12 stopniowej skali...

a oto pare zdjec:





wszystkie 25 zdjęć jest dostępnych tu:

http://img202.imageshack.us/gal.php?g=23po...ywarka31120.jpg

myślę teraz nad wybraniem najlepszych 2 zdjęć z 1 i 2 metody nałożenie ich na siebie i przepuszczenie przez kolejny filtr który usunie zbedne zaznaczenie...
thek
Na tym etapie już widzisz dlaczego sygnalizowałem podział na obszary. Jedna ulica tłoczna, druga niemal pusta. Oprócz tego lampy i światełka, odbicia (refleksy na obiektach + światła odblaskowe ) też swoje robią. Podział na fragmenty w jakich szukasz dałby Ci informację o natężeniu w określonym obszarze, a co za tym idzie identyfikacja obszaru niosłaby informacje gdzie jest mniej więcej jakie natężenie świateł.
Blame
Ja jaszcze ze swojej strony chciałbym zauważyć, że latarnie nie świecą się cały dzień non stop. Więc skrypt może brać pod uwagę również daną porę dnia. W tym przypadku trzeba by było również uwzględnić porę roku. Ogólnie to nie wiem co cie podkusiło tongue.gif choć pomysł, ni powiem, bardzo oryginalny. Nie wiedziałem że można coś takiego zrobić za pomocą PHP.
marcus753
napotkałem kolejny problem ilość danych ;/ w sumie mój kod ma już ponad 1000 linijek i składa się z 9 skryptow jestem wstanie wyszukiwać całe grupy wyróżniających się piksli i rozróżniać czy ukłądają się koliście czy w linii w sumie myślę że jeszcze z 300 linijek kodu i będę kończył winksmiley.jpg

problem jaki mnie uderzył to ilość danych ;/ jeden skrypt przetwarza kilka tysięcy zmiennych a same informacje o kolorach piksli to ponad 360 000 myślę że wszystkie skrypty przetwarzaja i tworzą ponad 1 milion zmiennych...

problemy w tym że to wszystko zaczyna mi się walić zawieszać i nie działać ;/ dlatego postanowilem podzielić zdjecie na grupy i traktować je jak zlepek małych zdjęć i na nich prowadzić kluczowe obliczenia a wyniki tych prac polaczyc w całość winksmiley.jpg



thek pamiętasz jak mi pomogłeś z zadaniem grupowania pionków ? było mi ono właśnie potrzebne do tego projektu party.gif bo teraz usunięcie np. odblasku jest banalnie proste bo w przeciwienstwie do swiatel czy samochodu tworzy długa smugę...

ja cały czas piszę mój skrypt winksmiley.jpg lecz doszedłem do takiego momentu że zastanawiam zastanawiać się nad sieciami neuronowymi...
projektował ktoś już takie sieci z was ? jak myślicie sprawdzą się w tym zadaniu czy będzie to raczej syzyfowa praca ?
thek
Zgadnij jaką miałem specjalizację na studiach... Jeśli nie czytałeś moich postów to powiem: Sztuczna inteligencja. A to właśnie do niej kwalifikują się sieci neuronowe winksmiley.jpg Do tego typu zadań nie jest to dobre rozwiązanie. Sieci neuronowe działają na zasadzie przydzielania do najbardziej zbliżonego wzorca, który wcześniej przetworzyły w procesie "nauki". Tyle, że Twoja sieć neuronowa dane do wzorców otrzymywałaby tak naprawdę z każdym zdjęciem i co chwilę musiałbyś kontrolować jej wyniki oraz co chwilę uczyć dokładając kolejne wzorce. Sieci są dobre do zadań optymalizacyjnych czy rozpoznawania z góry znanych wzorców (OCR). W Twoim problemie niestety nie są one w żaden sposób pomocne, gdyż nie jest on ani optymalizacyjny, ani nie ma w nim określonych wzorców do wyuczenia.
Jeśli ode mnie to by zależało to kombinowałbym nieco inaczej. Określałbym porę dnia i tym samym ogólną jasność otoczenia. Czemu? Bo dzięki temu wiedziałbym jakiej "barwy" świateł się mam spodziewać. Tutaj pomogłoby mi określanie wschodu i zachodu słońca, bo tym współczynnikiem modyfikowałbym "zakres poszukiwań" winksmiley.jpg Dzięki temu mógłbym po iluś zdjęciach z dużą pewnością określić co jest, a co nie jest "tłem". Zauważ, że porównując kilka, kilkanaście zdjęć z bliskiego okresu czasu pewne piksele zawsze będą miały tę samą lub minimalnie różną wartość (to także prosty sposób by wyeliminować stałe refleksy od lamp w kałużach choćby winksmiley.jpg ). To będzie zapewne tło. Jeśli za każdym razem to tło będziesz "odejmować" to przeprowadzisz coś w stylu progowania. Mocno odstające punkty będą Cię wtedy interesować. Można też spojrzeć tak, że światła w określonych godzinach to punkty o określonej barwie czy luminescencji i cały obrazek tylko pod ich kątem przeszukiwać. Bardzo szybko też zauważysz, że nawet obszary obecne można zredukować do "ścieżek", po których poruszają się te punkty. Zamiast więc sprawdzać całe partie, będziesz sprawdzał jedynie wąskie pasma tak naprawdę.
Myślę, że odpowiedni miks wszystkich tych rozwiązań mógłby dać w miarę już poprawne wyniki. Problemem nadal pewnie pozostała by wydajność...
marcus753
thek kolejny raz rozwiewasz moje wątpliwości winksmiley.jpg dobrze że jesteś na tym forum guitar.gif

sposób przy użyciu normalnych algorytmów mam w miarę opracowany co do wschodów czy zachodów słońa to nie chciał bym się w to bawić wole jak algorytmy są w miarę inteligentne już mądrzejsze wydaje mi się było by aby algorytm sam sprawdzał czy jest dzień i noc na podstawie kolorów całego zdjęcia...

ja jak narazie opracowałem metodę która wykrywa duże kontrasty pomiędzy pikslami w sumie to kilka metod z różną tolerancją na podstawie testów wytypowałem 2 najlepsze metody i 2 najlepsze tolerancje dla każdej z tych metod które są wyliczane indywidualnie dla każdego obszaru nie zdjęcia ! dzięki czemu mogę ograniczyć znalezione piksle na horyzoncie drogi gdzie światła i samochody zaczynają się zlewać
następnie je grupuje i wszystkie wyniki zapisuje do jednego pliku i z tego obszaru piksli i wtedy zaczyna się analiza wstępnych wyników nad którą właśnie pracuję w sumie mam kilkanaście pomysłów eksperymenty powiedzą które będą najlepsze winksmiley.jpg

ciesze się że te sieci to jednak zły pomysł bo już napisałem kilkaset linii kodu i jeśli miało by to się okazać bezsensu to bym się trochę podłamał sadsmiley02.gif
thek
A próbowałeś się "bawić" z "odejmowaniem" obrazów? smile.gif Co mam na myśli? Wspomniałem o tym w poprzednim poście. Nakladasz na siebie dwa obrazy i "odejmujesz" jeden od drugiego. Dzięki temu "zerujesz tło" i zaczynają się uwidaczniać obiekty poruszające się między klatkami - coś w stylu prostego detektora ruchu. Jak zapewne zauważysz, im wieksza różnica koloru między nimi tym efekt będzie lepszy, lepiej dostrzegalny. Niezależnie od pory roku czy doby. Jedynie obiekty o zbliżonej do tla barwie trudniej bylyby wychwytywalne.
marcus753
tylko wtedy pojawia się inny problem np. jeśli na drogę spadnie śnieg na jednym zdjęciu jest czarna a zaraz potem biała gdy zostanie odśnieżona i rozjerzdzona znowu jest czarna...
thek
Przecież nie spadnie Ci nagle tona śniegu na jezdnię winksmiley.jpg Zdjęcia masz co ileś sekund/minut, więc przez ten czas zmiany nie powinny być aż tak drastyczne. Najlepiej będzie jeśli sprawdzisz sobie efekty takiej operacji. Tylko weź pod uwagę, że możesz "przekręcić" kolory od ciemnego odejmując jasny (jezdnia na nowym vs światło na starym) smile.gif No ale myślę, że to akurat nie jest bardzo poważny problem.
marcus753
Zakładam Ze dane wejsciowe bedą słabej jakości i w roNych odstepach czasu ok15 min.
Jednej rzeczy tylko nie rozumiem odejmujac od siebie 2 zdjęcia jako tło pozostaną ci rzeczy które się nie zmieniły pozostały w spocZynku ale przy zdjęciach co kilkanaście minut korzystanie z tego co było wcześniej chba nie ma sensu ale skoro człowiek może powiedzieć ile jest samochodów na drodze to powinno dać się to zrobić

Jak skoncE algorytmy które przetwarAja mi dane wstępne to sproboje poprosru odejmowac od zbioru piksli jakie wytypowalem piłkę mnie nie interesujące zobaczymy co mi to wszystko da

Witam wszystkich !

Pierwszy post w tym temacie napisałem 3 stycznia dzisiaj mamy 18 marca czyli przeszło 3 miechy winksmiley.jpg

czemu piszę ? bo chcę tutaj opublikować moje wstępne wyniki z beta testów mojej aplikacji

Jeśli będziecie chcieli o samej aplikacji chętnie coś napiszę teraz dodam że stwór pisany wieczorami i w wolne chwile zaczyna (Chyba) naprawdę działać...

Aby dobrze zinterpretować wyniki muszę powiedzieć o paru rzeczach po pierwsze zdjęcia z którymi musi sobie radzić aplikacja są bardzo niskiej rozdzielczości i są to zdjęcia nie film ! (jedno zdjęcie na ok 10 min.) niejednokrotnie człowiek ma problem z rozpoznaniem na nich czy dana plama to samochód czy po prostu kałuża odbijająca światło. Skryptowi postawiłem jeden cel ma określić w kilku stopniowej skali natężenie ruchu jednak potrafi znacznie więcej. Z tego co zaraz zobaczycie z dokładnością do ok. 2-3 samochodów jest w stanie podać ich dokładną liczbę. Aplikacja ma 2 swoje pięty Zdjęcia które są uszkodzone (w tym mają uszkodzone kolory i duży szum) oraz zdjęcia robione w deszczu i o ile z tymi ostatnimi jakoś sobie poradziłem (jestem wstanie skalowo określić natężenie ruchu) o tyle zdjęcie uszkodzone raczej będę ignorował i je po prostu pomijał. Na 10 i 6 zdjęciu możecie zobaczyć o jakich efektach mówię. Wyniki podaje nie zaokrąglone ale planuję je zaokrąglać do miejsc całkowitych od x.3 w górę...

Samochody brane pod uwagę to takie które mają wyraźne kształty dlatego samochody przy samym horyzoncie (które tworzą np. jedną dużą kropkę) nie są brane pod uwagę przy liczeniu pojedynczym jednak gdy ustalamy skale ruchu do liczby samochodów dodawana jest informacja czy samochody są po horyzont czy tez nie...

No to obiecane wyniki:


Co o tym myślicie ? kilkadziesiąt godzin spędzone na testach planowaniu i programowaniu poszło w las ? czy jednak coś z tego będzię ?

Pozdrawiam !
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.