OpenCV中基于光流的四边形点跟踪

时间:2014-03-05 13:23:58

标签: c++ opencv computer-vision

我正在尝试使用视频序列中的光流方法跟踪四边形。四边形由用户在开始时提供。它的工作时间非常短,但随着对象的旋转,跟踪开始失败。有人可以如何改进此跟踪?目标是感兴趣的是摩托车上的车牌,其在序列中具有旋转和平移运动。最初的四个点(车牌的四个角)由用户选择。 我也尝试过使用SHIFT描述符但是我没有在感兴趣区域的连续帧之间获得足够的匹配点。

 std::vector<cv::Point2f> feature_prev, feature_next;
        std::vector<uchar> status_vector;
        std::vector<float> status_error;
        cv::TermCriteria termcrit;
        cv::Size subPixWinSize, winSize;

        cv::Mat prevFrame;
        cv::Mat currFrame;
 feature_next.push_back(cv::Point2f((float)refRoi.P1().x,(float)refRoi.P1().y));
        feature_next.push_back(cv::Point2f((float)refRoi.P2().x,(float)refRoi.P2().y));
        feature_next.push_back(cv::Point2f((float)refRoi.P3().x,(float)refRoi.P3().y));
        feature_next.push_back(cv::Point2f((float)refRoi.P4().x,(float)refRoi.P4().y));


     cv::cvtColor(srcCpy, currFrame, CV_BGR2GRAY);
            cv::equalizeHist(currFrame, currFrame);

           // cv::Mat srcMat(srcGray.operator const IplImage *());
           // dst = src;
            if(!feature_prev.empty())
            {
                status_vector.clear();
                status_error.clear();
                feature_next.clear();
                cv::calcOpticalFlowPyrLK(prevFrame, currFrame,feature_prev,feature_next,status_vector,status_error, winSize, 5, termcrit, 0, 0.001);
                size_t i, k;
                for( i = k = 0; i < feature_next.size(); i++ )
                {
                    if( !status_vector[i] )
                    {
                        continue;
                    }
                    feature_next[k++] = feature_next[i];

                    circle( srcCpy, feature_next[i], 3, cv::Scalar(0,255,0), -1, 8);
                }

                feature_next.resize(k);
           }

1 个答案:

答案 0 :(得分:1)