2015-10-14 2 views
3

Je travaille sur un projet de détection de l'objet d'intérêt en utilisant la soustraction d'arrière-plan et de les suivre en utilisant le flux optique dans OpenCV C++. J'ai été capable de détecter l'objet d'intérêt en utilisant la soustraction de l'arrière-plan. J'ai pu mettre en œuvre le flux optique OpenCV Lucas Kanade sur un programme séparé. Mais, je suis coincé à la façon de ces deux programmes dans un seul programme. frame1 contient l'image réelle de la vidéo, contours2 sont les contours sélectionnés à partir de l'objet au premier plan.Soustraction d'arrière-plan et flux optique pour le suivi d'objet dans OpenCV C++

Pour résumer, comment puis-je alimenter l'objet forground obtenu à partir de la méthode de soustraction d'arrière-plan au calcOpticalFlowPyrLK? Ou, aidez-moi si mon approche est fausse. Merci d'avance.

Mat mask = Mat::zeros(fore.rows, fore.cols, CV_8UC1); 
    drawContours(mask, contours2, -1, Scalar(255), 4, CV_FILLED); 

    if (first_frame) 
    { 
     goodFeaturesToTrack(mask, features_next, 1000, 0.01, 10, noArray(), 3, false, 0.04); 
     fm0 = mask.clone(); 
     features_prev = features_next; 
     first_frame = false; 
    } 
    else 
    {   
     features_next.clear(); 
     if (!features_prev.empty()) 
     { 
      calcOpticalFlowPyrLK(fm0, mask, features_prev, features_next, featuresFound, err, winSize, 3, termcrit, 0, 0.001); 
      for (int i = 0; i < features_prev.size(); i++) 
       line(frame1, features_prev[i], features_next[i], CV_RGB(0, 0, 255), 1, 8); 
      imshow("final optical", frame1); 
      waitKey(1); 
     } 
     goodFeaturesToTrack(mask, features_next, 1000, 0.01, 10, noArray(), 3, false, 0.04); 
     features_prev = features_next; 
     fm0 = mask.clone();   
    } 

Répondre

1

Votre approche de l'utilisation du flux optique pour le suivi est erronée. L'idée derrière l'approche du flux optique est qu'un point de mouvement dans deux images consécutives a au début et à la fin la même intensité de pixel. Cela signifie qu'un mouvement pour un feautre est estimé en observant son apparence à partir des images de départ et en recherchant la structure dans l'image finale (très simplifiée).

calcOpticalFlowPyrLK calcOpticalFlowPyrLK est un pointeur qui signifie que le point dans les images précédentes est suivi de celui en cours. Par conséquent, les méthodes nécessitent l'image d'origine grisée de votre système. Parce qu'il peut seulement estimer le mouvement sur une région structurée/texturée (vous avez besoin de gradients x et y dans votre image).

Je pense que votre code devrait faire somethink comme:

  1. objets Extrait de soustractions de fond (par contour), c'est dans la littérature appelée blob
  2. objets Extraire dans l'image suivante et appliquer une blob- assoziation (dont countour appartient à qui) cela s'appelle aussi blob-tracken Il est possible de faire un blob-tracking avec le calcOpticalFlowPyrLK. Par exemple. d'une manière très simple:
  3. Suivre les points du compte ou d'un point à l'intérieur du blob.
  4. Assoziation: Le contour précédent est l'un des courants si les points de la trajectoire, qui appartiennent au contour précédent, sont situés au niveau actuel
1

Je pense que la sortie de la soustraction d'arrière-plan dans OpenCV n'est pas une image en échelle de gris. Pour l'entrée flux optique, nous avons besoin d'images à l'échelle de gris.