Mercurial > hg > nsaunier > traffic-intelligence
annotate c/cvutils.cpp @ 398:3399bd48cb40
Ajout d'une méthode pour obtenir le nombre de FPS
Méthode de capture des trames vidéos plus résistante aux erreur
Utilisation d'un dictionnaire pour les fichier de configuration afin de garder le nom des sections
| author | Jean-Philippe Jodoin <jpjodoin@gmail.com> |
|---|---|
| date | Mon, 29 Jul 2013 13:46:07 -0400 |
| parents | 0089fb29cd26 |
| children | 5eeb3b9fb568 |
| rev | line source |
|---|---|
| 9 | 1 #include "cvutils.hpp" |
|
144
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
2 #include "utils.hpp" |
| 9 | 3 |
| 131 | 4 #include "opencv2/core/core.hpp" |
|
126
336926453b28
added conversion function from keypoint vector to point vector and cleaned headers
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
12
diff
changeset
|
5 #include "opencv2/highgui/highgui.hpp" |
|
336926453b28
added conversion function from keypoint vector to point vector and cleaned headers
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
12
diff
changeset
|
6 #include "opencv2/features2d/features2d.hpp" |
| 9 | 7 |
| 8 #include <iostream> | |
|
126
336926453b28
added conversion function from keypoint vector to point vector and cleaned headers
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
12
diff
changeset
|
9 #include <vector> |
| 9 | 10 |
| 11 using namespace std; | |
|
126
336926453b28
added conversion function from keypoint vector to point vector and cleaned headers
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
12
diff
changeset
|
12 using namespace cv; |
|
336926453b28
added conversion function from keypoint vector to point vector and cleaned headers
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
12
diff
changeset
|
13 |
|
147
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
14 Point2f project(const Point2f& p, const Mat& homography) { |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
15 //Mat homogeneous(3, 1, CV_32FC1); |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
16 float x, y; |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
17 float w = homography.at<float>(2,0)*p.x+homography.at<float>(2,1)*p.y+homography.at<float>(2,2); |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
18 if (w != 0) { |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
19 x = (homography.at<float>(0,0)*p.x+homography.at<float>(0,1)*p.y+homography.at<float>(0,2))/w; |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
20 y = (homography.at<float>(1,0)*p.x+homography.at<float>(1,1)*p.y+homography.at<float>(1,2))/w; |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
21 } else { |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
22 x = 0; |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
23 y = 0; |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
24 } |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
25 return Point2f(x, y); |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
26 } |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
27 |
|
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
144
diff
changeset
|
28 Mat loadMat(const string& filename, const string& separator) { |
|
144
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
29 vector<vector<float> > numbers = ::loadNumbers(filename, separator); |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
30 |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
31 Mat mat; |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
32 |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
33 if (!numbers.empty()) { |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
34 mat = Mat(numbers.size(),numbers[0].size(), CV_32FC1); |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
35 for (unsigned int i=0; i<numbers.size(); i++) |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
36 for (unsigned int j=0; j<numbers[0].size(); j++) |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
37 mat.at<float>(i,j) = numbers[i][j]; |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
38 } |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
39 |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
40 return mat; |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
41 } |
|
b32947b002da
added the code to read matrices from text files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
131
diff
changeset
|
42 |
|
128
536510f60854
new features generated as needed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
127
diff
changeset
|
43 void keyPoints2Points(const vector<KeyPoint>& kpts, vector<Point2f>& pts, const bool& clearPts /* = true */) { |
|
536510f60854
new features generated as needed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
127
diff
changeset
|
44 if (clearPts) |
|
536510f60854
new features generated as needed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
127
diff
changeset
|
45 pts.clear(); |
|
127
d19d6e63dd77
simple feature tracking and drawing working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
126
diff
changeset
|
46 pts.reserve(kpts.size()); |
|
126
336926453b28
added conversion function from keypoint vector to point vector and cleaned headers
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
12
diff
changeset
|
47 |
|
336926453b28
added conversion function from keypoint vector to point vector and cleaned headers
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
12
diff
changeset
|
48 for (unsigned int i=0; i<kpts.size(); i++) |
|
127
d19d6e63dd77
simple feature tracking and drawing working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
126
diff
changeset
|
49 pts.push_back(kpts[i].pt); |
|
126
336926453b28
added conversion function from keypoint vector to point vector and cleaned headers
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
12
diff
changeset
|
50 } |
| 9 | 51 |
| 52 IplImage* allocateImage(const int& width, const int& height, const int& depth, const int& channels) { return ::allocateImage(cvSize(width, height), depth, channels);} | |
| 53 | |
| 54 IplImage* allocateImage(const CvSize& size, const int& depth, const int& channels) { | |
| 55 IplImage* image = cvCreateImage(size, depth, channels); | |
| 56 | |
| 57 if (!image) { | |
| 58 cerr << "Error: Couldn't allocate image. Out of memory?\n" << endl; | |
| 59 exit(-1); | |
| 60 } | |
| 61 | |
| 62 return image; | |
| 63 } | |
|
11
e77e2fd69b02
modularized code (not compiling)
Nicolas Saunier <nico@confins.net>
parents:
9
diff
changeset
|
64 |
|
12
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
65 int goToFrameNum(CvCapture* inputVideo, const int& currentFrameNum, const int& targetFrameNum) { |
|
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
66 int frameNum = currentFrameNum; |
|
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
67 if (currentFrameNum > targetFrameNum) { |
|
11
e77e2fd69b02
modularized code (not compiling)
Nicolas Saunier <nico@confins.net>
parents:
9
diff
changeset
|
68 cerr << "Current frame number " << currentFrameNum << " is after the target frame number " << targetFrameNum << "." << endl; |
|
12
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
69 } else if (currentFrameNum < targetFrameNum) { |
|
11
e77e2fd69b02
modularized code (not compiling)
Nicolas Saunier <nico@confins.net>
parents:
9
diff
changeset
|
70 IplImage* frame = cvQueryFrame(inputVideo); |
|
e77e2fd69b02
modularized code (not compiling)
Nicolas Saunier <nico@confins.net>
parents:
9
diff
changeset
|
71 frameNum++; |
|
12
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
72 while (frame && frameNum<targetFrameNum) { |
|
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
73 frame = cvQueryFrame(inputVideo); |
|
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
74 frameNum++; |
|
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
75 } |
|
11
e77e2fd69b02
modularized code (not compiling)
Nicolas Saunier <nico@confins.net>
parents:
9
diff
changeset
|
76 } |
|
12
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
77 |
|
ff5403319cec
optical flow demo working
Nicolas Saunier <nico@confins.net>
parents:
11
diff
changeset
|
78 return frameNum; |
|
11
e77e2fd69b02
modularized code (not compiling)
Nicolas Saunier <nico@confins.net>
parents:
9
diff
changeset
|
79 } |
| 131 | 80 |
| 81 const Scalar Colors::color[] = {Colors::red(), | |
| 82 Colors::green(), | |
| 83 Colors::blue(), | |
| 84 Colors::cyan(), | |
| 85 Colors::magenta(), | |
| 86 Colors::yellow(), | |
| 87 Colors::white(), | |
| 88 Colors::black()}; | |
| 89 | |
| 90 Scalar Colors::black(void) { return Scalar(0,0,0);} | |
| 91 Scalar Colors::red(void) { return Scalar(255,0,0);} | |
| 92 Scalar Colors::green(void) { return Scalar(0,255,0);} | |
| 93 Scalar Colors::blue(void) { return Scalar(0,0,255);} | |
| 94 Scalar Colors::white(void) { return Scalar(255,255,255);} | |
| 95 Scalar Colors::magenta(void) { return Scalar(255,0,255);} | |
| 96 Scalar Colors::cyan(void) { return Scalar(0,255,255);} | |
| 97 Scalar Colors::yellow(void) { return Scalar(255,255,0);} | |
| 98 | |
| 99 Scalar Colors::color3(const int& num) { return Colors::color[num%3];} | |
| 100 Scalar Colors::color8(const int& num) { return Colors::color[num%Colors::nColors];} |
