5

Wykryj obręcz (koszyk). . To see the samples of "hoopWykryj koszykówkę Obręcz i śledzenie piłki

Hrabia no z udanych prób (strzelać) oraz brak próby używam OpenCV

Wejście..

  1. pozycja Aparat być statyczne.
  2. The Portret wideo z dowolnego urządzenia mobilnego.

ref:

Co próbowałem:

  1. stanie śledzić piłki koszykowej. Wciąż jednak szukam lepszego rozwiązania.

Wyniki:

enter image description here

Mój kod:

int main() { 

VideoCapture vid(path); 

    if (!vid.isOpened()) 
     exit(-1); 
    int i_frame_height = vid.get(CV_CAP_PROP_FRAME_HEIGHT); 
    i_height_basketball = i_height_basketball * I_HEIGHT/i_frame_height; 
    int fps = vid.get(CV_CAP_PROP_FPS); 
    Mat mat_black(640, 480, CV_8UC3, Scalar(0, 0, 0)); 
    vector <Mat> vec_frames; 
    for (int i_push = 0; i_push < I_NO_FRAMES_STORE; i_push++) 
     vec_frames.push_back(mat_black); 

    vector <Mat> vec_mat_result; 
    for (int i_push = 0; i_push < I_RESULT_STORE; i_push++) 
     vec_mat_result.push_back(mat_black); 

    int count_frame = 0; 
    while (true) { 
     int clk_start = clock(); 
     Mat image, result; 
     vid >> image; 
     if (image.empty()) 
      break; 

     resize(image, image, Size(I_WIDTH, I_HEIGHT)); 
     image.copyTo(vec_mat_result[count_frame % I_RESULT_STORE]); 
     if (count_frame >= 1) 
      vec_mat_result[(count_frame - 1) % I_RESULT_STORE].copyTo(result); 
     GaussianBlur(image, image, Size(9, 9), 2, 2); 
     image.copyTo(vec_frames[count_frame % I_NO_FRAMES_STORE]); 

     if (count_frame >= I_NO_FRAMES_STORE - 1) { 
      Mat mat_diff_temp(I_HEIGHT, I_WIDTH, CV_32S, Scalar(0)); 
      for (int i_diff = 0; i_diff < I_NO_FRAMES_STORE; i_diff++) { 

       Mat mat_rgb_diff_temp = abs(vec_frames[ (count_frame - 1) % I_NO_FRAMES_STORE ] - vec_frames[ (count_frame - i_diff) % I_NO_FRAMES_STORE ]); 
       cvtColor(mat_rgb_diff_temp, mat_rgb_diff_temp, CV_BGR2GRAY); 
       mat_rgb_diff_temp = mat_rgb_diff_temp > I_THRESHOLD; 
       mat_rgb_diff_temp.convertTo(mat_rgb_diff_temp, CV_32S); 
       mat_diff_temp = mat_diff_temp + mat_rgb_diff_temp; 

      } 
      mat_diff_temp = mat_diff_temp > I_THRESHOLD_2; 
      //   mat_diff_temp.convertTo(mat_diff_temp, CV_8U); 

      Mat mat_roi = mat_diff_temp.rowRange(0, i_height_basketball); 
//   imshow("ROI", mat_roi); 
      Moments mm = cv::moments(mat_roi, true); 
      Point p_center = Point(mm.m10/mm.m00, mm.m01/mm.m00); 
      circle(result, p_center, 3, CV_RGB(0, 255, 0), -1); 
      line(result, Point(0, i_height_basketball), Point(result.cols, i_height_basketball), Scalar(225, 0, 0), 1); 

     } 
     count_frame = count_frame + 1; 
     int clk_processing_time = (clock() - clk_start); 
     if (count_frame > 1) 
      imshow("image", result); 
     //  waitKey(0); 

     int delay = (1000/fps) - clk_processing_time; 
     if (delay <= 0) 
      delay = 2; 
     if (waitKey(delay) >= 27) 
      break; 

    } 
    vid.release(); 
    return 0; 
} 

Pytania:

  1. Jak wykryć zobręcz hoop? Myślałem o zrobieniu z wykrywaniem Square, aby wykryć kwadratowe obszary wokół obręczy.
  2. Jaki jest najlepszy sposób liczenia zliczania? Lub Jak liczyć?
+0

Dzięki za dane wejściowe. Czy ktoś może wskazać mi najlepsze algorytmy śledzenia piłki. – user2727765

+0

znalazłeś rozwiązanie tego problemu? – Crashalot

Odpowiedz

1

Mam to, co do którego podejrzewam, że będzie dość mocną linią bazową: gdy piłka zacznie się łuk w dół, jeśli piłka ponownie wykazuje znaczny ruch w górę, jest to jej brak. W przeciwnym razie jest to kosz. Nie łapie to piłek powietrznych, ale podejrzewam, że i tak są stosunkowo nieliczne.

Myślę, że można uzyskać wiele kilometrów z uczenia się trajektorii piłki udanego strzału i nie martw się zbytnio o obręcz. Co więcej, czy nie powiedziałeś, że kamera była w stałej pozycji? Czy to nie oznacza, że ​​obręcz zawsze znajduje się w tym samym miejscu, więc możesz określić jego lokalizację?

EDIT:

Jeśli koniecznie musiał znaleźć obręcz, będę szukać obiektu (podregionu obrazu) około tej samej wielkości jak w spotkaniu (co mówisz można śledzić) to pomarańczowy.Ogólnie rzecz biorąc, możesz nauczyć się klasyfikatora do obręczy na podstawie obrazów treningowych, do których jesteś podłączony, i zastosować go w wielu lokalizacjach i skalach, szukając najlepszego dopasowania. Powinieneś znać jego przybliżoną lokalizację, tj. Że znajduje się w górnej części obrazu i prawdopodobnie znajduje się po jednej lub drugiej stronie. Następnie możesz użyć funkcji bliskości do tego zidentyfikowanego regionu, oprócz funkcji trajektorii, aby zbudować klasyfikator, czy strzał się powiedzie, czy nie.

+0

Dzięki za twój wkład. Czy możesz również wziąć pod uwagę tę sytuację? 1. W wielu przypadkach kula może nawet nie dotykać obręcza, ale nadal elewacja będzie podobna do wykonania lub strzelania. Jednym z innych zastosowań wykrywania obrażeń jest zalecenie użytkownikowi prawidłowego umieszczenia kamery przed przechwyceniem wideo. Tak, pozycja kamery jest statyczna dla sesji. I nie wolno mi uzyskać żadnych danych wejściowych od użytkownika w celu określenia lokalizacji Hoop. – user2727765

+0

Podejrzewam, że liczba kul powietrznych (gdzie piłka w ogóle nie dotyka obręczy) będzie dość niska, chyba że filmujesz ludzi, którzy dopiero uczą się sportu. Jak powiedziałem, jest to linia podstawowa; ale podejrzewam, że będzie silna. –

+0

A moja edycja opisuje, co bym zrobił, gdybym absolutnie musiał znaleźć obręcz. –