Отслеживание OpenCV с использованием оптического потока - PullRequest
18 голосов
/ 14 марта 2012

Я использую это в качестве основы для моего алгоритма отслеживания.

    //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?

Ответы [ 2 ]

29 голосов
/ 14 марта 2012

Когда вы пишете, cv::goodFeaturesToTrack принимает изображение в качестве входного сигнала и создает вектор точек, которые он считает «хорошо отслеживаемыми».Они выбираются на основе их способности выделяться из окружающей среды и основаны на углах Харриса на изображении.Трекер обычно инициализируется путем передачи первого изображения в 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;
}
1 голос
/ 23 апреля 2014

cv :: calcOpticalFlowPyrLK (..) функция использует аргументы:

cv :: calcOpticalFlowPyrLK (prev_gray, curr_gray, features_prev, features_next, status, err);

cv::Mat prev_gray, curr_gray;
std::vector<cv::Point2f> features_prev, features_next;
std::vector<uchar> status;
std::vector<float> err;

Простейший (частичный) код для поиска пикселя в следующем кадре:

features_prev.push_back(cv::Point(4, 5));
cv::calcOpticalFlowPyrLK(prev_gray, curr_gray, features_prev, features_next, status, err);

Если пиксель был успешно найден, status[0] == 1 и features_next[0] покажут координаты пикселя в следующем кадре. Информация о значении может быть найдена в этом примере: OpenCV/samples/cpp/lkdemo.cpp

...