我正在尝试使用视频序列中的光流方法跟踪四边形。四边形由用户在开始时提供。它的工作时间非常短,但随着对象的旋转,跟踪开始失败。有人可以如何改进此跟踪?目标是感兴趣的是摩托车上的车牌,其在序列中具有旋转和平移运动。最初的四个点(车牌的四个角)由用户选择。 我也尝试过使用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);
}
答案 0 :(得分:1)