comparison c/feature-based-tracking.cpp @ 230:bc4ea09b1743

compatibility modifications for visual studio compilation
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 29 Jun 2012 16:15:13 -0400
parents 48f83ff769fd
children 249d65ff6c35
comparison
equal deleted inserted replaced
207:48f83ff769fd 230:bc4ea09b1743
74 74
75 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement; 75 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement;
76 Size window = Size(params.windowSize, params.windowSize); 76 Size window = Size(params.windowSize, params.windowSize);
77 77
78 // BruteForceMatcher<Hamming> descMatcher; 78 // BruteForceMatcher<Hamming> descMatcher;
79 // vector<DMatch> matches; 79 // std::vector<DMatch> matches;
80 Size videoSize; 80 Size videoSize;
81 81
82 // if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter 82 // if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter
83 // capture.open(argc == 2 ? argv[1][0] - '0' : 0); 83 // capture.open(argc == 2 ? argv[1][0] - '0' : 0);
84 // else if( argc >= 2 ) 84 // else if( argc >= 2 )
128 trajectoryDB->connect(params.databaseFilename.c_str()); 128 trajectoryDB->connect(params.databaseFilename.c_str());
129 trajectoryDB->createTable("positions"); 129 trajectoryDB->createTable("positions");
130 trajectoryDB->createTable("velocities"); 130 trajectoryDB->createTable("velocities");
131 trajectoryDB->beginTransaction(); 131 trajectoryDB->beginTransaction();
132 132
133 vector<KeyPoint> prevKpts, currKpts; 133 std::vector<KeyPoint> prevKpts, currKpts;
134 vector<Point2f> prevPts, currPts, newPts; 134 std::vector<Point2f> prevPts, currPts, newPts;
135 vector<uchar> status; 135 std::vector<uchar> status;
136 vector<float> errors; 136 std::vector<float> errors;
137 Mat prevDesc, currDesc; 137 Mat prevDesc, currDesc;
138 138
139 vector<FeatureTrajectoryPtr> lostFeatures; 139 std::vector<FeatureTrajectoryPtr> lostFeatures;
140 vector<FeaturePointMatch> featurePointMatches; 140 std::vector<FeaturePointMatch> featurePointMatches;
141 141
142 HOGDescriptor hog; 142 HOGDescriptor hog;
143 hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); 143 hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
144 144
145 int key = '?'; 145 int key = '?';
156 if (emptyFrameNum>=3000) 156 if (emptyFrameNum>=3000)
157 exit(0); 157 exit(0);
158 } 158 }
159 159
160 cvtColor(frame, currentFrameBW, CV_RGB2GRAY); 160 cvtColor(frame, currentFrameBW, CV_RGB2GRAY);
161
162 // "normal" feature detectors: detect features here 161 // "normal" feature detectors: detect features here
163 // detector.detect(currentFrameBW, currKpts); // see video_homography c++ sample 162 // detector.detect(currentFrameBW, currKpts); // see video_homography c++ sample
164 163
165 if (!prevPts.empty()) { 164 if (!prevPts.empty()) {
166 //::keyPoints2Points(prevKpts, prevPts); 165 //::keyPoints2Points(prevKpts, prevPts);
167 currPts.clear(); 166 currPts.clear();
168 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), 0.5 /* unused */, 0); // OPTFLOW_USE_INITIAL_FLOW 167 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), 0.5 /* unused */, 0); // OPTFLOW_USE_INITIAL_FLOW
169 /// \todo try calcOpticalFlowFarneback 168 /// \todo try calcOpticalFlowFarneback
170 169
171 vector<Point2f> trackedPts; 170 std::vector<Point2f> trackedPts;
172 vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin(); 171 std::vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin();
173 while (iter != featurePointMatches.end()) { 172 while (iter != featurePointMatches.end()) {
174 bool deleteFeature = false; 173 bool deleteFeature = false;
175 174
176 if (status[iter->pointNum]) { 175 if (status[iter->pointNum]) {
177 iter->feature->addPoint(frameNum, currPts[iter->pointNum], homography); 176 iter->feature->addPoint(frameNum, currPts[iter->pointNum], homography);
282 FeatureGraph featureGraph(params.mmConnectionDistance, params.mmSegmentationDistance, params.minFeatureTime, params.minNFeaturesPerGroup); 281 FeatureGraph featureGraph(params.mmConnectionDistance, params.mmSegmentationDistance, params.minFeatureTime, params.minNFeaturesPerGroup);
283 282
284 // main loop 283 // main loop
285 // TODO version that can be interrupted? 284 // TODO version that can be interrupted?
286 for (int frameNum = params.frame1; ((frameNum-params.frame1 < params.nFrames) || (params.nFrames < 0)); frameNum++) { 285 for (int frameNum = params.frame1; ((frameNum-params.frame1 < params.nFrames) || (params.nFrames < 0)); frameNum++) {
287 vector<int> trajectoryIds; 286 std::vector<int> trajectoryIds;
288 success = trajectoryDB->trajectoryIdEndingAt(trajectoryIds, frameNum); // ending 287 success = trajectoryDB->trajectoryIdEndingAt(trajectoryIds, frameNum); // ending
289 cout << "frame " << frameNum << " " << success << endl; 288 cout << "frame " << frameNum << " " << success << endl;
290 cout << trajectoryIds.size() << " trajectories " << endl; 289 cout << trajectoryIds.size() << " trajectories " << endl;
291 BOOST_FOREACH(int trajectoryId, trajectoryIds) { 290 BOOST_FOREACH(int trajectoryId, trajectoryIds) {
292 //cout << trajectoryId << " " << endl; 291 //cout << trajectoryId << " " << endl;
300 299
301 // check for connected components that are old enough (no chance to match with trajectories to be added later 300 // check for connected components that are old enough (no chance to match with trajectories to be added later
302 // we could check only when some features are getting old enough? 301 // we could check only when some features are getting old enough?
303 if (frameNum%10 == 0) { 302 if (frameNum%10 == 0) {
304 featureGraph.connectedComponents(frameNum-maxTrajectoryLength+params.minFeatureTime); 303 featureGraph.connectedComponents(frameNum-maxTrajectoryLength+params.minFeatureTime);
305 vector<vector<unsigned int> > featureGroups = featureGraph.getFeatureGroups(); 304 std::vector<vector<unsigned int> > featureGroups = featureGraph.getFeatureGroups();
306 for (unsigned int i=0; i<featureGroups.size(); ++i) { 305 for (unsigned int i=0; i<featureGroups.size(); ++i) {
307 trajectoryDB->writeObject(savedObjectId, featureGroups[i], -1, 1, string("objects"), string("objects_features")); 306 trajectoryDB->writeObject(savedObjectId, featureGroups[i], -1, 1, string("objects"), string("objects_features"));
308 savedObjectId++; 307 savedObjectId++;
309 } 308 }
310 } 309 }
317 } 316 }
318 317
319 int main(int argc, char *argv[]) { 318 int main(int argc, char *argv[]) {
320 KLTFeatureTrackingParameters params(argc, argv); 319 KLTFeatureTrackingParameters params(argc, argv);
321 cout << params.parameterDescription << endl; 320 cout << params.parameterDescription << endl;
322 321 params.trackFeatures = true;
323 if (params.trackFeatures) 322 if (params.trackFeatures)
324 trackFeatures(params); 323 trackFeatures(params);
325 else if (params.groupFeatures) 324 else if (params.groupFeatures)
326 groupFeatures(params); 325 groupFeatures(params);
327 326