utility.h 5.03 KB
Newer Older
Matteo's avatar
update    
Matteo committed
1
2
3
4
5
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>

Nadir Dalla Pozza's avatar
Nadir Dalla Pozza committed
6
using namespace cv;
7
using namespace std;
8
namespace fs = std::filesystem;
9

Matteo's avatar
Matteo committed
10
11
12
13
14
/**
 * @brief Namespace containing a set of utility functions used in the project.
 * The functions are mainly used to perform operations on images.
 * 
 */
Matteo's avatar
update    
Matteo committed
15
namespace utility {
Nadir Dalla Pozza's avatar
Nadir Dalla Pozza committed
16

Matteo's avatar
update    
Matteo committed
17
	/**
Matteo's avatar
Matteo committed
18
	 * @class Frame
Matteo's avatar
update    
Matteo committed
19
20
21
22
	 * @brief Class that extends the OpenCV Mat class, adding some useful methods frequently used in the project.
	 * 
	 */
	class Frame : public Mat {
Matteo's avatar
update    
Matteo committed
23
	public:
Matteo's avatar
update    
Matteo committed
24
25
26
27
28
29
		Frame();
		Frame(const Mat& m);
		Frame(const Frame& f);
		Frame& operator=(const Mat& m);
		Frame& operator=(const Frame& f);
		Frame clone() const;
30
31
32
33
34
35
		/**
		 * @brief Downsample the image by a given factor.
		 * 
		 * @param factor The factor by which the image will be downsampled.
		 * @return Frame& The downsampled image.
		 */
Matteo's avatar
update    
Matteo committed
36
		Frame& downsample(int factor);
37
38
39
40
41
42
		/**
		 * @brief Convert the image to a given color space.
		 * 
		 * @param code The code of the color space to which the image will be converted.
		 * @return Frame& The converted image.
		 */
Matteo's avatar
update    
Matteo committed
43
		Frame& convertColor(int code);
Matteo's avatar
Matteo committed
44
		Frame difference(Frame& f);
45
46
47
48
49
50
51
		/**
		 * @brief Crop the image to a given size, centered in a given point.
		 * 
		 * @param rect_size The size of the cropped image.
		 * @param center The center of the cropped image.
		 * @return Frame& The cropped image.
		 */
Matteo's avatar
Matteo committed
52
		Frame& crop(Size rect_size, Point2f center);
53
54
55
56
57
58
		/**
		 * @brief Warp the image using a given rotation matrix.
		 * 
		 * @param rotationMatrix The rotation matrix used to warp the image.
		 * @return Frame& The warped image.
		 */
Matteo's avatar
Matteo committed
59
		Frame& warp(cv::Mat rotationMatrix);
60
61
62
63
64
65
		/**
		 * @brief Deinterlace the image, returning two images, one containing the odd lines and the other containing the even lines.
		 * 
		 * @return std::pair<Frame, Frame> The two images containing the odd and even lines.
		 */
		std::pair<Frame, Frame> deinterlace() const;
Matteo's avatar
update    
Matteo committed
66
67
68
	};

	/**
Matteo's avatar
Matteo committed
69
	 * @fn void detectShape(Ptr<GeneralizedHoughGuil> alg, Mat templateShape, int posThresh, vector<Vec4f> &positivePositions, Mat &positiveVotes, vector<Vec4f> &negativePositions, Mat &negativeVotes, Mat processingArea)
Matteo's avatar
update    
Matteo committed
70
71
72
73
74
75
76
77
78
79
80
81
82
83
	 * @brief Detects a given shape in an image, using a the OpenCV algorithm GeneralizedHoughGuil.
	 *
	 * @param[in] alg the algorithm instance;
	 * @param[in] templateShape the shape to detect;
	 * @param[in] posThresh the position votes threshold;
	 * @param[out] positivePositions vector representing the position assigned to each found rectangle for positive angles;
	 * @param[out] positiveVotes vector representing the vote assigned to each found rectangle for positive angles;
	 * @param[out] negativePositions vector representing the position assigned to each found rectangle for negative angles;
	 * @param[out] negativeVotes vector representing the vote assigned to each found rectangle for negative angles;
	 * @param[in] processingArea the image to be processed.
	 */
	void detectShape(Ptr<GeneralizedHoughGuil> alg, Mat templateShape, int posThresh, vector<Vec4f> &positivePositions, Mat &positiveVotes, vector<Vec4f> &negativePositions, Mat &negativeVotes, Mat processingArea);

	/**
Matteo's avatar
Matteo committed
84
	 * @fn RotatedRect drawShapes(Mat frame, Vec4f &positions, Scalar color, int width, int height, int offsetX, int offsetY, float processingScale)
Matteo's avatar
update    
Matteo committed
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
	 * @brief Draw rectangles on an image.
	 *
	 * @param frame Frame on which the rectangles will be drawn;
	 * @param positions The position of the rectangle;
	 * @param color The color of the rectangle;
	 * @param width The width of the rectangle;
	 * @param height The height of the rectangle;
	 * @param offsetX X offset on the position of the rectangle;
	 * @param offsetY Y offset on the position of the rectangle;
	 * @param processingScale Scaling factor, useful for downsizing.
	 * @return RotatedRect Object representing the drawn rectangle.
	 */
	RotatedRect drawShapes(Mat frame, Vec4f &positions, Scalar color, int width, int height, int offsetX, int offsetY, float processingScale);


	/**
Matteo's avatar
Matteo committed
101
	 * @fn void separateFrame(cv::Mat frame, cv::Mat &odd_frame, cv::Mat &even_frame)
Matteo's avatar
update    
Matteo committed
102
103
104
105
106
107
	 * @brief Function to deinterlace the current image.
	 *
	 * @param[in] frame image to be processed;
	 * @param[out] odd_frame odd plane;
	 * @param[out] even_frame even plane.
	 */
108
	void separateFrame(const cv::Mat frame, cv::Mat &odd_frame, cv::Mat &even_frame);
Matteo's avatar
update    
Matteo committed
109
110
111


	/**
Matteo's avatar
Matteo committed
112
	 * @fn void separateFrame(cv::Mat frame, cv::Mat &odd_frame, cv::Mat &even_frame)
Matteo's avatar
update    
Matteo committed
113
114
115
116
117
118
119
	 * @brief Compute the number of different pixels between two frames.
	 *
	 * @param prevFrame the first frame;
	 * @param currentFrame the second frame.
	 * @return cv::Mat A black and white frame, where black pixels represent a difference, while white pixels represent an equality.
	 */
	cv::Mat difference(cv::Mat &prevFrame, cv::Mat &currentFrame);
120
}
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142

struct Threshold {
	float percentual;
	int angle;
	int scale;
	int pos;
};

enum Object {
	TAPE,
	CAPSTAN
};

struct SceneObject {
	int minDist;
	Threshold threshold;

	SceneObject(int minDist, Threshold threshold);
	~SceneObject() = default;
	static SceneObject from_file(fs::path path, Object obj);
};