Mercurial Hosting > traffic-intelligence
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)); |