comparison c/feature-based-tracking.cpp @ 137:445e773c9be3

created the parameter structure to parse parameters (bug remaining)
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 19 Aug 2011 01:35:45 -0400
parents 0f790de9437e
children c1b260b48d2a
comparison
equal deleted inserted replaced
136:0f790de9437e 137:445e773c9be3
58 // GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4); 58 // GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4);
59 59
60 VideoCapture capture; 60 VideoCapture capture;
61 Mat frame, currentFrameBW, previousFrameBW; 61 Mat frame, currentFrameBW, previousFrameBW;
62 62
63 KLTFeatureTrackingParameters params; 63 KLTFeatureTrackingParameters params(argc, argv);
64 params.display = true; 64 cout << params.parameterDescription << endl;
65 params.frame1 = 0; 65 // params.display = true;
66 params.nFrames = -1; 66 // params.frame1 = 0;
67 params.maxNFeatures = 1000; 67 // params.nFrames = -1;
68 params.featureQuality = 0.1; 68 // params.maxNFeatures = 1000;
69 params.minFeatureDistanceKLT = 3; 69 // params.featureQuality = 0.1;
70 params.windowSize = 3; 70 // params.minFeatureDistanceKLT = 3;
71 params.useHarrisDetector = false; 71 // params.windowSize = 3;
72 params.k = 0.4; 72 // params.useHarrisDetector = false;
73 //GoodFeaturesToTrackDetector detector(params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, params.windowSize, params.useHarrisDetector, params.k); 73 // params.k = 0.4;
74 74 // //GoodFeaturesToTrackDetector detector(params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, params.windowSize, params.useHarrisDetector, params.k);
75 params.pyramidLevel = 3; 75
76 params.nDisplacements = 3; 76 // params.pyramidLevel = 3;
77 params.minFeatureDisplacement = 0.05; 77 // params.nDisplacements = 3;
78 // params.minFeatureDisplacement = 0.05;
79
80 // params.maxNumberTrackingIterations = 20; // 30
81 // params.minTrackingError = 0.3; // 0.01
82 // params.minFeatureTime = 20;
83
78 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement; 84 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement;
79
80 params.maxNumberTrackingIterations = 20; // 30
81 params.minTrackingError = 0.3; // 0.01
82 params.derivLambda = 0.5;
83 params.minFeatureTime = 20;
84
85 Size window = Size(params.windowSize, params.windowSize); 85 Size window = Size(params.windowSize, params.windowSize);
86 86
87 BruteForceMatcher<Hamming> descMatcher; 87 BruteForceMatcher<Hamming> descMatcher;
88 vector<DMatch> matches; 88 vector<DMatch> matches;
89 Size videoSize; 89 Size videoSize;
90 90
91 if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter 91 // if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter
92 capture.open(argc == 2 ? argv[1][0] - '0' : 0); 92 // capture.open(argc == 2 ? argv[1][0] - '0' : 0);
93 else if( argc >= 2 ) 93 // else if( argc >= 2 )
94 { 94 // {
95 capture.open(argv[1]); 95 // capture.open(argv[1]);
96 if( capture.isOpened() ) 96 // if( capture.isOpened() )
97 videoSize = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)); 97 // videoSize = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));
98 cout << "Video " << argv[1] << 98 // cout << "Video " << argv[1] <<
99 ": width=" << videoSize.width << 99 // ": width=" << videoSize.width <<
100 ", height=" << videoSize.height << 100 // ", height=" << videoSize.height <<
101 ", nframes=" << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl; 101 // ", nframes=" << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl;
102 if( argc > 2 && isdigit(argv[2][0]) ) // could be used to reach first frame, dumping library messages to log file (2> /tmp/log.txt) 102 // if( argc > 2 && isdigit(argv[2][0]) ) // could be used to reach first frame, dumping library messages to log file (2> /tmp/log.txt)
103 { 103 // {
104 sscanf(argv[2], "%d", &params.frame1); 104 // sscanf(argv[2], "%d", &params.frame1);
105 cout << "seeking to frame #" << params.frame1 << endl; 105 // cout << "seeking to frame #" << params.frame1 << endl;
106 //cap.set(CV_CAP_PROP_POS_FRAMES, pos); 106 // //cap.set(CV_CAP_PROP_POS_FRAMES, pos);
107 for (int i=0; i<params.frame1; i++) 107 // for (int i=0; i<params.frame1; i++)
108 capture >> frame; 108 // capture >> frame;
109 } 109 // }
110 } 110 // }
111 111
112 // capture.open(atoi(argv[1])); 112 capture.open(params.videoFilename);
113 if (!capture.isOpened()) 113 if (!capture.isOpened())
114 { 114 {
115 //help(argv); 115 //help(argv);
116 cout << "capture device " << argv[1] << " failed to open!" << endl; 116 cout << "capture device " << argv[1] << " failed to open!" << endl;
117 return 1; 117 return 1;
147 // detector.detect(currentFrameBW, currKpts); // see video_homography c++ sample 147 // detector.detect(currentFrameBW, currKpts); // see video_homography c++ sample
148 148
149 if (!prevPts.empty()) { 149 if (!prevPts.empty()) {
150 //::keyPoints2Points(prevKpts, prevPts); 150 //::keyPoints2Points(prevKpts, prevPts);
151 currPts.clear(); 151 currPts.clear();
152 calcOpticalFlowPyrLK(previousFrameBW, currentFrameBW, prevPts, currPts, status, errors, window, params.pyramidLevel, TermCriteria(3 /*static_cast<int>(TermCriteria::COUNT)+static_cast<int>(TermCriteria::EPS)*/, params.maxNumberTrackingIterations, params.minTrackingError), params.derivLambda, 0); // OPTFLOW_USE_INITIAL_FLOW 152 calcOpticalFlowPyrLK(previousFrameBW, currentFrameBW, prevPts, currPts, status, errors, window, params.pyramidLevel, TermCriteria(3 /*static_cast<int>(TermCriteria::COUNT)+static_cast<int>(TermCriteria::EPS)*/, params.maxNumberTrackingIterations, params.minTrackingError), 0.5 /* unused */, 0); // OPTFLOW_USE_INITIAL_FLOW
153 153
154 vector<Point2f> trackedPts; 154 vector<Point2f> trackedPts;
155 vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin(); 155 vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin();
156 while (iter != featurePointMatches.end()) { 156 while (iter != featurePointMatches.end()) {
157 bool deleteFeature = false; 157 bool deleteFeature = false;