![]() |
Pełny kod źródłowy |
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:
- OpenCV - obsługa klawiatury i myszki [16 maj 2011]
- Detekcja ruchu w OpenCV - porównanie klatek [6 kwi 2011]
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.
5 komentarze:
inspirujące!
fantastyczne, dziękuję za dzielenie się kodem!
dzięki za pochwały! motywujecie mnie do pisania dalszych wpisów :-)
Czy można skądś pobrać kompletne źródła?
Na początku wpisu jest link "Pełny kod źródłowy". Tam jest wszystko :-)
Prześlij komentarz