Mercurial > hg > nsaunier > traffic-intelligence
comparison c/feature-based-tracking.cpp @ 135:32d2722d4028
added constraint on minimum displacement
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Thu, 18 Aug 2011 01:03:38 -0400 |
| parents | a617d0808bbc |
| children | 0f790de9437e |
comparison
equal
deleted
inserted
replaced
| 134:a617d0808bbc | 135:32d2722d4028 |
|---|---|
| 58 | 58 |
| 59 VideoCapture capture; | 59 VideoCapture capture; |
| 60 Mat frame, currentFrameBW, previousFrameBW; | 60 Mat frame, currentFrameBW, previousFrameBW; |
| 61 | 61 |
| 62 KLTFeatureTrackingParameters params; | 62 KLTFeatureTrackingParameters params; |
| 63 params.display = false; | 63 params.display = true; |
| 64 params.frame1 = 0; | 64 params.frame1 = 0; |
| 65 params.nFrames = -1; | 65 params.nFrames = -1; |
| 66 params.maxNFeatures = 1000; | 66 params.maxNFeatures = 1000; |
| 67 params.featureQuality = 0.1; | 67 params.featureQuality = 0.1; |
| 68 params.minFeatureDistanceKLT = 3; | 68 params.minFeatureDistanceKLT = 3; |
| 70 params.useHarrisDetector = false; | 70 params.useHarrisDetector = false; |
| 71 params.k = 0.4; | 71 params.k = 0.4; |
| 72 //GoodFeaturesToTrackDetector detector(params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, params.windowSize, params.useHarrisDetector, params.k); | 72 //GoodFeaturesToTrackDetector detector(params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, params.windowSize, params.useHarrisDetector, params.k); |
| 73 | 73 |
| 74 params.pyramidLevel = 3; | 74 params.pyramidLevel = 3; |
| 75 params.nDisplacements = 3; | |
| 76 params.minFeatureDisplacement = 0.05; | |
| 77 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement; | |
| 78 | |
| 75 params.maxNumberTrackingIterations = 20; // 30 | 79 params.maxNumberTrackingIterations = 20; // 30 |
| 76 params.minTrackingError = 0.3; // 0.01 | 80 params.minTrackingError = 0.3; // 0.01 |
| 77 params.derivLambda = 0.5; | 81 params.derivLambda = 0.5; |
| 78 params.minFeatureTime = 20; | 82 params.minFeatureTime = 20; |
| 79 | 83 |
| 146 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 | 150 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 |
| 147 | 151 |
| 148 vector<Point2f> trackedPts; | 152 vector<Point2f> trackedPts; |
| 149 vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin(); | 153 vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin(); |
| 150 while (iter != featurePointMatches.end()) { | 154 while (iter != featurePointMatches.end()) { |
| 155 bool deleteFeature = false; | |
| 156 | |
| 151 if (status[iter->pointNum]) { | 157 if (status[iter->pointNum]) { |
| 152 iter->feature->addPoint(frameNum, currPts[iter->pointNum]); | 158 iter->feature->addPoint(frameNum, currPts[iter->pointNum]); |
| 153 trackedPts.push_back(currPts[iter->pointNum]); | 159 trackedPts.push_back(currPts[iter->pointNum]); |
| 154 iter->pointNum = trackedPts.size()-1; | 160 iter->pointNum = trackedPts.size()-1; |
| 155 iter++; | 161 |
| 156 } else { | 162 deleteFeature |= !iter->feature->largeDisplacement(params.nDisplacements, minTotalFeatureDisplacement); |
| 163 // motionSmooth() | |
| 164 } | |
| 165 | |
| 166 if (deleteFeature) { | |
| 157 if (iter->feature->length() >= params.minFeatureTime) { | 167 if (iter->feature->length() >= params.minFeatureTime) { |
| 158 iter->feature->setId(savedFeatureId); | 168 iter->feature->setId(savedFeatureId); |
| 159 savedFeatureId++; | 169 savedFeatureId++; |
| 160 iter->feature->write(trajectoryDB); | 170 iter->feature->write(trajectoryDB); |
| 161 } | 171 } |
| 162 iter = featurePointMatches.erase(iter); | 172 iter = featurePointMatches.erase(iter); |
| 163 } | 173 } else |
| 174 iter++; | |
| 164 } | 175 } |
| 165 currPts = trackedPts; | 176 currPts = trackedPts; |
| 166 assert(currPts.size() == featurePointMatches.size()); | 177 assert(currPts.size() == featurePointMatches.size()); |
| 167 | 178 |
| 168 if (params.display) | 179 if (params.display) |
