Suivi OpenCV par stream optique

J’utilise cela pour fonctionner comme base de mon algorithme de suivi.

//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 prend en cv::calcOpticalFlowPyrLK vecteur de points de l’image précédente et renvoie les points appropriés sur l’image suivante. Supposons que j’ai des pixels aléatoires (x, y) sur l’image précédente, comment puis-je calculer la position de ce pixel sur l’image suivante à l’aide de la fonction de stream optique OpenCV?

Au fur et à mesure que vous écrivez, cv::goodFeaturesToTrack prend une image en entrée et génère un vecteur de points qu’il juge “bon à suivre”. Celles-ci sont choisies en fonction de leur capacité à se démarquer de leur environnement et sont basées sur les angles de Harris dans l’image. Un suivi devrait normalement être initialisé en transmettant la première image à goodFeaturesToTrack et en obtenant un ensemble de fonctionnalités à suivre. Ces caractéristiques pourraient ensuite être transmises à cv::calcOpticalFlowPyrLK tant que points précédents, ainsi qu’à la prochaine image de la séquence, ce qui produira les points suivants en sortie, qui deviendront des points d’entrée lors de la prochaine itération.

Si vous souhaitez suivre un ensemble de pixels différent (plutôt que des fonctionnalités générées par cv::goodFeaturesToTrack ou une fonction similaire), fournissez-les simplement à cv::calcOpticalFlowPyrLK avec l’image suivante.

Très simplement, en code:

 // Obtain first image and set up two feature vectors cv::Mat image_prev, image_next; std::vector 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; } 

La fonction cv :: calcOpticalFlowPyrLK (..) utilise des arguments:

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

 cv::Mat prev_gray, curr_gray; std::vector features_prev, features_next; std::vector status; std::vector err; 

code le plus simple (partiel) pour trouver le pixel dans l’image suivante:

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

Si pixel a été trouvé, le status[0] == 1 et features_next[0] afficheront les coordonnées du pixel dans la prochaine image. Les informations de valeur peuvent être trouvées dans cet exemple: OpenCV/samples/cpp/lkdemo.cpp