Ответ 1
Когда вы пишете, 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;
}