poniedziałek, 9 stycznia 2012

Aplikacja interaktywna w OpenCV reagującą na ruch

5 komentarze
Pełny kod źródłowy
Kurs programowania systemów interaktywnych z wykorzystaniem OpenCV, który jakiś czas temu rozpocząłem na łamach tego bloga (patrz: etykieta OpenCV), byłby niekompletny, gdyby zabrakło opisu interakcji ruchowej. Obsługa klawiatury i myszki są oczywiście ważne, ale już na nikim nie robią szczególnego wrażenia. OpenCV jak wiadomo jest przeznaczony do śledzenia i analizy ruchu i to jest jego główna siła.

W dzisiejszym wpisie zostanie pokazane jak dodać kolejną warstwę interakcji poprzez analizę i detekcję ruchu. Wpis ten będzie naturalnym rozszerzeniem przykładów omawianych wcześniej, dlatego zachęcam do ich wcześniejszej analizy. Szczególnie istotne są dwa z nich:
Dobra wiadomość jest taka, że dzięki wprowadzeniu obiektowego szkieletu aplikacji, rozszerzenie aplikacji o interakcję ruchową będzie niezwykle proste i nie będzie wymagało wielu zmian w kodzie. Dla przykładu kod kulki praktycznie pozostaje bez zmian. Logika aplikacji jest również taka sama jak dla poprzedniego przykładu.

Pierwszą rzeczą, którą należy zrobić jest dodanie kilku pomocniczych zmiennych, które będą zawierać pośrednie etapu przetwarzania obrazu.

// plik: interactive_app_tutorial-MainApp.h
class MainApp
{
private:
  Mat cam_frame, img_gray, img_first, img_prev, img_diff, img_bin;

Następnie należy rozszerzyć funkcję update klasy MainApp o sprawdzanie na ile każda z kulek pokrywa się z fragmentami obrazu binarnego, gdzie został wykryty ruch.

// plik: interactive_app_tutorial-MainApp.cpp
for (int k = 0; k < myBall.size(); k++) {
  movementAmount = 0;
  ball_dim = myBall[k].getDim();
  ball_x   = myBall[k].getX();
  ball_y   = myBall[k].getY();
  
  for (int i=(-1*ball_dim); i<ball_dim; i++)
    for (int j=(-1*ball_dim); j<ball_dim; j++)
      if ( dist(0,0,i,j) < ball_dim ) {          
        canvas_ind_x = ball_x + i;
        canvas_ind_y = ball_y + j;
        
        if ( canvas_ind_x<=0 || canvas_ind_y<=0 || 
             canvas_ind_x>CANVAS_WIDTH || canvas_ind_y>CANVAS_HEIGHT) 
          continue; 
        
        if ( img_bin.at<uchar>(canvas_ind_y,canvas_ind_x) > 30) {
          movementAmount++;
        }
      }
      
      if (movementAmount > max_motion_points)
        myBall[k].decrementLives();
      else
        if (!pauseBallsMove) myBall[k].update();
}

W powyższym przykładzie widać, że jeśli więcej niż 30 pikseli leży na masce (zmienna img_bin) wskazującej miejsce detekcji ruchu to możemy uznać, że kulka została "dotknięta". Oczywiście można zmienić tą wartość na inną, lub nawet ustalać ją w zależności od wielkości elementu zbijanego. To prawdopodobnie byłoby lepsze rozwiązanie od obecnego, dlatego zachęcam czytelników do samodzielnych eksperymentów.

poniedziałek, 8 sierpnia 2011

Zbiór przykładowych aplikacji Qt Quick

0 komentarze
Jak widać, patrząc na moje ostatnie wpisy na blogu - a raczej ich brak :-), zrobiłem sobie dłuższą przerwę od MeeGo i Qt. Nie wynika to bynajmniej z utraty zainteresowania tymi dwoma technologiami, ale raczej z chronicznego braku czasu. Po rozpoczętej na początku tego roku serii wpisów dotyczących systemów mobilnych, nadszedł czas na zapoznanie się z mocno ostatnio promowanym Qt Quick. Nie będę jednak zbyt wiele pisał o tej technologii, bo przyznam szczerze, że nie wiele się na niej znam. Po przerobieniu jednego prostego kursu, nie będę udawał, że jestem ekspertem w tej dziedzinie :-).

Pierwsze przymiarki do Qt Quick i QMLa rozpocząłem od przeszukania Internetu za gotowymi przykładami. Najwięcej jest ich oczywiście na stronie Nokii i tam polecam zajrzeć. Niestety jest mały bałagan w ich lokalizacji i mimo prób ich gromadzenia na Wiki Qt lub też w Portalu dla Developerów Noki ciągle znajdują się one w kilku miejscach. Udało mi się nad tym zapanować tworząc odpowiednie kategorie w moich Ulubionych. Oczywiście udostępniam je również Wam.

Przykłady dołączone do oficjalnej dokumentacji:
Przykłady opisane na Wiki Qt (link):
Przykłady z portalu dla developerów Noki:

Oficjalnie wspierane (link):
Rozwijane przez społeczność (link) - wybrałem te, które wizualnie zrobiły na mnie największe wrażenie:
Inne przykłady znalezione na stronie Qt:
Kursy i poradniki pokazujące jak coś zrobić:
Repozytoria:
Przykłady i projekty społeczności:
Patrząc na tą listę nie wiem czy udało mi się znaleźć dużo, czy mało przykładów aplikacji zaimplementowanych z użyciem Qt Quick. Dla osób raczkujących w tej technologi, tak jak ja, jest ich jednak w zupełności wystarczająco na start.

    poniedziałek, 25 lipca 2011

    "Generative art" teraz w moim plecaku

    2 komentarze
    Nareszcie przyszła druga zamówione przez mnie książka w Amazon. Czekałem na nią długo - ok. 2 miesiące. Na szczęście w tym czasie spokojnie mogłem przejrzeć "Form+Code".

    Pierwsze moje wrażenie po otwarciu "Generative art" było takie: "to nie tak miało być! spodziewałem się czegoś innego!". Moje lekkie rozczarowanie wynikało po prostu stąd, że po obejrzeniu przykładowego rozdziału, który jest dostępny na stronie autora książki Matta Pearsona (podaje link, aby było szybciej: Rozdział 1) spodziewałem się w pełni ilustrowanej książki, coś w rodzaju katalogu projektów i opisu dobrych praktyk.

    Na szczęście, to było tylko pierwsze i jak się okazało powierzchowne wrażenie. No bo jak budować opinie na temat książki przeglądając jedynie parę stron. Wystarczy poświecić jej trochę więcej czasu, aby dostrzec, że jest ona pełna opisów dobrych praktyk, zawiera naprawdę sporo wartościowych przykładów i pokazuje krok po kroku coraz bardziej zaawansowane techniki generowania  ilustracji komputerowych.

    Więcej nie zdradzam. Zachęcam do przejrzenia :-)

    I jeszcze jedna dobra wiadomość: po zakupie książki ebooka dostajemy gratis :-D.





    wtorek, 12 lipca 2011

    Google Matrix

    0 komentarze
    Wszystko wskazuje na to, że Google wie o mnie wszystko. Nie tylko to z kim koresponduję, to o czym wtedy piszę, to czego szukam w Internecie i komu robię fotki wakacjach.

    Wie również z jakiego systemu korzystam i (o zgrozo) z jakiej przeglądarki nie korzystam - a wg Google powinienem ;-)

    Najlepszym przykładem tego o czym właśnie piszę, może być reklama jaką dzisiaj zaserwował mi Google w swoim czytniku RSSów:



    Czyżby nadchodził Google Matrix?