Отслеживание OpenCV с использованием оптического потока
Я использую это для функций в качестве основы моего алгоритма отслеживания.
//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 ответов
как вы пишете, 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;
}
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