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)