comparison c/feature-based-tracking.cpp @ 654:045d05cef9d0

updating to c++11 capabilities
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 07 May 2015 16:09:47 +0200
parents a3add9f751ef
children 39fa1c998b29
comparison
equal deleted inserted replaced
653:107f1ad02b69 654:045d05cef9d0
14 #include "opencv2/video/tracking.hpp" 14 #include "opencv2/video/tracking.hpp"
15 #include "opencv2/features2d/features2d.hpp" 15 #include "opencv2/features2d/features2d.hpp"
16 #include "opencv2/highgui/highgui.hpp" 16 #include "opencv2/highgui/highgui.hpp"
17 #include "opencv2/objdetect/objdetect.hpp" 17 #include "opencv2/objdetect/objdetect.hpp"
18 18
19 #include <boost/shared_ptr.hpp>
20 #include <boost/foreach.hpp> 19 #include <boost/foreach.hpp>
21 #include <boost/filesystem.hpp> 20 #include <boost/filesystem.hpp>
22 21
23 #include <iostream> 22 #include <iostream>
24 #include <vector> 23 #include <vector>
25 #include <ctime> 24 #include <ctime>
26 #include <cmath> 25 #include <cmath>
26 #include <memory>
27 27
28 using namespace std; 28 using namespace std;
29 using namespace cv; 29 using namespace cv;
30 namespace fs = boost::filesystem; 30 namespace fs = boost::filesystem;
31 31
90 cout << "Unsupported option " << interpolationMethod << " for interpolation method" << endl; 90 cout << "Unsupported option " << interpolationMethod << " for interpolation method" << endl;
91 91
92 // BruteForceMatcher<Hamming> descMatcher; 92 // BruteForceMatcher<Hamming> descMatcher;
93 // vector<DMatch> matches; 93 // vector<DMatch> matches;
94 94
95 boost::shared_ptr<InputFrameProviderIface> capture; 95 std::shared_ptr<InputFrameProviderIface> capture;
96 if (fs::is_directory(fs::path(params.videoFilename))) 96 if (fs::is_directory(fs::path(params.videoFilename)))
97 capture = boost::shared_ptr<InputFrameListModule>(new InputFrameListModule(params.videoFilename)); 97 capture = std::shared_ptr<InputFrameListModule>(new InputFrameListModule(params.videoFilename));
98 else if(!params.videoFilename.empty()) 98 else if(!params.videoFilename.empty())
99 capture = boost::shared_ptr<InputVideoFileModule>(new InputVideoFileModule(params.videoFilename)); 99 capture = std::shared_ptr<InputVideoFileModule>(new InputVideoFileModule(params.videoFilename));
100 else 100 else
101 cout << "No valid input parameters" << endl; 101 cout << "No valid input parameters" << endl;
102 102
103 if(!capture->isOpen()) { 103 if(!capture->isOpen()) {
104 cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl; 104 cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl;
129 if (mask.empty()) { 129 if (mask.empty()) {
130 cout << "Mask filename " << params.maskFilename << " could not be opened." << endl; 130 cout << "Mask filename " << params.maskFilename << " could not be opened." << endl;
131 mask = Mat::ones(videoSize, CV_8UC1); 131 mask = Mat::ones(videoSize, CV_8UC1);
132 } 132 }
133 133
134 boost::shared_ptr<TrajectoryDBAccess<Point2f> > trajectoryDB = boost::shared_ptr<TrajectoryDBAccess<Point2f> >(new TrajectoryDBAccessList<Point2f>()); 134 std::shared_ptr<TrajectoryDBAccess<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccess<Point2f> >(new TrajectoryDBAccessList<Point2f>());
135 //TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>(); 135 //TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>();
136 trajectoryDB->connect(params.databaseFilename.c_str()); 136 trajectoryDB->connect(params.databaseFilename.c_str());
137 trajectoryDB->createTable("positions"); 137 trajectoryDB->createTable("positions");
138 trajectoryDB->createTable("velocities"); 138 trajectoryDB->createTable("velocities");
139 trajectoryDB->beginTransaction(); 139 trajectoryDB->beginTransaction();
263 trajectoryDB->endTransaction(); 263 trajectoryDB->endTransaction();
264 trajectoryDB->disconnect(); 264 trajectoryDB->disconnect();
265 } 265 }
266 266
267 void groupFeatures(const KLTFeatureTrackingParameters& params) { 267 void groupFeatures(const KLTFeatureTrackingParameters& params) {
268 boost::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = boost::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>()); 268 std::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>());
269 //TODO write generic methods for blob and list versions TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>();
270 bool success = trajectoryDB->connect(params.databaseFilename.c_str()); 269 bool success = trajectoryDB->connect(params.databaseFilename.c_str());
271 trajectoryDB->createObjectTable("objects", "objects_features"); 270 trajectoryDB->createObjectTable("objects", "objects_features");
272 unsigned int savedObjectId=0; 271 unsigned int savedObjectId=0;
273
274 // vector<boost::shared_ptr<Trajectory<Point2f> > > trajectories;
275 // cout << trajectories.size() << endl;
276 // std::clock_t c_start = std::clock();
277 // success = trajectoryDB->read(trajectories, "positions"); // TODO load velocities as well in a FeatureTrajectory object // attention, velocities lack the first instant
278 // std::clock_t c_end = std::clock();
279 // cout << "Loaded " << trajectories.size() << " trajectories in " << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC << " CPU seconds" << endl;
280
281 // boost::shared_ptr<Trajectory<cv::Point2f> > trajectory;
282 // c_start = std::clock();
283 // for (unsigned int i = 0; i<trajectories.size(); ++i) {
284 // success = trajectoryDB->read(trajectory, i, "positions");
285 // }
286 // c_end = std::clock();
287 // cout << "Loaded " << trajectories.size() << " trajectories one by one in " << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC << " CPU seconds" << endl;
288 272
289 trajectoryDB->createInstants("table"); 273 trajectoryDB->createInstants("table");
290 274
291 unsigned int maxTrajectoryLength = 0; 275 unsigned int maxTrajectoryLength = 0;
292 success = trajectoryDB->maxTrajectoryLength(maxTrajectoryLength); 276 success = trajectoryDB->maxTrajectoryLength(maxTrajectoryLength);
319 // trajectoryDB->read(velocities, trajectoryIds, "velocities"); 303 // trajectoryDB->read(velocities, trajectoryIds, "velocities");
320 // for (unsigned int i=0; i<trajectoryIds.size(); ++i) { 304 // for (unsigned int i=0; i<trajectoryIds.size(); ++i) {
321 // FeatureTrajectoryPtr ft = FeatureTrajectoryPtr(new FeatureTrajectory(positions[i], velocities[i])); 305 // FeatureTrajectoryPtr ft = FeatureTrajectoryPtr(new FeatureTrajectory(positions[i], velocities[i]));
322 BOOST_FOREACH(int trajectoryId, trajectoryIds) { 306 BOOST_FOREACH(int trajectoryId, trajectoryIds) {
323 //cout << trajectoryId << " " << endl; 307 //cout << trajectoryId << " " << endl;
324 // boost::shared_ptr<Trajectory<cv::Point2f> > trajectory; 308 // std::shared_ptr<Trajectory<cv::Point2f> > trajectory;
325 // success = trajectoryDB->read(trajectory, trajectoryId, "positions"); // velocities 309 // success = trajectoryDB->read(trajectory, trajectoryId, "positions"); // velocities
326 FeatureTrajectoryPtr ft = FeatureTrajectoryPtr(new FeatureTrajectory(trajectoryId, *trajectoryDB, "positions", "velocities")); 310 FeatureTrajectoryPtr ft = FeatureTrajectoryPtr(new FeatureTrajectory(trajectoryId, *trajectoryDB, "positions", "velocities"));
327 // stringstream ss;ss << *ft; cout << ss.str() << endl; 311 // stringstream ss;ss << *ft; cout << ss.str() << endl;
328 // cout << ft->getFirstInstant() << " " << ft->getLastInstant() << endl; 312 // cout << ft->getFirstInstant() << " " << ft->getLastInstant() << endl;
329 featureGraph.addFeature(ft); 313 featureGraph.addFeature(ft);
360 savedObjectId++; 344 savedObjectId++;
361 } 345 }
362 346
363 trajectoryDB->endTransaction(); 347 trajectoryDB->endTransaction();
364 trajectoryDB->disconnect(); 348 trajectoryDB->disconnect();
365 } 349 }
350
351 void loadingTimes(const KLTFeatureTrackingParameters& params) {
352 std::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>());
353 bool success = trajectoryDB->connect(params.databaseFilename.c_str());
354
355 vector<std::shared_ptr<Trajectory<Point2f> > > trajectories;
356 //cout << trajectories.size() << endl;
357 std::clock_t c_start = std::clock();
358 success = trajectoryDB->read(trajectories, "positions");
359 std::clock_t c_end = std::clock();
360 if (!success)
361 cout << "Issue with db reading" << endl;
362 cout << "Loaded " << trajectories.size() << " trajectories in " << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC << " CPU seconds" << endl;
363
364 std::shared_ptr<Trajectory<cv::Point2f> > trajectory;
365 c_start = std::clock();
366 for (unsigned int i = 0; i<trajectories.size(); ++i) {
367 success = trajectoryDB->read(trajectory, i, "positions");
368 }
369 c_end = std::clock();
370 cout << "Loaded " << trajectories.size() << " trajectories one by one in " << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC << " CPU seconds" << endl;
371
372 trajectoryDB->endTransaction();
373 trajectoryDB->disconnect();
374 }
366 375
367 int main(int argc, char *argv[]) { 376 int main(int argc, char *argv[]) {
368 KLTFeatureTrackingParameters params(argc, argv); 377 KLTFeatureTrackingParameters params(argc, argv);
369 cout << params.parameterDescription << endl; 378 cout << params.parameterDescription << endl;
370 379
371 if (params.trackFeatures) { 380 if (params.trackFeatures) {
372 cout << "The program tracks features" << endl; 381 cout << "The program tracks features" << endl;
373 trackFeatures(params); 382 trackFeatures(params);
374 } else if (params.groupFeatures) { 383 } else if (params.groupFeatures) {
375 cout << "The program groups features" << endl; 384 cout << "The program groups features" << endl;
376 groupFeatures(params); 385 groupFeatures(params);
386 } else if (params.loadingTime) {
387 cout << "The program reports loading times" << endl;
388 loadingTimes(params);
377 } else { 389 } else {
378 cout << "Main option missing or misspelt" << endl; 390 cout << "Main option missing or misspelt" << endl;
379 } 391 }
380 392
381 return 0; 393 return 0;