Mercurial Hosting > traffic-intelligence
comparison c/feature-based-tracking.cpp @ 122:654f1c748644
work on displaying matched features
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Mon, 15 Aug 2011 18:37:14 -0400 |
parents | c4d4b5b93add |
children | df3bdd8e50ba |
comparison
equal
deleted
inserted
replaced
121:c4d4b5b93add | 122:654f1c748644 |
---|---|
1 #include "../include/Feature.hpp" | 1 #include "Feature.hpp" |
2 #include "utils.hpp" | |
2 | 3 |
3 #include "opencv2/highgui/highgui.hpp" | 4 #include "opencv2/highgui/highgui.hpp" |
4 //#include "opencv2/imgproc/imgproc.hpp" | 5 //#include "opencv2/imgproc/imgproc.hpp" |
5 #include "opencv2/features2d/features2d.hpp" | 6 #include "opencv2/features2d/features2d.hpp" |
6 | 7 |
18 int main(int argc, char *argv[]) { | 19 int main(int argc, char *argv[]) { |
19 | 20 |
20 BriefDescriptorExtractor brief(32); | 21 BriefDescriptorExtractor brief(32); |
21 | 22 |
22 VideoCapture capture; | 23 VideoCapture capture; |
23 capture.open(atoi(argv[1])); | 24 |
25 Mat frame, display; | |
26 | |
27 if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter | |
28 capture.open(argc == 2 ? argv[1][0] - '0' : 0); | |
29 else if( argc >= 2 ) | |
30 { | |
31 capture.open(argv[1]); | |
32 if( capture.isOpened() ) | |
33 cout << "Video " << argv[1] << | |
34 ": width=" << capture.get(CV_CAP_PROP_FRAME_WIDTH) << | |
35 ", height=" << capture.get(CV_CAP_PROP_FRAME_HEIGHT) << | |
36 ", nframes=" << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl; | |
37 if( argc > 2 && isdigit(argv[2][0]) ) // could be used to reach first frame, dumping library messages to log file (2> /tmp/log.txt) | |
38 { | |
39 int pos; | |
40 sscanf(argv[2], "%d", &pos); | |
41 cout << "seeking to frame #" << pos << endl; | |
42 //cap.set(CV_CAP_PROP_POS_FRAMES, pos); | |
43 for (int i=0; i<pos; i++) | |
44 capture >> frame; | |
45 } | |
46 } | |
47 | |
48 // capture.open(atoi(argv[1])); | |
24 if (!capture.isOpened()) | 49 if (!capture.isOpened()) |
25 { | 50 { |
26 //help(argv); | 51 //help(argv); |
27 cout << "capture device " << atoi(argv[1]) << " failed to open!" << endl; | 52 cout << "capture device " << argv[1] << " failed to open!" << endl; |
28 return 1; | 53 return 1; |
29 } | 54 } |
30 | 55 |
31 Mat frame; | |
32 | |
33 vector<DMatch> matches; | 56 vector<DMatch> matches; |
34 | 57 |
35 BruteForceMatcher<Hamming> desc_matcher; | 58 BruteForceMatcher<Hamming> desc_matcher; |
36 | 59 |
37 vector<Point2f> train_pts, query_pts; | 60 vector<Point2f> train_pts, query_pts; |
42 | 65 |
43 Mat train_desc, query_desc; | 66 Mat train_desc, query_desc; |
44 const int DESIRED_FTRS = 500; | 67 const int DESIRED_FTRS = 500; |
45 GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4); | 68 GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4); |
46 | 69 |
70 int frameNum = 0; | |
47 for (;;) | 71 for (;;) |
48 { | 72 { |
73 frameNum+=2; | |
49 capture >> frame; | 74 capture >> frame; |
75 cout << capture.get(CV_CAP_PROP_POS_FRAMES) << endl; | |
50 if (frame.empty()) | 76 if (frame.empty()) |
51 break; | 77 break; |
52 | 78 |
53 cvtColor(frame, gray, CV_RGB2GRAY); | 79 cvtColor(frame, gray, CV_RGB2GRAY); |
54 | 80 |
55 detector.detect(gray, query_kpts); //Find interest points | 81 detector.detect(gray, query_kpts); //Find interest points |
56 | 82 |
57 brief.compute(gray, query_kpts, query_desc); //Compute brief descriptors at each keypoint location | 83 brief.compute(gray, query_kpts, query_desc); //Compute brief descriptors at each keypoint location |
58 | 84 |
59 // find how keypoints descriptions are matched to previous ones (in train kpts probably) | 85 // find how keypoints descriptions are matched to previous ones (in train kpts probably) |
60 | 86 display = frame.clone(); |
61 imshow("frame", frame); | 87 if (!train_kpts.empty()) |
62 char key = (char)waitKey(2); | 88 { |
89 //vector<KeyPoint> test_kpts; | |
90 //warpKeypoints(H_prev.inv(), query_kpts, test_kpts); | |
91 //Mat mask = windowedMatchingMask(test_kpts, train_kpts, 25, 25); | |
92 desc_matcher.match(query_desc, train_desc, matches); | |
93 drawMatches(frame, train_kpts, frame, query_kpts, matches, display);//, Scalar::all(-1), Scalar::all(-1), vector<vector<char> >(), DrawMatchesFlags::DRAW_OVER_OUTIMG); | |
94 } // TODO do something like the match relative of the sample | |
95 | |
96 imshow("frame", display); | |
97 train_kpts = query_kpts; | |
98 int key = waitKey(0); | |
99 if (::interruptionKey(key)) | |
100 break; | |
63 } | 101 } |
64 | 102 |
65 Feature f; | 103 Feature f; |
66 | 104 |
67 return 0; | 105 return 0; |