Mercurial > hg > nsaunier > 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; |
