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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
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
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
3
131
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
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
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
7
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
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
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
10
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
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
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
51
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
52 IplImage* allocateImage(const int& width, const int& height, const int& depth, const int& channels) { return ::allocateImage(cvSize(width, height), depth, channels);}
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
53
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
54 IplImage* allocateImage(const CvSize& size, const int& depth, const int& channels) {
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
55 IplImage* image = cvCreateImage(size, depth, channels);
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
56
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
57 if (!image) {
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
58 cerr << "Error: Couldn't allocate image. Out of memory?\n" << endl;
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
59 exit(-1);
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
60 }
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
61
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
62 return image;
eb38637f338d created cvutils
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
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
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
80
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
81 const Scalar Colors::color[] = {Colors::red(),
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
82 Colors::green(),
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
83 Colors::blue(),
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
84 Colors::cyan(),
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
85 Colors::magenta(),
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
86 Colors::yellow(),
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
87 Colors::white(),
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
88 Colors::black()};
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
89
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
90 Scalar Colors::black(void) { return Scalar(0,0,0);}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
91 Scalar Colors::red(void) { return Scalar(255,0,0);}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
92 Scalar Colors::green(void) { return Scalar(0,255,0);}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
93 Scalar Colors::blue(void) { return Scalar(0,0,255);}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
94 Scalar Colors::white(void) { return Scalar(255,255,255);}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
95 Scalar Colors::magenta(void) { return Scalar(255,0,255);}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
96 Scalar Colors::cyan(void) { return Scalar(0,255,255);}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
97 Scalar Colors::yellow(void) { return Scalar(255,255,0);}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
98
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
99 Scalar Colors::color3(const int& num) { return Colors::color[num%3];}
3a11dba30655 added colors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 128
diff changeset
100 Scalar Colors::color8(const int& num) { return Colors::color[num%Colors::nColors];}