2016-02-14 2 views
2

J'essaie de visualiser la sortie de calcOpticalFlowPyrLK() (OpenCv v3.0.0). Je n'essaie pas de dessiner l'image entière avec le flux optique, seulement la flèche de direction. Le problème est, je ne peux pas arriver à la sortie comme dans les exemples. Toutes les 10 images je renouvelle les points pour le calcul du flux. La fonction elle-mêmeVisualisation de flux optique

calcOpticalFlowPyrLK(CentroidFrOld, CentroidFrNow, mc, CornersCentroidNow, feat_found, feat_errors, Size(15, 15), 2, cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 10, 0.03), 0); 

Lorsque CentroidFrOld est cadre en échelle de gris, CentroidFrNow est cadre en échelle de gris + 1, mc est une matrice de points vector<Point2f> et CornersCentroidNow est un tableau vide en attente d'être rempli avec de nouveaux points.

Quand les dessin-je utiliser un code simple:

for (size_t i = 0; i < CornersCentroidNow.size(); i++){    
    if (feat_errors[i] > MAX_ERR || feat_found[i] == 0) continue; 
    Point p0(ceil(mc[i].x), ceil(mc[i].y)); // are the points of interest (centroids of contours) 
    Point p1(ceil(CornersCentroidNow[i].x), ceil(CornersCentroidNow[i].y));  
    arrowedLine(empty, p0, p1, Scalar(0, 0, 255), 2, 8, 0, 0.2); 
} 

après ce bloc de code. Quand je les dessine chaque image que je reçois cette sortie: First step

Si je mets à jour l'image précédente utilisé pour calcOpticalFlowPyrLK() fonction

CentroidFrOld = CentroidFrNow.clone(); 

Je reçois cette sortie (la ligne est courte et il se déplace foward tous les 10 cadres - comme ensemble pour obtenir de nouveaux points) Second step

Si les points précédents se trouvent les points suivants et

CentroidFrOld = CentroidFrNow.clone(); 
mc = CornersCentroidNow; 

Je reçois cette sortie (la ligne est courte, mais il se déplace avec l'objet) Third step

La sortie souhaitée, je ne peux pas obtenir est

Desired out

Ai-je besoin de allonger manuellement la ligne? Personne ne fait donc dans les exemples similaires de implemantation de flux optique

+0

double possible de [Comment dessiner des images de flux optique de OCL :: PyrLKOpticalFlow :: dense()] (http://stackoverflow.com/questions/ 20064818/comment-dessiner-optical-flow-images-from-oclpyrlkopticalflowdense) – Miki

+0

Complètement sans rapport - Je n'essaie pas de dessiner l'image entière avec OF et l'algorithme proposé à la fin de la poste est fondamentalement le même que moi, mais dans la version plus récente d'Opencv, en 2013 il y avait la version 2.3.1, complètement différente de celle qui est maintenant – Croolman

+0

, vous aurez besoin de montrer plus de code pour résoudre ce problème - en particulier l'appel réel à la fonction 'calcOpticalFlowPyrLK' . Si vous le configurez correctement, vous devez dessiner des lignes entre les points du tableau 'prevPts' et du tableau' nextPts'. Je vous recommande de réduire 'flowedLine' à un dessin' line' plus simple pendant le débogage - ces lignes courtes peuvent être des pointes de flèches épinglées. – foundry

Répondre

3
void drawOptFlowMapF(const Mat& flow, Mat& cflowmap, int step, const Scalar& color) { 
    for (int y = 0; y < cflowmap.rows; y += step) 
     for (int x = 0; x < cflowmap.cols; x += step) 
     { 
      const Point2f& fxy = flow.at< Point2f>(y, x); 
      line(cflowmap, Point(x, y), Point(cvRound(x + fxy.x), cvRound(y + fxy.y)), 
       color); 
      circle(cflowmap, Point(cvRound(x + fxy.x), cvRound(y + fxy.y)), 1, color, -1); 
     } 
} 
void displayF(Mat flow) 
{ 
    //extraxt x and y channels 
    cv::Mat xy[2]; //X,Y 
    cv::split(flow, xy); 

    //calculate angle and magnitude 
    cv::Mat magnitude, angle; 
    cv::cartToPolar(xy[0], xy[1], magnitude, angle, true); 

    //translate magnitude to range [0;1] 
    double mag_max; 
    cv::minMaxLoc(magnitude, 0, &mag_max); 
    magnitude.convertTo(magnitude, -1, 1.0/mag_max); 

    //build hsv image 
    cv::Mat _hsv[3], hsv; 
    _hsv[0] = angle; 
    _hsv[1] = cv::Mat::ones(angle.size(), CV_32F); 
    _hsv[2] = magnitude; 
    cv::merge(_hsv, 3, hsv); 

    //convert to BGR and show 
    cv::Mat bgr;//CV_32FC3 matrix 
    cv::cvtColor(hsv, bgr, cv::COLOR_HSV2BGR); 
    cv::imshow("optical flow", bgr); 
    imwrite("c://resultOfOF.jpg", bgr); 
    cv::waitKey(0); 
}