5

Rileva il telaio (carrello). . To see the samples of "hoop"Rileva pallina da basket Cerchio e rilevamento palla

Conte il no di tentativi riusciti (sparare) e il fallimento tentativi sto usando OpenCV

ingresso:..

  1. posizione telecamera be statico.
  2. I video in modalità Portrait da qualsiasi dispositivo mobile.

ref:

Che cosa ho provato:

  1. grado di monitorare il basket. Ancora, alla ricerca di una soluzione migliore.

risultati:

enter image description here

Il mio codice:

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; 
} 

Domande:

  1. Come rilevare il cerchio? Ho pensato di fare con il rilevamento Square per rilevare le regioni quadrate attorno al telaio.
  2. Che cos'è il modo migliore per contare ? O Come contare?
+0

Grazie per gli input. Qualcuno può indicarmi i migliori algoritmi di tracciamento della palla. – user2727765

+0

hai trovato una soluzione a questo? – Crashalot

risposta

1

ho quello che sospetto sarà una base abbastanza forte: una volta che la palla ha iniziato l'arco verso il basso, se la palla dimostra ancora significativo movimento verso l'alto, la sua perdere. Altrimenti, è un cestino. Questo non prenderà palloni d'aria, ma ho il sospetto che siano relativamente pochi comunque.

Penso che si possa ottenere un sacco di chilometri dall'apprendimento della traiettoria della palla di un colpo riuscito e non preoccuparsi troppo del cerchio. Inoltre, non hai detto che la telecamera era fissa? Non significa che il cerchio è sempre nello stesso posto e quindi potresti semplicemente specificare la sua posizione?

EDIT:

Se è assolutamente c'era bisogno di trovare il cerchio, mi piacerebbe cercare un oggetto (sub-regione dell'immagine) di circa la stessa dimensione della palla (che si dice è possibile tenere traccia) è arancionePiù in generale, puoi imparare un classificatore per il telaio in base alle immagini di allenamento a cui sei collegato e applicarlo a una combinazione di posizioni e scale, cercando la corrispondenza migliore. Dovresti conoscere la sua posizione approssimativa, cioè che si trova nella parte superiore dell'immagine e che probabilmente si trova su un lato o sull'altro. Quindi è possibile utilizzare le feature di prossimità per questa regione identificata oltre alle caratteristiche di traiettoria per creare un classificatore per verificare se il colpo è riuscito o meno.

+0

Grazie per l'input. Puoi considerare anche questa situazione? 1. In molti casi, la palla potrebbe non toccare nemmeno il telaio, ma comunque l'elevazione sarà simile a fare o sparare. Uno degli altri usi del rilevamento di Hoop è di istruire l'utente a posizionare correttamente la videocamera prima di acquisire i video. Sì, la posizione della telecamera è statica per una sessione. Inoltre, non sono autorizzato a ricevere alcun input dall'utente per specificare la posizione del telaio. – user2727765

+0

Sospetto che il numero di airball (dove la palla non tocchi affatto il cerchio) sarà piuttosto basso, a meno che tu non stia filmando le persone semplicemente imparando lo sport. Come ho detto, è una linea di base; ma sospetto che sarà forte. –

+0

E la mia modifica descrive cosa farei se dovessi assolutamente trovare il telaio. –