5

Обнаружите обруч (корзина). . Не To see the samples of "hoop»Обнаружение корзины с мячом Обручи и слежение за мячом

Граф не из успешных попыток (стрелять) и отказа попытки Я использую OpenCV

Input:..

  1. положение камеры be Статические.
  2. Портрет видео с любого мобильного устройства.

исх:

Что я пробовал:

  1. Возможность отслеживать корзины мяч. Тем не менее, поиск лучшего решения.

результаты:

enter image description here

Мой код:

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

Вопросы:

  1. Как связаться с обруч? Я думал о том, чтобы делать с квадратичным детектированием, чтобы обнаружить квадратные области вокруг обруча.
  2. Что такое лучший способ подсчета успешных побегов? Или Как считать?
+0

Спасибо за входные данные. Может ли кто-нибудь указать мне на лучшие алгоритмы отслеживания шаров. – user2727765

+0

Вы нашли решение этого? – Crashalot

ответ

1

У меня есть то, что, как я подозреваю, будет довольно сильным базовым: когда мяч начал свою нисходящую дугу, если мяч снова демонстрирует значительное восходящее движение, его промах. В противном случае это его корзина. Это не будет захватывать воздушные шары, но я подозреваю, что они относительно немного в любом случае.

Я думаю, вы могли бы получить много пробега из-за обучения траектории шага успешного выстрела и не слишком беспокоиться об обруче. Кроме того, разве вы не сказали, что камера была фиксированной? Разве это не означает, что обруч всегда находится в одном и том же месте, и поэтому вы можете просто указать его местоположение?

EDIT:

Если вы абсолютно ничего должны найти обруч, я бы искать объект (подобласти изображения) примерно того же размера, что и шар (который вы говорите, вы можете отслеживать), это оранжевый.В более общем плане вы могли бы изучить классификатор для обруча, основанный на обучающих изображениях, с которыми вы связались, и применять его в сочетании мест и масштабов, ища наилучшее соответствие. Вы должны знать его приблизительное местоположение, то есть, что оно находится в верхней части изображения и, вероятно, будет в одну сторону или другое. Затем вы можете использовать функции близости к этому идентифицированному региону в дополнение к функциям траектории для создания классификатора для того, удалось ли сделать снимок или нет.

+0

Спасибо за ваш вклад. Можете ли вы также рассмотреть эту ситуацию? 1. Во многих случаях мяч может даже не касаться обруча, но все же высота будет похожа на то, чтобы сделать или стрелять. Одним из других применений обнаружения Hoop является указание пользователю правильно поместить камеру, прежде чем снимать видео. Да, положение камеры статично для сеанса. И мне не разрешено вводить какие-либо данные от пользователя, чтобы указать местоположение Hoop. – user2727765

+0

Я подозреваю, что количество воздушных шаров (где мяч вообще не касается обруча) будет довольно низким, если вы не снимаете людей, просто изучающих спорт. Как я уже сказал, это базовый уровень; но я подозреваю, что он будет сильным. –

+0

И мое редактирование описывает, что я буду делать, если мне абсолютно нужно найти обруч. –

Смежные вопросы