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