检测篮球球和球跟踪

时间:2013-09-27 09:07:26

标签: opencv image-processing machine-learning computer-vision tracking

检测箍(篮子)。To see the samples of "hoop“。

计数 成功尝试(拍摄)和失败尝试次数。 我正在使用opencv。

输入

  1. 相机位置静态
  2. 来自任何移动设备的人像模式视频。
  3. 参考:

    我尝试了什么:

    1. 能够追踪篮筐球。仍在寻求更好的解决方案。
    2. 结果:

      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. 计算成功拍摄的最佳方法是什么?或如何计算

1 个答案:

答案 0 :(得分:1)

我怀疑这将是一个相当强劲的基线:一旦球开始向下弧线,如果球再次表现出明显的向上运动,那就是一个未命中。否则,它是一个篮子。这不会抓住空中球,但我怀疑它们相对较少。

我认为你可以通过学习成功击球的球轨迹获得大量的里程,而不必过于担心篮筐。此外,你不是说相机是固定位置吗?这是不是意味着箍总是在同一个地方,所以你可以指定它的位置?

编辑:

如果你绝对必须找到箍,我会寻找一个与球大小相同的物体(图像的子区域)(你说你可以跟踪它)是橙色的。更一般地说,您可以根据您链接的训练图像学习箍的分类器,并将其应用于位置和比例的混合,搜索最佳匹配。您应该知道它的大致位置,即它位于图像的上部,可能是一侧或另一侧。然后,除了轨迹特征之外,您还可以对此识别的区域使用邻近特征,以构建分类器,以确定镜头是否成功。