Mercurial Hosting > traffic-intelligence
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; |