calcopticalflowpyrlk calcopticalflowfarneback ball c++ opencv computer-vision tracking

c++ - calcopticalflowfarneback - object tracking opencv android



Seguimiento de OpenCV utilizando flujo óptico. (2)

Mientras escribe, cv::goodFeaturesToTrack toma una imagen como entrada y produce un vector de puntos que considera "bueno de rastrear". Estos se eligen en función de su capacidad para sobresalir de su entorno y se basan en las esquinas de Harris en la imagen. Un rastreador normalmente se inicializaría pasando la primera imagen a goodFeaturesToTrack y obteniendo un conjunto de características para rastrear. Estas características podrían pasarse a cv::calcOpticalFlowPyrLK como los puntos anteriores, junto con la siguiente imagen en la secuencia y producirá los siguientes puntos como salida, que luego se convertirán en puntos de entrada en la siguiente iteración.

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

Muy simple, en código:

// 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; }

Utilizo esto para funcionar 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 imagen siguiente. 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 utilizando la función de flujo óptico OpenCV?


La función cv :: calcOpticalFlowPyrLK (..) usa argumentos:

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;

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

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 cuadro. La información del valor se puede encontrar en este ejemplo: OpenCV/samples/cpp/lkdemo.cpp