comparison c/feature-based-tracking.cpp @ 509:935430b1d408

corrected mask bug in feature tracking, updated display-trajectories to display on undistorted image
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 23 May 2014 16:27:26 -0400
parents 081a9da6f85b
children 018653d1db3c
comparison
equal deleted inserted replaced
508:6f7fa0093162 509:935430b1d408
21 #include <boost/filesystem.hpp> 21 #include <boost/filesystem.hpp>
22 22
23 #include <iostream> 23 #include <iostream>
24 #include <vector> 24 #include <vector>
25 #include <ctime> 25 #include <ctime>
26 #include <cmath>
26 27
27 using namespace std; 28 using namespace std;
28 using namespace cv; 29 using namespace cv;
29 namespace fs = boost::filesystem; 30 namespace fs = boost::filesystem;
30 31
75 Mat intrinsicCameraMatrix = ::loadMat(params.intrinsicCameraFilename, " "); 76 Mat intrinsicCameraMatrix = ::loadMat(params.intrinsicCameraFilename, " ");
76 //cout << intrinsicCameraMatrix << endl; 77 //cout << intrinsicCameraMatrix << endl;
77 78
78 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement; 79 float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement;
79 Size window = Size(params.windowSize, params.windowSize); 80 Size window = Size(params.windowSize, params.windowSize);
81
82 int interpolationMethod = -1;
83 if (params.interpolationMethod == 0)
84 interpolationMethod = INTER_NEAREST;
85 else if (params.interpolationMethod == 1)
86 interpolationMethod = INTER_LINEAR;
87 else if (params.interpolationMethod == 2)
88 interpolationMethod = INTER_CUBIC;
89 else if (params.interpolationMethod == 3)
90 interpolationMethod = INTER_LANCZOS4;
91 else
92 cout << "Unsupported option " << interpolationMethod << " for interpolation method" << endl;
80 93
81 // BruteForceMatcher<Hamming> descMatcher; 94 // BruteForceMatcher<Hamming> descMatcher;
82 // vector<DMatch> matches; 95 // vector<DMatch> matches;
83 96
84 boost::shared_ptr<InputFrameProviderIface> capture; 97 boost::shared_ptr<InputFrameProviderIface> capture;
93 cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl; 106 cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl;
94 exit(0); 107 exit(0);
95 } 108 }
96 109
97 Size videoSize = capture->getSize(); 110 Size videoSize = capture->getSize();
98 //cout << capture->getSize() << " " << params.undistortedImageMultiplication*videoSize << endl;
99 unsigned int nFrames = capture->getNbFrames(); 111 unsigned int nFrames = capture->getNbFrames();
100 cout << "Video " << params.videoFilename << 112 cout << "Video " << params.videoFilename <<
101 ": width=" << videoSize.width << 113 ": width=" << videoSize.width <<
102 ", height=" << videoSize.height << 114 ", height=" << videoSize.height <<
103 ", nframes=" << nFrames << endl; 115 ", nframes=" << nFrames << endl;
104 116
105 Mat newIntrinsicCameraMatrix = intrinsicCameraMatrix.clone(); 117 Mat newIntrinsicCameraMatrix = intrinsicCameraMatrix.clone();
106 Size newVideoSize = videoSize; 118 Mat map1, map2;
107 if (params.undistort) { 119 if (params.undistort) {
108 newVideoSize = Size(static_cast<int>(videoSize.width*params.undistortedImageMultiplication), static_cast<int>(videoSize.height*params.undistortedImageMultiplication)); 120 videoSize = Size(static_cast<int>(round(videoSize.width*params.undistortedImageMultiplication)), static_cast<int>(round(videoSize.height*params.undistortedImageMultiplication)));
109 newIntrinsicCameraMatrix.at<float>(0,2) = newVideoSize.width/2.; 121 newIntrinsicCameraMatrix.at<float>(0,2) = videoSize.width/2.;
110 newIntrinsicCameraMatrix.at<float>(1,2) = newVideoSize.height/2.; 122 newIntrinsicCameraMatrix.at<float>(1,2) = videoSize.height/2.;
123 initUndistortRectifyMap(intrinsicCameraMatrix, params.distortionCoefficients, Mat::eye(3,3, CV_32FC1), newIntrinsicCameraMatrix, videoSize, CV_32FC1, map1, map2);
124
125 cout << "Undistorted width=" << videoSize.width <<
126 ", height=" << videoSize.height << endl;
111 } 127 }
112 128
113 Mat map1, map2;
114 Mat R = Mat::eye(3,3, CV_32FC1);
115 if (params.undistort)
116 initUndistortRectifyMap(intrinsicCameraMatrix, params.distortionCoefficients, R, newIntrinsicCameraMatrix, newVideoSize, CV_32FC1, map1, map2);
117
118 // todo mask in new size
119 Mat mask = imread(params.maskFilename, 0); 129 Mat mask = imread(params.maskFilename, 0);
120 if (mask.empty()) { 130 if (mask.empty()) {
121 cout << "Mask filename " << params.maskFilename << " could not be opened." << endl; 131 cout << "Mask filename " << params.maskFilename << " could not be opened." << endl;
122 mask = Mat::ones(newVideoSize, CV_8UC1); 132 mask = Mat::ones(videoSize, CV_8UC1);
123 } 133 }
124 134
125 boost::shared_ptr<TrajectoryDBAccess<Point2f> > trajectoryDB = boost::shared_ptr<TrajectoryDBAccess<Point2f> >(new TrajectoryDBAccessList<Point2f>()); 135 boost::shared_ptr<TrajectoryDBAccess<Point2f> > trajectoryDB = boost::shared_ptr<TrajectoryDBAccess<Point2f> >(new TrajectoryDBAccessList<Point2f>());
126 //TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>(); 136 //TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>();
127 trajectoryDB->connect(params.databaseFilename.c_str()); 137 trajectoryDB->connect(params.databaseFilename.c_str());
148 158
149 capture->setFrameNumber(params.frame1); 159 capture->setFrameNumber(params.frame1);
150 for (unsigned int frameNum = params.frame1; (frameNum < lastFrameNum) && !::interruptionKey(key); frameNum++) { 160 for (unsigned int frameNum = params.frame1; (frameNum < lastFrameNum) && !::interruptionKey(key); frameNum++) {
151 bool success = capture->getNextFrame(frame); 161 bool success = capture->getNextFrame(frame);
152 if (params.undistort) { 162 if (params.undistort) {
153 remap(frame, undistortedFrame, map1, map2, INTER_LINEAR, BORDER_CONSTANT, 0.); 163 remap(frame, undistortedFrame, map1, map2, interpolationMethod, BORDER_CONSTANT, 0.);
154 frame = undistortedFrame; 164 frame = undistortedFrame;
155 } 165 }
156 //if (!success || frame.empty() || frame.size() != videoSize) 166 //if (!success || frame.empty() || frame.size() != videoSize)
157 //break; 167 //break;
158 168