使用光流进行OpenCV跟踪
c++
computer-vision
opencv
5
0

我将其用作跟踪算法的基础。

    //1. detect the features
    cv::goodFeaturesToTrack(gray_prev, // the image 
    features,   // the output detected features
    max_count,  // the maximum number of features 
    qlevel,     // quality level
    minDist);   // min distance between two features

    // 2. track features
    cv::calcOpticalFlowPyrLK(
    gray_prev, gray, // 2 consecutive images
    points_prev, // input point positions in first im
    points_cur, // output point positions in the 2nd
    status,    // tracking success
    err);      // tracking error

cv::calcOpticalFlowPyrLK将上一张图像的点向量作为输入,并在下一张图像上返回适当的点。假设上一个图像上有随机像素(x,y),如何使用OpenCV光流函数计算该像素在下一个图像上的位置?

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

在您撰写本文时, cv::goodFeaturesToTrack将图像用作输入,并生成一个点矢量,该点被认为是“很好的追踪”。根据它们在周围环境中脱颖而出的能力以及图像中的Harris角来选择它们。通常通过将第一张图片传递给goodFeaturesToTrack并获取一组要跟踪的要素来初始化跟踪器。然后可以将这些功能作为先前的点与序列中的下一个图像一起传递给cv::calcOpticalFlowPyrLK ,它将产生下一个点作为输出,然后在下一次迭代中成为输入点。

如果要尝试跟踪另一组像素(而不是cv::goodFeaturesToTrack或类似函数生成的特征),则只需将它们与下一张图像一起提供给cv::calcOpticalFlowPyrLK

很简单,在代码中:

// Obtain first image and set up two feature vectors
cv::Mat image_prev, image_next;
std::vector<cv::Point> features_prev, features_next;

image_next = getImage();

// Obtain initial set of features
cv::goodFeaturesToTrack(image_next, // the image 
  features_next,   // the output detected features
  max_count,  // the maximum number of features 
  qlevel,     // quality level
  minDist     // min distance between two features
);

// Tracker is initialised and initial features are stored in features_next
// Now iterate through rest of images
for(;;)
{
    image_prev = image_next.clone();
    feature_prev = features_next;
    image_next = getImage();  // Get next image

    // Find position of feature in new image
    cv::calcOpticalFlowPyrLK(
      image_prev, image_next, // 2 consecutive images
      points_prev, // input point positions in first im
      points_next, // output point positions in the 2nd
      status,    // tracking success
      err      // tracking error
    );

    if ( stopTracking() ) break;
}
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号