comparison c/feature-based-tracking.cpp @ 139:47329bd16cc0

cleaned code, added condition on smooth displacement
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 23 Aug 2011 13:14:47 -0400
parents c1b260b48d2a
children 8de5e8256224
comparison
equal deleted inserted replaced
138:c1b260b48d2a 139:47329bd16cc0
60 VideoCapture capture; 60 VideoCapture capture;
61 Mat frame, currentFrameBW, previousFrameBW; 61 Mat frame, currentFrameBW, previousFrameBW;
62 62
63 KLTFeatureTrackingParameters params(argc, argv); 63 KLTFeatureTrackingParameters params(argc, argv);
64 cout << params.parameterDescription << endl; 64 cout << params.parameterDescription << endl;
65 // params.display = true;
66 // params.frame1 = 0;
67 // params.nFrames = -1;
68 // params.maxNFeatures = 1000;
69 // params.featureQuality = 0.1;
70 // params.minFeatureDistanceKLT = 3;
71 // params.windowSize = 3;
72 // params.useHarrisDetector = false;
73 // params.k = 0.4;
74 // //GoodFeaturesToTrackDetector detector(params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, params.windowSize, params.useHarrisDetector, params.k);
75
76 // params.pyramidLevel = 3;
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 65
84 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement; 66 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement;
85 Size window = Size(params.windowSize, params.windowSize); 67 Size window = Size(params.windowSize, params.windowSize);
86 68
87 BruteForceMatcher<Hamming> descMatcher; 69 BruteForceMatcher<Hamming> descMatcher;
140 Mat prevDesc, currDesc; 122 Mat prevDesc, currDesc;
141 123
142 vector<FeatureTrajectoryPtr> features; 124 vector<FeatureTrajectoryPtr> features;
143 vector<FeaturePointMatch> featurePointMatches; 125 vector<FeaturePointMatch> featurePointMatches;
144 126
145 // TODO structure de donnee paires pointeur trajectory, numero de keypoint
146 int key = '?'; 127 int key = '?';
147 unsigned int savedFeatureId=0; 128 unsigned int savedFeatureId=0;
148 for (int frameNum = params.frame1; ((params.frame1+frameNum < params.nFrames) || (params.nFrames < 0)) && !::interruptionKey(key); frameNum++) { 129 for (int frameNum = params.frame1; ((params.frame1+frameNum < params.nFrames) || (params.nFrames < 0)) && !::interruptionKey(key); frameNum++) {
149 capture >> frame; 130 capture >> frame;
150 cout << frameNum << " " << capture.get(CV_CAP_PROP_POS_FRAMES) << " " << prevPts.size() << endl; 131 cout << frameNum << " " << capture.get(CV_CAP_PROP_POS_FRAMES) << " " << prevPts.size() << endl;
167 bool deleteFeature = false; 148 bool deleteFeature = false;
168 149
169 if (status[iter->pointNum]) { 150 if (status[iter->pointNum]) {
170 iter->feature->addPoint(frameNum, currPts[iter->pointNum]); 151 iter->feature->addPoint(frameNum, currPts[iter->pointNum]);
171 152
172 bool smallDisplacement = iter->feature->smallDisplacement(params.nDisplacements, minTotalFeatureDisplacement); 153 deleteFeature |= iter->feature->smallDisplacement(params.nDisplacements, minTotalFeatureDisplacement)
173 if (smallDisplacement) 154 || !iter->feature->motionSmooth(params.accelerationBound, params.deviationBound);
155 if (deleteFeature)
174 iter->feature->shorten(); 156 iter->feature->shorten();
175 deleteFeature |= smallDisplacement; 157 } else
176 // motionSmooth() 158 deleteFeature = true;
177 }
178 159
179 if (deleteFeature) { 160 if (deleteFeature) {
180 if (iter->feature->length() >= params.minFeatureTime) { 161 if (iter->feature->length() >= params.minFeatureTime) {
181 iter->feature->setId(savedFeatureId); 162 iter->feature->setId(savedFeatureId);
182 savedFeatureId++; 163 savedFeatureId++;
164 /// \todo smoothing
183 iter->feature->write(*trajectoryDB); 165 iter->feature->write(*trajectoryDB);
184 } 166 }
185 iter = featurePointMatches.erase(iter); 167 iter = featurePointMatches.erase(iter);
186 } else { 168 } else {
187 trackedPts.push_back(currPts[iter->pointNum]); 169 trackedPts.push_back(currPts[iter->pointNum]);
190 } 172 }
191 } 173 }
192 currPts = trackedPts; 174 currPts = trackedPts;
193 assert(currPts.size() == featurePointMatches.size()); 175 assert(currPts.size() == featurePointMatches.size());
194 176
195 if (params.display) 177 if (params.display) {
196 BOOST_FOREACH(FeaturePointMatch fp, featurePointMatches) 178 BOOST_FOREACH(FeaturePointMatch fp, featurePointMatches)
197 fp.feature->draw(frame, Colors::red()); 179 fp.feature->draw(frame, Colors::red());
180 }
198 //drawOpticalFlow(prevPts, currPts, status, frame); 181 //drawOpticalFlow(prevPts, currPts, status, frame);
199 182
200 // cout << matches.size() << " matches" << endl; 183 // cout << matches.size() << " matches" << endl;
201 // descMatcher.match(currDesc, prevDesc, matches); 184 // descMatcher.match(currDesc, prevDesc, matches);
202 // cout << matches.size() << " matches" << endl; 185 // cout << matches.size() << " matches" << endl;