5

检测箍(篮)。 。To see the samples of "hoop检测筐球箍和球跟踪

计数无的成功的尝试(拍摄)和失败尝试 我使用OpenCV的

输入:。

  1. 相机的位置也会be static
  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. 如何到检测hoop?我想到用Square检测来检测箍周围的正方形区域。
  2. 最佳拍摄方法是什么?或如何计数
+0

感谢您的意见。有人能指出我最好的球跟踪算法。 – user2727765

+0

您是否找到了解决方案? – Crashalot

回答

1

我有我的猜测是一个相当强的基准线:一旦球已经开始向下的弧线,如果球再次显示出明显的向上移动,那么它是一个小姐。否则,它的一个篮子。这不会吸引空中球,但我怀疑他们相对较少。

我想你可以从学习一个成功的球的弹道轨迹中获得大量的里程数,而不用担心太多的箍。此外,你不是说相机是固定的吗?这并不意味着篮球总是在同一个地方,所以你可以指定它的位置?

编辑:

如果你万万也必须找到篮筐,我会找对象差不多大小的(图像的子区域)的球(你说你可以跟踪)这是橙色的。更一般地说,您可以根据您链接的训练图像学习篮筐的分类器,并将它应用到位置和比例的混合中,以寻找最佳匹配。您应该知道它的大概位置,即它位于图像的上部,可能位于一侧或另一侧。然后,除了轨迹特征之外,您还可以使用接近性特征来识别这个区域,以便构建一个分类器来判断镜头是否成功。

+0

感谢您的输入。 你也可以考虑这种情况吗?在很多情况下,球甚至可能不会接触到篮筐,但是海拔仍然会与接球或射门相似。 Hoop检测的其他用途之一是指示用户在捕捉视频之前正确放置相机。 是的,摄像头的位置对于一个session来说是静态的。而且我不允许从用户那里得到任何输入来指定Hoop的位置。 – user2727765

+0

我怀疑空气球的数量(球根本不接触篮筐)会很低,除非你正在拍摄只是学习这项运动的人。正如我所说,这是一个基线;但我怀疑这将是一个强大的。 –

+0

而我的编辑描述了如果我绝对必须找到篮筐,我会做什么。 –