Mercurial Hosting > traffic-intelligence
comparison c/feature-based-tracking.cpp @ 1002:6c5ce3ec497e
improved handling of path for feature based tracking
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Fri, 01 Jun 2018 17:19:24 -0400 |
parents | 8ac7f61c6e4f |
children | 9fb82fe0156f |
comparison
equal
deleted
inserted
replaced
1001:cc7c6b821ae6 | 1002:6c5ce3ec497e |
---|---|
14 #include "opencv2/highgui/highgui.hpp" | 14 #include "opencv2/highgui/highgui.hpp" |
15 #include "opencv2/objdetect/objdetect.hpp" | 15 #include "opencv2/objdetect/objdetect.hpp" |
16 #include "opencv2/calib3d/calib3d.hpp" | 16 #include "opencv2/calib3d/calib3d.hpp" |
17 | 17 |
18 #include <boost/foreach.hpp> | 18 #include <boost/foreach.hpp> |
19 #include <boost/filesystem.hpp> | |
19 | 20 |
20 #include <iostream> | 21 #include <iostream> |
21 #include <vector> | 22 #include <vector> |
22 #include <ctime> | 23 #include <ctime> |
23 #include <cmath> | 24 #include <cmath> |
24 #include <memory> | 25 #include <memory> |
25 #include <limits> | 26 #include <limits> |
27 | |
28 namespace fs = boost::filesystem; // soon std | |
26 | 29 |
27 using namespace std; | 30 using namespace std; |
28 using namespace cv; | 31 using namespace cv; |
29 | 32 |
30 void drawMatchesRelative(const vector<KeyPoint>& train, const vector<KeyPoint>& query, std::vector<cv::DMatch>& matches, Mat& img) { | 33 void drawMatchesRelative(const vector<KeyPoint>& train, const vector<KeyPoint>& query, std::vector<cv::DMatch>& matches, Mat& img) { |
61 BOOST_FOREACH(FeatureTrajectoryPtr f, features) f->write(db, positionsTableName, velocitiesTableName); | 64 BOOST_FOREACH(FeatureTrajectoryPtr f, features) f->write(db, positionsTableName, velocitiesTableName); |
62 features.clear(); | 65 features.clear(); |
63 } | 66 } |
64 | 67 |
65 void trackFeatures(const KLTFeatureTrackingParameters& params) { | 68 void trackFeatures(const KLTFeatureTrackingParameters& params) { |
66 Mat homography = ::loadMat(params.homographyFilename, " "); | 69 Mat homography = ::loadMat(::getRelativeFilename(params.parentDirname, params.homographyFilename), " "); |
70 | |
67 Mat invHomography; | 71 Mat invHomography; |
68 if (params.display && !homography.empty()) | 72 if (params.display && !homography.empty()) |
69 invHomography = homography.inv(); | 73 invHomography = homography.inv(); |
70 | 74 |
71 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement; | 75 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement; |
88 | 92 |
89 if(params.videoFilename.empty()) { | 93 if(params.videoFilename.empty()) { |
90 cout << "Empty video filename. Exiting." << endl; | 94 cout << "Empty video filename. Exiting." << endl; |
91 exit(0); | 95 exit(0); |
92 } | 96 } |
93 | 97 |
94 VideoCapture capture(params.videoFilename); | 98 VideoCapture capture(::getRelativeFilename(params.parentDirname, params.videoFilename)); |
95 if(!capture.isOpened()) { | 99 if(!capture.isOpened()) { |
96 cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl; | 100 cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl; |
97 exit(0); | 101 exit(0); |
98 } | 102 } |
99 | 103 |
111 ", nframes=" << nFrames << endl; | 115 ", nframes=" << nFrames << endl; |
112 | 116 |
113 Mat map1, map2; | 117 Mat map1, map2; |
114 Mat intrinsicCameraMatrix, newIntrinsicCameraMatrix; | 118 Mat intrinsicCameraMatrix, newIntrinsicCameraMatrix; |
115 if (params.undistort) { | 119 if (params.undistort) { |
116 intrinsicCameraMatrix = ::loadMat(params.intrinsicCameraFilename, " "); | 120 intrinsicCameraMatrix = ::loadMat(::getRelativeFilename(params.parentDirname, params.intrinsicCameraFilename), " "); |
117 Size undistortedVideoSize = Size(static_cast<int>(round(videoSize.width*params.undistortedImageMultiplication)), static_cast<int>(round(videoSize.height*params.undistortedImageMultiplication))); | 121 Size undistortedVideoSize = Size(static_cast<int>(round(videoSize.width*params.undistortedImageMultiplication)), static_cast<int>(round(videoSize.height*params.undistortedImageMultiplication))); |
118 newIntrinsicCameraMatrix = getDefaultNewCameraMatrix(intrinsicCameraMatrix, undistortedVideoSize, true);// for some reason, it's double type //getOptimalNewCameraMatrix(intrinsicCameraMatrix, params.distortionCoefficients, videoSize, 1, undistortedVideoSize);//, 0, true); | 122 newIntrinsicCameraMatrix = getDefaultNewCameraMatrix(intrinsicCameraMatrix, undistortedVideoSize, true);// for some reason, it's double type //getOptimalNewCameraMatrix(intrinsicCameraMatrix, params.distortionCoefficients, videoSize, 1, undistortedVideoSize);//, 0, true); |
119 initUndistortRectifyMap(intrinsicCameraMatrix, params.distortionCoefficients, Mat::eye(3,3, CV_32FC1) /* 0 ?*/, newIntrinsicCameraMatrix, undistortedVideoSize, CV_32FC1, map1, map2); | 123 initUndistortRectifyMap(intrinsicCameraMatrix, params.distortionCoefficients, Mat::eye(3,3, CV_32FC1) /* 0 ?*/, newIntrinsicCameraMatrix, undistortedVideoSize, CV_32FC1, map1, map2); |
120 | 124 |
121 cout << "Undistorted width=" << undistortedVideoSize.width << | 125 cout << "Undistorted width=" << undistortedVideoSize.width << |
122 ", height=" << undistortedVideoSize.height << endl; | 126 ", height=" << undistortedVideoSize.height << endl; |
123 } | 127 } |
124 | 128 |
125 Mat mask = imread(params.maskFilename, 0); | 129 Mat mask = imread(::getRelativeFilename(params.parentDirname, params.maskFilename), 0); |
126 if (mask.empty()) { | 130 if (mask.empty()) { |
127 cout << "Mask filename " << params.maskFilename << " could not be opened." << endl; | 131 cout << "Mask filename " << params.maskFilename << " could not be opened." << endl; |
128 mask = Mat::ones(videoSize, CV_8UC1); | 132 mask = Mat::ones(videoSize, CV_8UC1); |
129 } | 133 } |
130 | 134 |
131 std::shared_ptr<TrajectoryDBAccess<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccess<Point2f> >(new TrajectoryDBAccessList<Point2f>()); | 135 std::shared_ptr<TrajectoryDBAccess<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccess<Point2f> >(new TrajectoryDBAccessList<Point2f>()); |
132 trajectoryDB->connect(params.databaseFilename.c_str()); | 136 trajectoryDB->connect(::getRelativeFilename(params.parentDirname, params.databaseFilename).c_str()); |
133 trajectoryDB->createTable("positions"); | 137 trajectoryDB->createTable("positions"); |
134 trajectoryDB->createTable("velocities"); | 138 trajectoryDB->createTable("velocities"); |
135 trajectoryDB->beginTransaction(); | 139 trajectoryDB->beginTransaction(); |
136 | 140 |
137 std::vector<Point2f> prevPts, currPts, newPts, undistortedPts; // all points but undistortedPts are in image space | 141 std::vector<Point2f> prevPts, currPts, newPts, undistortedPts; // all points but undistortedPts are in image space |
262 trajectoryDB->disconnect(); | 266 trajectoryDB->disconnect(); |
263 } | 267 } |
264 | 268 |
265 void groupFeatures(const KLTFeatureTrackingParameters& params) { | 269 void groupFeatures(const KLTFeatureTrackingParameters& params) { |
266 std::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>()); | 270 std::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>()); |
267 bool success = trajectoryDB->connect(params.databaseFilename.c_str()); | 271 bool success = trajectoryDB->connect(::getRelativeFilename(params.parentDirname, params.databaseFilename).c_str()); |
268 trajectoryDB->createObjectTable("objects", "objects_features"); | 272 trajectoryDB->createObjectTable("objects", "objects_features"); |
269 unsigned int savedObjectId=0; | 273 unsigned int savedObjectId=0; |
270 | 274 |
271 trajectoryDB->createInstants("table"); | 275 trajectoryDB->createInstants("table"); |
272 //trajectoryDB->createIndex("positions","trajectory_id"); // does not seem to make loading features faster | 276 //trajectoryDB->createIndex("positions","trajectory_id"); // does not seem to make loading features faster |
337 trajectoryDB->disconnect(); | 341 trajectoryDB->disconnect(); |
338 } | 342 } |
339 | 343 |
340 void loadingTimes(const KLTFeatureTrackingParameters& params) { | 344 void loadingTimes(const KLTFeatureTrackingParameters& params) { |
341 std::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>()); | 345 std::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = std::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>()); |
342 bool success = trajectoryDB->connect(params.databaseFilename.c_str()); | 346 bool success = trajectoryDB->connect(::getRelativeFilename(params.parentDirname, params.databaseFilename).c_str()); |
343 | 347 |
344 vector<std::shared_ptr<Trajectory<Point2f> > > trajectories; | 348 vector<std::shared_ptr<Trajectory<Point2f> > > trajectories; |
345 //cout << trajectories.size() << endl; | 349 //cout << trajectories.size() << endl; |
346 std::clock_t c_start = std::clock(); | 350 std::clock_t c_start = std::clock(); |
347 success = trajectoryDB->read(trajectories, "positions"); | 351 success = trajectoryDB->read(trajectories, "positions"); |