Mercurial > hg > nsaunier > traffic-intelligence
comparison c/feature-based-tracking.cpp @ 498:ef4059f51af9
merged
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Mon, 05 May 2014 23:17:46 -0400 |
| parents | b96ff16b1c81 |
| children | 081a9da6f85b |
comparison
equal
deleted
inserted
replaced
| 497:6ebdd90ce3ee | 498:ef4059f51af9 |
|---|---|
| 1 #include "Motion.hpp" | 1 #include "Motion.hpp" |
| 2 #include "Parameters.hpp" | 2 #include "Parameters.hpp" |
| 3 #include "cvutils.hpp" | 3 #include "cvutils.hpp" |
| 4 #include "utils.hpp" | 4 #include "utils.hpp" |
| 5 #include "InputVideoFileModule.h" | |
| 6 #include "InputFrameListModule.h" | |
| 5 | 7 |
| 6 #include "src/Trajectory.h" | 8 #include "src/Trajectory.h" |
| 7 #include "src/TrajectoryDBAccessList.h" | 9 #include "src/TrajectoryDBAccessList.h" |
| 8 #include "src/TrajectoryDBAccessBlob.h" | 10 #include "src/TrajectoryDBAccessBlob.h" |
| 9 | 11 |
| 15 #include "opencv2/objdetect/objdetect.hpp" | 17 #include "opencv2/objdetect/objdetect.hpp" |
| 16 | 18 |
| 17 #include <boost/shared_ptr.hpp> | 19 #include <boost/shared_ptr.hpp> |
| 18 #include <boost/foreach.hpp> | 20 #include <boost/foreach.hpp> |
| 19 #include <boost/filesystem.hpp> | 21 #include <boost/filesystem.hpp> |
| 20 | |
| 21 #include "InputVideoFileModule.h" | |
| 22 #include "InputFrameListModule.h" | |
| 23 | 22 |
| 24 #include <iostream> | 23 #include <iostream> |
| 25 #include <vector> | 24 #include <vector> |
| 26 #include <ctime> | 25 #include <ctime> |
| 27 | 26 |
| 131 Mat frame = Mat::zeros(1, 1, CV_8UC1), currentFrameBW, previousFrameBW; | 130 Mat frame = Mat::zeros(1, 1, CV_8UC1), currentFrameBW, previousFrameBW; |
| 132 | 131 |
| 133 unsigned int lastFrameNum = nFrames; | 132 unsigned int lastFrameNum = nFrames; |
| 134 if (params.nFrames > 0) | 133 if (params.nFrames > 0) |
| 135 lastFrameNum = MIN(params.frame1+static_cast<unsigned int>(params.nFrames), nFrames); | 134 lastFrameNum = MIN(params.frame1+static_cast<unsigned int>(params.nFrames), nFrames); |
| 136 | 135 |
| 137 capture->setFrameNumber(params.frame1); | 136 capture->setFrameNumber(params.frame1); |
| 138 for (unsigned int frameNum = params.frame1; (frameNum < lastFrameNum) && !::interruptionKey(key); frameNum++) { | 137 for (unsigned int frameNum = params.frame1; (frameNum < lastFrameNum) && !::interruptionKey(key); frameNum++) { |
| 139 bool success = capture->getNextFrame(frame); | 138 bool success = capture->getNextFrame(frame); |
| 140 | 139 |
| 141 if (!success || frame.empty() || frame.size() != videoSize) | 140 if (!success || frame.empty() || frame.size() != videoSize) |
| 146 | 145 |
| 147 cvtColor(frame, currentFrameBW, CV_RGB2GRAY); | 146 cvtColor(frame, currentFrameBW, CV_RGB2GRAY); |
| 148 | 147 |
| 149 if (!prevPts.empty()) { | 148 if (!prevPts.empty()) { |
| 150 currPts.clear(); | 149 currPts.clear(); |
| 151 calcOpticalFlowPyrLK(previousFrameBW, currentFrameBW, prevPts, currPts, status, errors, window, params.pyramidLevel, TermCriteria(3 /*static_cast<int>(TermCriteria::COUNT)+static_cast<int>(TermCriteria::EPS)*/, params.maxNumberTrackingIterations, params.minTrackingError), /* int flags = */ 0, params.minFeatureEigThreshold); | 150 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); |
| 152 /// \todo try calcOpticalFlowFarneback | 151 /// \todo try calcOpticalFlowFarneback |
| 153 | 152 |
| 154 std::vector<Point2f> trackedPts; | 153 std::vector<Point2f> trackedPts; |
| 155 std::vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin(); | 154 std::vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin(); |
| 156 while (iter != featurePointMatches.end()) { | 155 while (iter != featurePointMatches.end()) { |
| 199 Mat featureMask = mask.clone(); | 198 Mat featureMask = mask.clone(); |
| 200 for (unsigned int n=0;n<currPts.size(); n++) | 199 for (unsigned int n=0;n<currPts.size(); n++) |
| 201 for (int j=MAX(0, currPts[n].x-params.minFeatureDistanceKLT); j<MIN(videoSize.width, currPts[n].x+params.minFeatureDistanceKLT+1); j++) | 200 for (int j=MAX(0, currPts[n].x-params.minFeatureDistanceKLT); j<MIN(videoSize.width, currPts[n].x+params.minFeatureDistanceKLT+1); j++) |
| 202 for (int i=MAX(0, currPts[n].y-params.minFeatureDistanceKLT); i<MIN(videoSize.height, currPts[n].y+params.minFeatureDistanceKLT+1); i++) | 201 for (int i=MAX(0, currPts[n].y-params.minFeatureDistanceKLT); i<MIN(videoSize.height, currPts[n].y+params.minFeatureDistanceKLT+1); i++) |
| 203 featureMask.at<uchar>(i,j)=0; | 202 featureMask.at<uchar>(i,j)=0; |
| 204 goodFeaturesToTrack(currentFrameBW, newPts, params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, featureMask, params.windowSize, params.useHarrisDetector, params.k); | 203 goodFeaturesToTrack(currentFrameBW, newPts, params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, featureMask, params.blockSize, params.useHarrisDetector, params.k); |
| 205 BOOST_FOREACH(Point2f p, newPts) { //for (unsigned int i=0; i<newPts.size(); i++) { | 204 BOOST_FOREACH(Point2f p, newPts) { //for (unsigned int i=0; i<newPts.size(); i++) { |
| 206 FeatureTrajectoryPtr f = FeatureTrajectoryPtr(new FeatureTrajectory(frameNum, p, homography)); | 205 FeatureTrajectoryPtr f = FeatureTrajectoryPtr(new FeatureTrajectory(frameNum, p, homography)); |
| 207 featurePointMatches.push_back(FeaturePointMatch(f, currPts.size())); | 206 featurePointMatches.push_back(FeaturePointMatch(f, currPts.size())); |
| 208 currPts.push_back(p); | 207 currPts.push_back(p); |
| 209 } | 208 } |
