检测篮球球和球跟踪

use*_*765 5 opencv tracking machine-learning image-processing computer-vision

检测箍(篮子).看到"箍 " 的样本.

伯爵的没有成功的尝试(拍摄)和失败的尝试.我正在使用opencv.

输入:

  1. 相机位置将是静态的.
  2. 来自任何移动设备的人像模式视频.

参考:

我试过了什么:

  1. 能够跟踪篮球.仍然,寻求更好的解决方案.

结果:

在此输入图像描述

我的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 如何检测?我想过用方形检测来检测箍周围的方形区域.
  2. 计算成功拍摄的最佳方式是什么?或者如何计算

Ben*_*son 1

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

我认为你可以从学习成功投篮的球轨迹中获得很多好处,而不必太担心篮筐。而且,你不是说相机是固定位置的吗?这是否意味着箍始终位于同一个位置,因此您可以指定其位置?

编辑:

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