Mercurial > hg > nsaunier > traffic-intelligence
comparison c/feature-based-tracking.cpp @ 125:28907fde9855
work on klt tracker (problem on computer at poly)
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Tue, 16 Aug 2011 19:35:07 -0400 |
| parents | 1e68e18b1aa5 |
| children | d19d6e63dd77 |
comparison
equal
deleted
inserted
replaced
| 124:1e68e18b1aa5 | 125:28907fde9855 |
|---|---|
| 6 | 6 |
| 7 #include "opencv2/highgui/highgui.hpp" | 7 #include "opencv2/highgui/highgui.hpp" |
| 8 //#include "opencv2/imgproc/imgproc.hpp" | 8 //#include "opencv2/imgproc/imgproc.hpp" |
| 9 #include "opencv2/features2d/features2d.hpp" | 9 #include "opencv2/features2d/features2d.hpp" |
| 10 | 10 |
| 11 #include <boost/shared_ptr.hpp> | |
| 12 | |
| 11 #include <iostream> | 13 #include <iostream> |
| 12 //#include <list> | 14 //#include <list> |
| 13 #include <vector> | 15 #include <vector> |
| 14 | 16 |
| 15 using namespace std; | 17 using namespace std; |
| 16 using namespace cv; | 18 using namespace cv; |
| 17 | 19 using namespace boost; |
| 18 //#include "cv.h" | |
| 19 | |
| 20 using namespace std; | |
| 21 | 20 |
| 22 void drawMatchesRelative(const vector<KeyPoint>& train, const vector<KeyPoint>& query, std::vector<cv::DMatch>& matches, Mat& img) { | 21 void drawMatchesRelative(const vector<KeyPoint>& train, const vector<KeyPoint>& query, std::vector<cv::DMatch>& matches, Mat& img) { |
| 23 for (int i = 0; i < (int)matches.size(); i++) | 22 for (int i = 0; i < (int)matches.size(); i++) |
| 24 { | 23 { |
| 25 Point2f pt_new = query[matches[i].queryIdx].pt; | 24 Point2f pt_new = query[matches[i].queryIdx].pt; |
| 31 } | 30 } |
| 32 } | 31 } |
| 33 } | 32 } |
| 34 | 33 |
| 35 int main(int argc, char *argv[]) { | 34 int main(int argc, char *argv[]) { |
| 36 vector<TrajectoryPoint2f> features; | 35 //vector<TrajectoryPoint2f> features; |
| 36 | |
| 37 BriefDescriptorExtractor brief(32); | 37 BriefDescriptorExtractor brief(32); |
| 38 | 38 const int DESIRED_FTRS = 500; |
| 39 //shared_ptr<FeatureDetector> detector = shared_ptr<FeatureDetector>(new GridAdaptedFeatureDetector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4)); | |
| 40 GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4); | |
| 41 | |
| 39 VideoCapture capture; | 42 VideoCapture capture; |
| 43 Mat frame, display; | |
| 40 | 44 |
| 41 Mat frame, display; | |
| 42 KLTFeatureTrackingParameters params; | 45 KLTFeatureTrackingParameters params; |
| 43 params.frame1 = 0; | 46 params.frame1 = 0; |
| 44 params.nFrames = -1; | 47 params.nFrames = -1; |
| 45 // TODO ajouter klt paremeters, reprendre code de | 48 // TODO ajouter klt paremeters, reprendre code de opencvfeaturetracker |
| 46 // GoodFeaturesToTrackDetector feature_detector(Params.max_nfeatures, Params.feature_quality, Params.min_feature_distance_klt, Params.window_size, Params.useHarrisDetector_GoodFeaturesToTrackDetector, Params.k_GoodFeaturesToTrackDetector); | 49 //GoodFeaturesToTrackDetector detector(Params.max_nfeatures, Params.feature_quality, Params.min_feature_distance_klt, Params.window_size, Params.useHarrisDetector_GoodFeaturesToTrackDetector, Params.k_GoodFeaturesToTrackDetector); |
| 47 // search descriptor_match.h | 50 // search descriptor_match.h |
| 51 | |
| 52 BruteForceMatcher<Hamming> descMatcher; | |
| 53 vector<DMatch> matches; | |
| 48 | 54 |
| 49 if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter | 55 if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter |
| 50 capture.open(argc == 2 ? argv[1][0] - '0' : 0); | 56 capture.open(argc == 2 ? argv[1][0] - '0' : 0); |
| 51 else if( argc >= 2 ) | 57 else if( argc >= 2 ) |
| 52 { | 58 { |
| 72 //help(argv); | 78 //help(argv); |
| 73 cout << "capture device " << argv[1] << " failed to open!" << endl; | 79 cout << "capture device " << argv[1] << " failed to open!" << endl; |
| 74 return 1; | 80 return 1; |
| 75 } | 81 } |
| 76 | 82 |
| 77 vector<DMatch> matches; | |
| 78 | |
| 79 BruteForceMatcher<Hamming> desc_matcher; | |
| 80 | |
| 81 vector<KeyPoint> prevKpts, currKpts; | 83 vector<KeyPoint> prevKpts, currKpts; |
| 82 vector<unsigned char> match_mask; | |
| 83 | 84 |
| 84 Mat gray; | 85 Mat gray; |
| 85 | 86 |
| 86 Mat prevDesc, currDesc; | 87 Mat prevDesc, currDesc; |
| 87 const int DESIRED_FTRS = 500; | |
| 88 GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4); | |
| 89 | |
| 90 // TODO structure de donnee paires pointeur trajectory, numero de keypoint | 88 // TODO structure de donnee paires pointeur trajectory, numero de keypoint |
| 91 | 89 int key = '?'; |
| 92 for (int frameNum = 0; (params.frame1+frameNum < params.nFrames) || (params.nFrames < 0); frameNum++) { | 90 for (int frameNum = 0; ((params.frame1+frameNum < params.nFrames) || (params.nFrames < 0)) && !::interruptionKey(key); frameNum++) { |
| 93 frameNum++; | |
| 94 //capture.set(CV_CAP_PROP_POS_FRAMES, frameNum); | |
| 95 //capture.grab();capture.grab();capture.retrieve(frame); | |
| 96 capture >> frame; | 91 capture >> frame; |
| 97 //cout << capture.get(CV_CAP_PROP_POS_FRAMES) << endl; | 92 cout << capture.get(CV_CAP_PROP_POS_FRAMES) << endl; |
| 98 while (frame.empty()) | 93 while (frame.empty()) |
| 99 capture >> frame;//break; | 94 capture >> frame;//break; |
| 100 | 95 |
| 101 cvtColor(frame, gray, CV_RGB2GRAY); | 96 cvtColor(frame, gray, CV_RGB2GRAY); |
| 102 | 97 |
| 104 //cout << currKpts.size() << " kpts" << endl; | 99 //cout << currKpts.size() << " kpts" << endl; |
| 105 | 100 |
| 106 brief.compute(gray, currKpts, currDesc); //Compute brief descriptors at each keypoint location | 101 brief.compute(gray, currKpts, currDesc); //Compute brief descriptors at each keypoint location |
| 107 | 102 |
| 108 //display = frame.clone(); | 103 //display = frame.clone(); |
| 109 if (!prevKpts.empty()) | 104 if (!prevKpts.empty()) { |
| 110 { | 105 cout << matches.size() << " matches" << endl; |
| 111 desc_matcher.match(currDesc, prevDesc, matches); | 106 descMatcher.match(currDesc, prevDesc, matches); |
| 112 cout << "matches:" << matches.size() << endl; | 107 cout << matches.size() << " matches" << endl; |
| 113 drawMatchesRelative(prevKpts, currKpts, matches, frame); | 108 drawMatchesRelative(prevKpts, currKpts, matches, frame); |
| 114 //drawMatches(frame, prevKpts, frame, currKpts, matches, display);//, Scalar::all(-1), Scalar::all(-1), vector<vector<char> >(), DrawMatchesFlags::DRAW_OVER_OUTIMG); | 109 //drawMatches(frame, prevKpts, frame, currKpts, matches, display);//, Scalar::all(-1), Scalar::all(-1), vector<vector<char> >(), DrawMatchesFlags::DRAW_OVER_OUTIMG); |
| 115 } | 110 } |
| 116 | 111 |
| 117 imshow("frame", frame); | 112 imshow("frame", frame); |
| 118 prevKpts = currKpts; | 113 prevKpts = currKpts; |
| 119 currDesc.copyTo(prevDesc); | 114 currDesc.copyTo(prevDesc); |
| 120 int key = waitKey(0); | 115 key = waitKey(0); |
| 121 if (::interruptionKey(key)) | |
| 122 break; | |
| 123 } | 116 } |
| 124 | 117 |
| 125 return 0; | 118 return 0; |
| 126 } | 119 } |
| 127 | 120 |
