2017-09-19 2 views
0

gars.Changement de déplacement sur une séquence de trames

J'ai écrit un code pour décrire le mouvement sur les points d'intérêt sur un fichier vidéo .avi. Voici le code:

#include "opencv2/video/tracking.hpp" 
#include<opencv2/core/core.hpp> 
#include<opencv2/highgui/highgui.hpp> 
#include<opencv2/imgproc/imgproc.hpp> 
#include<iostream> 

using namespace cv; 
using namespace std; 

int main() { 
VideoCapture capture("video.avi"); 


if (!capture.isOpened()) { 
    cout << "ERROR OPENING VIDEO\n\n"; 
    return(0); 
} 

double rate = capture.get(CV_CAP_PROP_FPS); 
unsigned int numberFrames = (unsigned int) capture.get(CV_CAP_PROP_FRAME_COUNT); 
int width = (unsigned int) capture.get(CV_CAP_PROP_FRAME_WIDTH); 
int height = (unsigned int) capture.get(CV_CAP_PROP_FRAME_HEIGHT); 
unsigned int codec = (unsigned int) capture.get(CV_CAP_PROP_FOURCC); 

Mat currentGray; 
Mat previousGray; 
vector<Point2f> points[2]; 
vector<Point2f> initial; 
vector<Point2f> features; 

vector<uchar> status; 
vector<float> error; 

int maxCorners = 500; // maximum number of features to detect 
double qualityLevel = 0.01; // quality level for feature detection 
double minDistance = 10; // min distance between two points 

Mat frame, output; 

VideoWriter createdVideo("output.avi", codec, rate, Size(width,height), 1); 

for (unsigned frameCounter = 0; frameCounter < numberFrames; frameCounter++) { 

    capture >> frame; 

    if (frame.empty()) 
     break; 

    imshow("Video", frame); 
    cvtColor(frame, currentGray, CV_BGR2GRAY); 
    frame.copyTo(output); 


    if (points[0].size() <= 10){ 
     goodFeaturesToTrack(currentGray, // the image 
      features, // the output detected features 
      maxCorners, // the maximum number of features 
      qualityLevel, // quality level 
      minDistance); // min distance between two features 

     // add the detected features to 
     // the currently tracked features 
     points[0].insert(points[0].end(), 
      features.begin(), features.end()); 
     initial.insert(initial.end(), 
      features.begin(), features.end()); 
    } 

    if (previousGray.empty()) 
     currentGray.copyTo(previousGray); 

    calcOpticalFlowPyrLK(previousGray, currentGray, // 2 consecutive images 
     points[0], // input point positions in first image 
     points[1], // output point positions in the 2nd image 
     status, // tracking success 
     error); // tracking error 

    int k = 0; 
    for (int i = 0; i < points[1].size(); i++) { 
     // do we keep this point? 

     if (status[i] && // if point has moved 
      (abs(points[0][i].x - points[1][i].x) + 
      (abs(points[0][i].y - points[1][i].y)) > 2)) 

      initial[k] = initial[i]; 
      points[1][k++] = points[1][i]; 
    } 

    points[1].resize(k); 
    initial.resize(k); 


    for (int i = 0; i < points[1].size(); i++) { 
     // draw line and circle 
     line(output, 
      initial[i], // initial position 
      points[1][i],// new position 
      Scalar(0, 255, 0), 2); 
     circle(output, 
      points[1][i], 
      2, 
      Scalar(0, 0, 255), -1); 

    } 

    std::swap(points[1], points[0]); 
    cv::swap(previousGray, currentGray); 

    createdVideo.write(output); 

} 

waitKey(0); 
return(0); 
} 

Mon code suit le déplacement du cadre de points par image et maintient le premier lieu d'entre eux jusqu'à la fin de la vidéo. Cependant, Je ne souhaite pas garder les points de la première image, mais les changer au fil du temps, c'est-à-dire changer le premier emplacement du point avec le deuxième point et ainsi de suite deux points dans deux cadres.

Y at-il une possibilité de le faire?

Répondre

0

Puisque vous ne voulez que la position des points dans deux images, utilisez simplement deux vecteurs; l'un contenant les points-clés de la dernière image, et l'autre contenant les points-clés de l'image précédente. À la fin de chaque itération, il suffit de définir les points précédents sur les points actuels. Quelque chose comme ce pseudo-code:

// first frame 
// detect keypoints 
prev_frame_points = keypoints 

// rest of the frames 
for frame in frames: 
    // detect keypoints 
    curr_frame_points = keypoints 
    line(..., prev_frame_points, curr_frame_points, ...) 
    prev_frame_points = curr_frame_points