comparison c/feature-based-tracking.cpp @ 933:8ac7f61c6e4f

major rework of homography calibration, no in ideal points if correcting for distortion
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 14 Jul 2017 02:11:21 -0400
parents dbd81710d515
children 6c5ce3ec497e
comparison
equal deleted inserted replaced
932:66f382852e61 933:8ac7f61c6e4f
113 Mat map1, map2; 113 Mat map1, map2;
114 Mat intrinsicCameraMatrix, newIntrinsicCameraMatrix; 114 Mat intrinsicCameraMatrix, newIntrinsicCameraMatrix;
115 if (params.undistort) { 115 if (params.undistort) {
116 intrinsicCameraMatrix = ::loadMat(params.intrinsicCameraFilename, " "); 116 intrinsicCameraMatrix = ::loadMat(params.intrinsicCameraFilename, " ");
117 Size undistortedVideoSize = Size(static_cast<int>(round(videoSize.width*params.undistortedImageMultiplication)), static_cast<int>(round(videoSize.height*params.undistortedImageMultiplication))); 117 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);//getOptimalNewCameraMatrix(intrinsicCameraMatrix, params.distortionCoefficients, videoSize, 1, undistortedVideoSize);//, 0, true); 118 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); 119 initUndistortRectifyMap(intrinsicCameraMatrix, params.distortionCoefficients, Mat::eye(3,3, CV_32FC1) /* 0 ?*/, newIntrinsicCameraMatrix, undistortedVideoSize, CV_32FC1, map1, map2);
120 120
121 cout << "Undistorted width=" << undistortedVideoSize.width << 121 cout << "Undistorted width=" << undistortedVideoSize.width <<
122 ", height=" << undistortedVideoSize.height << endl; 122 ", height=" << undistortedVideoSize.height << endl;
123 } 123 }
165 currPts.clear(); 165 currPts.clear();
166 calcOpticalFlowPyrLK(previousFrameBW, currentFrameBW, prevPts, currPts, status, errors, window, params.pyramidLevel, TermCriteria(static_cast<int>(TermCriteria::COUNT)+static_cast<int>(TermCriteria::EPS) /* = 3 */, params.maxNumberTrackingIterations, params.minTrackingError), /* int flags = */ 0, params.minFeatureEigThreshold); 166 calcOpticalFlowPyrLK(previousFrameBW, currentFrameBW, prevPts, currPts, status, errors, window, params.pyramidLevel, TermCriteria(static_cast<int>(TermCriteria::COUNT)+static_cast<int>(TermCriteria::EPS) /* = 3 */, params.maxNumberTrackingIterations, params.minTrackingError), /* int flags = */ 0, params.minFeatureEigThreshold);
167 /// \todo try calcOpticalFlowFarneback 167 /// \todo try calcOpticalFlowFarneback
168 168
169 if (params.undistort) 169 if (params.undistort)
170 undistortPoints(currPts, undistortedPts, intrinsicCameraMatrix, params.distortionCoefficients, noArray(), newIntrinsicCameraMatrix); 170 undistortPoints(currPts, undistortedPts, intrinsicCameraMatrix, params.distortionCoefficients);
171 else 171 else
172 undistortedPts =currPts; 172 undistortedPts =currPts;
173 173
174 std::vector<Point2f> trackedPts; 174 std::vector<Point2f> trackedPts;
175 std::vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin(); 175 std::vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin();
206 } 206 }
207 } 207 }
208 currPts = trackedPts; 208 currPts = trackedPts;
209 assert(currPts.size() == featurePointMatches.size()); 209 assert(currPts.size() == featurePointMatches.size());
210 saveFeatures(lostFeatures, *trajectoryDB, "positions", "velocities"); 210 saveFeatures(lostFeatures, *trajectoryDB, "positions", "velocities");
211 211
212 if (params.display) { 212 if (params.display) {
213 if (params.undistort) 213 if (params.undistort)
214 remap(frame, displayFrame, map1, map2, interpolationMethod, BORDER_CONSTANT, 0.); 214 remap(frame, displayFrame, map1, map2, interpolationMethod, BORDER_CONSTANT, 0.);
215 else 215 else
216 displayFrame = frame.clone(); 216 displayFrame = frame.clone();
217
218 BOOST_FOREACH(FeaturePointMatch fp, featurePointMatches) 217 BOOST_FOREACH(FeaturePointMatch fp, featurePointMatches)
219 fp.feature->draw(displayFrame, invHomography, Colors::red()); 218 fp.feature->draw(displayFrame, invHomography, newIntrinsicCameraMatrix, Colors::red());
220 } 219 }
221 } 220 }
222 221
223 // adding new features, using mask around existing feature positions 222 // adding new features, using mask around existing feature positions
224 Mat featureMask = mask.clone(); 223 Mat featureMask = mask.clone();
226 for (int j=MAX(0, currPts[n].x-params.minFeatureDistanceKLT); j<MIN(videoSize.width, currPts[n].x+params.minFeatureDistanceKLT+1); j++) 225 for (int j=MAX(0, currPts[n].x-params.minFeatureDistanceKLT); j<MIN(videoSize.width, currPts[n].x+params.minFeatureDistanceKLT+1); j++)
227 for (int i=MAX(0, currPts[n].y-params.minFeatureDistanceKLT); i<MIN(videoSize.height, currPts[n].y+params.minFeatureDistanceKLT+1); i++) 226 for (int i=MAX(0, currPts[n].y-params.minFeatureDistanceKLT); i<MIN(videoSize.height, currPts[n].y+params.minFeatureDistanceKLT+1); i++)
228 featureMask.at<uchar>(i,j)=0; 227 featureMask.at<uchar>(i,j)=0;
229 goodFeaturesToTrack(currentFrameBW, newPts, params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, featureMask, params.blockSize, params.useHarrisDetector, params.k); 228 goodFeaturesToTrack(currentFrameBW, newPts, params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, featureMask, params.blockSize, params.useHarrisDetector, params.k);
230 if (params.undistort) 229 if (params.undistort)
231 undistortPoints(newPts, undistortedPts, intrinsicCameraMatrix, params.distortionCoefficients, noArray(), newIntrinsicCameraMatrix); 230 undistortPoints(newPts, undistortedPts, intrinsicCameraMatrix, params.distortionCoefficients);
232 else 231 else
233 undistortedPts = newPts; 232 undistortedPts = newPts;
234 233
235 for (unsigned int i=0; i<newPts.size(); i++) { 234 for (unsigned int i=0; i<newPts.size(); i++) {
236 FeatureTrajectoryPtr f = FeatureTrajectoryPtr(new FeatureTrajectory(frameNum, undistortedPts[i], homography)); 235 FeatureTrajectoryPtr f = FeatureTrajectoryPtr(new FeatureTrajectory(frameNum, undistortedPts[i], homography));