使用来自哈尔检测结果的光流PyrLK跟踪多重对象

时间:2017-01-03 05:33:05

标签: c++ linux opticalflow

我正在尝试使用光流PyrLK从视频中检测视频中的多个对象(汽车),但问题是有时哈尔检测(对象)没有出现在帧中! 如何跟踪haar检测(对象)在几帧中没有出现的对象?我怎么能近似它是自动放置,,,

我正在尝试使用光流PyrLK找到对象......但是当haar检测(对象)没有出现时,这种技术会丢失

任何建议的想法???请.....

绿色矩形=哈尔检测结果,红点=来自GoodFeaturestoTrack的角落

Image frame 1 : There is Haar detection result

Image frame 2 : Haar detection (object) does not appear

这是我的代码: 你能帮我解决吗?

video >> prev_frame;
Rect roi = Rect(50, 180, 540, 240);
prevROI=prev_frame(roi);
cvtColor(prevROI, gray, CV_BGR2GRAY);
gray.convertTo(prev_img, CV_8UC1);

while(true)
{
    video >> frameROI;
    Rect roi = Rect(50, 180, 540, 240);
    Mat ROI=frameROI(roi);
    cvtColor(ROI, gray, CV_BGR2GRAY); //=====> RGB to Grayscale
    gray.convertTo(imgROI, CV_8UC1);

    vector<Rect> cars;
    Casmobil.detectMultiScale(gray, cars, 1.1, 3,
                              CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_SCALE_IMAGE,
                              Size(0,0));

    for (size_t i = 0; i < cars.size(); i++)
    {
        Rect square = cars[i];
        areax = (cars[i].x + cars[i].width*0.5);
        areay = (cars[i].y + cars[i].height*0.5);

        Point cen_point = Point(areax ,areay);

        rectangle(ROI, square,CV_RGB(0,255,0),2,8,0);
        circle(ROI, cen_point, 3,CV_RGB(255, 0, 0),-2);
    }

    for (int i = 0; i < cars.size(); i++)
    {
        Rect square2 = cars[i];
        cropcars = imgROI(square2);
        ROIOF = ROI(square);

        //prev_frame
        goodFeaturesToTrack(cropmobil, prevframe_corners,maxCorners,
                            qualityLevel,minDistance,Mat(),
                            blockSize,useHarrisDetector,k);
        calcOpticalFlowPyrLK(prev_img, imgROI, prevframe_corners,
                             frame_corners, found, error,
                             Size(win_size, win_size), maxlevel,termcrit);

        Rect box = boundingRect(frame_corners);
        rectangle(ROIOF, box, CV_RGB(0,255,255),2,8,0);
        Boxx = (box.x + box.width*0.5);
        boxy = (box.y + box.height*0.5);
        cen = Point(boxx, boxy);
        circle(ROIF, cen, 3, CV_RGB(0, 0, 255), -1);

        for( int j = 0; j < frame_corners.size(); j++ )
        {
            circle(ROIOF, frame_corners[j], 2, CV_RGB(255, 0, 0), -1);
            circle(ROIOF, prevframe_corners[j], 2, CV_RGB(0, 0, 255), -1);
            line(ROIOF,frame_corners[j], cen, CV_RGB(0, 255, 0),2, 8, 0);
        }

        prev_img = imgROI.clone();

    }

1 个答案:

答案 0 :(得分:0)

如果您对每个帧使用Haar检测,那么为什么要使用LK跟踪?

在物体追踪中,由于哈尔检测非常重且速度慢,人们通常会在第一帧中应用哈尔检测,并使用其他方法追踪对象。

在您的情况下,使用CamShift似乎可以完成这项工作。因此,您在第一帧中进行Haar检测,并让CamShift跟踪汽车。

请注意,CamShift算法完全基于图像直方图,因此,如果对象的颜色与背景颜色大不相同,则效果很好。