5

Phát hiện vòng tròn (giỏ). . To see the samples of "hoop"Phát hiện bóng rổ Hoops và theo dõi bóng

Đếm không của nỗ lực thành công (bắn) và thất bại nỗ lực Tôi đang sử dụng opencv

Input:..

  1. vị trí máy ảnh sẽ là tĩnh.
  2. Hình ảnh Chân dung chế độ từ bất kỳ thiết bị di động nào.

ref:

gì đã tôi đã cố gắng:

  1. Có khả năng theo dõi bóng rổ. Tuy nhiên, tìm kiếm một giải pháp tốt hơn.

kết quả:

enter image description here

Mã của tôi:

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

Câu hỏi:

  1. Cách phát hiện số hoop? Tôi đã nghĩ đến việc phát hiện Square để phát hiện các vùng hình vuông xung quanh hoop.
  2. cách tốt nhất để đếm các cảnh quay thành công là gì? Hoặc Cách đếm?
+0

Cảm ơn các yếu tố đầu vào. Có thể một số điểm tôi vào thuật toán theo dõi bóng tốt nhất. – user2727765

+0

bạn có tìm thấy giải pháp cho việc này không? – Crashalot

Trả lời

1

Tôi có những gì tôi nghi ngờ sẽ là một đường cơ sở khá vững chắc: một khi quả bóng đã bắt đầu vòng cung xuống, nếu quả bóng thể hiện chuyển động lên đáng kể một lần nữa, đó là một lỡ. Nếu không, nó là một cái giỏ. Điều này sẽ không bắt được airballs, nhưng tôi nghi ngờ họ là tương đối ít anyway.

Tôi nghĩ rằng bạn có thể nhận được toàn bộ số dặm ra khỏi việc học quỹ đạo bóng của một cú đánh thành công và không phải lo lắng quá nhiều về vòng đấu. Hơn nữa, bạn không nói rằng máy ảnh là vị trí cố định? Điều đó không có nghĩa là vòng của luôn luôn ở cùng một nơi, và vì vậy bạn chỉ có thể xác định vị trí của nó?

EDIT:

Nếu bạn hoàn toàn không phải tìm hoop, tôi muốn tìm kiếm một đối tượng (tiểu vùng của hình ảnh) khoảng kích thước giống như quả bóng (mà bạn nói rằng bạn có thể theo dõi) màu cam.Nói chung, bạn có thể tìm hiểu một trình phân loại cho hoop dựa trên các hình ảnh đào tạo mà bạn đã liên kết và áp dụng nó ở hỗn hợp các vị trí và tỷ lệ, tìm kiếm kết quả phù hợp nhất. Bạn nên biết vị trí gần đúng của nó, tức là vị trí đó ở phần trên của hình ảnh và có khả năng ở bên này hoặc bên kia. Sau đó, bạn có thể sử dụng các tính năng lân cận cho vùng được xác định này ngoài các đặc điểm quỹ đạo để xây dựng một trình phân loại cho dù cú đánh thành công hay không.

+0

Cảm ơn bạn đã nhập. Bạn cũng có thể xem xét tình huống này không? 1. Trong nhiều trường hợp, quả bóng có thể thậm chí không chạm vào vòng, nhưng vẫn độ cao sẽ tương tự như thực hiện hoặc bắn. Một trong những cách sử dụng khác của phát hiện Hoop là hướng dẫn người dùng đặt máy ảnh chính xác trước khi quay video. Có, vị trí máy ảnh là tĩnh cho một phiên. Và tôi không được phép nhận bất kỳ đầu vào nào từ người dùng để chỉ định vị trí của Hoop. – user2727765

+0

Tôi nghi ngờ số lượng airballs (nơi bóng không chạm vào hoop ở tất cả) sẽ được khá thấp, trừ khi bạn đang quay phim mọi người chỉ học tập thể thao. Như tôi đã nói, đó là đường cơ sở; nhưng tôi nghi ngờ nó sẽ mạnh mẽ. –

+0

Và bản chỉnh sửa của tôi mô tả những gì tôi sẽ làm nếu tôi hoàn toàn phải tìm ra cái vòng. –