Mercurial Hosting > traffic-intelligence
comparison c/feature-based-tracking.cpp @ 130:2a6e7a9a5c53
changed to goodFeaturesToTrack instead of generic detectors
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Wed, 17 Aug 2011 17:30:30 -0400 |
parents | 536510f60854 |
children | 45c64e68053c |
comparison
equal
deleted
inserted
replaced
129:4742b2b6d851 | 130:2a6e7a9a5c53 |
---|---|
1 //#include "Feature.hpp" | 1 #include "Feature.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 | 5 |
6 #include "src/Trajectory.h" | 6 #include "src/Trajectory.h" |
41 } | 41 } |
42 } | 42 } |
43 } | 43 } |
44 | 44 |
45 int main(int argc, char *argv[]) { | 45 int main(int argc, char *argv[]) { |
46 //vector<TrajectoryPoint2f> features; | |
47 | |
48 BriefDescriptorExtractor brief(32); | 46 BriefDescriptorExtractor brief(32); |
49 const int DESIRED_FTRS = 500; | 47 const int DESIRED_FTRS = 500; |
50 //shared_ptr<FeatureDetector> detector = shared_ptr<FeatureDetector>(new GridAdaptedFeatureDetector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4)); | 48 //shared_ptr<FeatureDetector> detector = shared_ptr<FeatureDetector>(new GridAdaptedFeatureDetector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4)); |
51 //GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4); | 49 //GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4); |
52 | 50 |
60 params.featureQuality = 0.1; | 58 params.featureQuality = 0.1; |
61 params.minFeatureDistanceKLT = 3; | 59 params.minFeatureDistanceKLT = 3; |
62 params.windowSize = 3; | 60 params.windowSize = 3; |
63 params.useHarrisDetector = false; | 61 params.useHarrisDetector = false; |
64 params.k = 0.4; | 62 params.k = 0.4; |
65 GoodFeaturesToTrackDetector detector(params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, params.windowSize, params.useHarrisDetector, params.k); | 63 //GoodFeaturesToTrackDetector detector(params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, params.windowSize, params.useHarrisDetector, params.k); |
66 | 64 |
67 params.pyramidLevel = 3; | 65 params.pyramidLevel = 3; |
68 params.maxNumberTrackingIterations = 20; // 30 | 66 params.maxNumberTrackingIterations = 20; // 30 |
69 params.minTrackingError = 0.3; // 0.01 | 67 params.minTrackingError = 0.3; // 0.01 |
70 params.derivLambda = 0.5; | 68 params.derivLambda = 0.5; |
102 cout << "capture device " << argv[1] << " failed to open!" << endl; | 100 cout << "capture device " << argv[1] << " failed to open!" << endl; |
103 return 1; | 101 return 1; |
104 } | 102 } |
105 | 103 |
106 vector<KeyPoint> prevKpts, currKpts; | 104 vector<KeyPoint> prevKpts, currKpts; |
107 vector<Point2f> prevPts, currPts; | 105 vector<Point2f> prevPts, currPts, newPts; |
108 vector<uchar> status; | 106 vector<uchar> status; |
109 vector<float> errors; | 107 vector<float> errors; |
110 Mat prevDesc, currDesc; | 108 Mat prevDesc, currDesc; |
111 | 109 |
112 | 110 vector<FeatureTrajectory> features; |
111 | |
113 // TODO structure de donnee paires pointeur trajectory, numero de keypoint | 112 // TODO structure de donnee paires pointeur trajectory, numero de keypoint |
114 int key = '?'; | 113 int key = '?'; |
115 for (int frameNum = params.frame1; ((params.frame1+frameNum < params.nFrames) || (params.nFrames < 0)) && !::interruptionKey(key); frameNum++) { | 114 for (int frameNum = params.frame1; ((params.frame1+frameNum < params.nFrames) || (params.nFrames < 0)) && !::interruptionKey(key); frameNum++) { |
116 capture >> frame; | 115 capture >> frame; |
117 cout << capture.get(CV_CAP_PROP_POS_FRAMES) << " " << prevPts.size() << endl; | 116 cout << capture.get(CV_CAP_PROP_POS_FRAMES) << " " << prevPts.size() << endl; |
118 while (frame.empty()) | 117 while (frame.empty()) |
119 capture >> frame;//break; | 118 capture >> frame;//break; |
120 | 119 |
121 cvtColor(frame, currentFrameBW, CV_RGB2GRAY); | 120 cvtColor(frame, currentFrameBW, CV_RGB2GRAY); |
121 | |
122 // "normal" feature detectors: detect features here | |
123 // detector.detect(currentFrameBW, currKpts); // see video_homography c++ sample | |
122 | 124 |
123 if (!prevPts.empty()) { | 125 if (!prevPts.empty()) { |
124 //::keyPoints2Points(prevKpts, prevPts); | 126 //::keyPoints2Points(prevKpts, prevPts); |
125 currPts.clear(); | 127 currPts.clear(); |
126 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), params.derivLambda, 0); // OPTFLOW_USE_INITIAL_FLOW | 128 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), params.derivLambda, 0); // OPTFLOW_USE_INITIAL_FLOW |
143 Mat featureMask = Mat::ones(videoSize, CV_8UC1); | 145 Mat featureMask = Mat::ones(videoSize, CV_8UC1); |
144 for (unsigned int n=0;n<currPts.size(); n++) | 146 for (unsigned int n=0;n<currPts.size(); n++) |
145 for (int j=MAX(0, currPts[n].x-params.minFeatureDistanceKLT); j<MIN(videoSize.width, currPts[n].x+params.minFeatureDistanceKLT+1); j++) | 147 for (int j=MAX(0, currPts[n].x-params.minFeatureDistanceKLT); j<MIN(videoSize.width, currPts[n].x+params.minFeatureDistanceKLT+1); j++) |
146 for (int i=MAX(0, currPts[n].y-params.minFeatureDistanceKLT); i<MIN(videoSize.height, currPts[n].y+params.minFeatureDistanceKLT+1); i++) | 148 for (int i=MAX(0, currPts[n].y-params.minFeatureDistanceKLT); i<MIN(videoSize.height, currPts[n].y+params.minFeatureDistanceKLT+1); i++) |
147 featureMask.at<uchar>(i,j)=0; | 149 featureMask.at<uchar>(i,j)=0; |
148 detector.detect(currentFrameBW, currKpts, featureMask); | 150 goodFeaturesToTrack(currentFrameBW, newPts, params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, featureMask, params.windowSize, params.useHarrisDetector, params.k); |
149 ::keyPoints2Points(currKpts, currPts, false); | 151 currPts.insert(currPts.end(), newPts.begin(), newPts.end()); |
152 //::keyPoints2Points(currKpts, currPts, false); | |
150 | 153 |
151 //brief.compute(currentFrameBW, currKpts, currDesc); //Compute brief descriptors at each keypoint location | 154 //brief.compute(currentFrameBW, currKpts, currDesc); //Compute brief descriptors at each keypoint location |
152 | 155 |
153 imshow("frame", frame); | 156 imshow("frame", frame); |
154 imshow("mask", featureMask*256); | 157 imshow("mask", featureMask*256); |