Seguimiento de OpenCV utilizando flujo óptico

Lo uso para funciones como base de mi algoritmo de seguimiento.

//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 toma el vector de puntos de la imagen anterior como entrada, y devuelve los puntos apropiados en la siguiente imagen. Supongamos que tengo un píxel aleatorio (x, y) en la imagen anterior, ¿cómo puedo calcular la posición de este píxel en la siguiente imagen usando la función de flujo óptico OpenCV?

    Mientras escribe, cv::goodFeaturesToTrack toma una imagen como entrada y produce un vector de puntos que considera “bueno de seguir”. Estos se eligen en función de su capacidad para destacarse de su entorno y se basan en las esquinas de Harris en la imagen. Normalmente, un rastreador se inicializa al pasar la primera imagen a goodFeaturesToTrack y obtener un conjunto de características para rastrear. Estas características podrían pasar a cv::calcOpticalFlowPyrLK como los puntos anteriores, junto con la siguiente imagen de la secuencia y generará los siguientes puntos como salida, que luego se convertirán en puntos de entrada en la siguiente iteración.

    Si desea tratar de rastrear un conjunto de píxeles diferente (en lugar de las características generadas por cv::goodFeaturesToTrack o una función similar), simplemente cv::calcOpticalFlowPyrLK a cv::calcOpticalFlowPyrLK junto con la imagen siguiente.

    Muy simple, en el código:

     // 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 función cv :: calcOpticalFlowPyrLK (..) usa argumentos:

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

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

    el código más simple (parcial) para encontrar el píxel en el siguiente fotogtwig:

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

    Si el píxel se encontró con éxito el status[0] == 1 y features_next[0] mostrará las coordenadas del píxel en el siguiente fotogtwig. La información de valor se puede encontrar en este ejemplo: OpenCV/samples/cpp/lkdemo.cpp