Mercurial Hosting > 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) |