![]() |
| 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