MTF
common.h
1 #ifndef MTF_COMMON_H
2 #define MTF_COMMON_H
3 
4 #ifdef _WIN32
5 #pragma warning(disable:4503)
8 //#include <winsock2.h>
9 //#include <windows.h>
10 
11 #endif
12 
13 #include <Eigen/Dense>
14 #include "opencv2/core/core.hpp"
15 #include <assert.h>
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <vector>
19 #include <string>
20 
21 #if defined(__GNUC__) || defined(__GNUG__)
22 #define _force_inline_ __attribute__ (always_inline)
23 #else
24 #define _force_inline_
25 #endif
26 
27 //#ifdef _WIN32
28 //typedef long ClockType;
29 //#define INIT_TIMER(start_time) INIT_TIMER(start_time);
30 //#define END_TIMER(start_time, end_time, interval)\
31 // end_time = clock();\
32 // interval = ((double)(end_time - start_time)) / CLOCKS_PER_SEC;
33 //#define RECORD_EVENT(start_time, end_time, label, proc_times, proc_labels) \
34 // end_time = clock();\
35 // proc_times.push_back(((double) (end_time - start_time))/CLOCKS_PER_SEC);\
36 // proc_labels.push_back(label);\
37 // start_time = clock();
38 //#else
39 //typedef timespec ClockType;
40 //#define INIT_TIMER(start_time) clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time);
41 //#define END_TIMER(start_time, end_time, interval)\
42 // clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time);\
43 // interval = (double)(end_time.tv_sec - start_time.tv_sec) + 1e-9*(double)(end_time.tv_nsec - start_time.tv_nsec);
44 //#define RECORD_EVENT(start_time, end_time, label, proc_times, proc_labels) \
45 // clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time);\
46 // proc_times.push_back((double)(end_time.tv_sec - start_time.tv_sec) + 1e-9*(double)(end_time.tv_nsec - start_time.tv_nsec));\
47 // proc_labels.push_back(label);\
48 // clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time);
49 //#endif
50 //
51 //#define TIME_EVENT(start_time, end_time, interval) \
52 // end_time = clock();\
53 // interval = ((double) (end_time - start_time))/CLOCKS_PER_SEC;\
54 // INIT_TIMER(start_time);
55 
56 #ifdef _WIN32
57 #define _USE_MATH_DEFINES
58 #include <chrono>
59 #define mtf_clock_get(time_instant) \
60  std::chrono::steady_clock::time_point time_instant = std::chrono::steady_clock::now();
61 #define mtf_clock_measure(start_time, end_time, elapsed_time) \
62  elapsed_time = std::chrono::duration_cast<std::chrono::duration<double>>(end_time - start_time).count();
63 #else
64 #include <ctime>
65 #define mtf_clock_get(time_instant) \
66  timespec time_instant;\
67  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time_instant)
68 #define mtf_clock_measure(start_time, end_time, elapsed_time) \
69  elapsed_time = ((double)(end_time.tv_sec - start_time.tv_sec) +\
70  1e-9*(double)(end_time.tv_nsec - start_time.tv_nsec))
71 #endif
72 
73 #ifdef ENABLE_PROFILING
74 #define init_profiling() \
75  timespec _event_start_time, _event_end_time;\
76  double _event_interval; \
77  std::vector<double> proc_times;\
78  std::vector<char*> proc_labels
79 #define inherit_profiling(BASE_CLASS) \
80  using BASE_CLASS ::_event_start_time;\
81  using BASE_CLASS ::_event_end_time;\
82  using BASE_CLASS ::_event_interval;\
83  using BASE_CLASS :: proc_times;\
84  using BASE_CLASS :: proc_labels
85 #define write_frame_id(frame_id) \
86  utils::printScalarToFile(frame_id, "\n\nframe_id", time_fname, "%6d", "a");
87 #define init_timer() \
88  proc_times.clear();\
89  proc_labels.clear();\
90  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &_event_start_time)
91 #define start_timer() \
92  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &_event_start_time)
93 #define end_timer() \
94  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &_event_end_time);\
95  _event_interval = (double)(_event_end_time.tv_sec - _event_start_time.tv_sec) + 1e-9*(double)(_event_end_time.tv_nsec - _event_start_time.tv_nsec);
96 #define write_interval(time_fname, mode) \
97  utils::printScalarToFile(_event_interval, "init_time", time_fname, "%15.9f", mode)
98 #define record_event(label) \
99  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &_event_end_time);\
100  proc_times.push_back((double)(_event_end_time.tv_sec - _event_start_time.tv_sec) + 1e-9*(double)(_event_end_time.tv_nsec - _event_start_time.tv_nsec));\
101  proc_labels.push_back(label);\
102  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &_event_start_time)
103 #define write_data(time_fname) \
104  utils::writeTimesToFile(proc_times, proc_labels, time_fname, i)
105 #else
106 #define init_profiling()
107 #define inherit_profiling(BASE_CLASS)
108 #define write_frame_id(frame_id)
109 #define init_timer()
110 #define start_timer()
111 #define end_timer()
112 #define write_interval(time_fname, mode)
113 #define record_event(label)
114 #define write_data(time_fname)
115 #endif
116 
117 #define eig_set_zero(eig_mat, scalar_type) \
118  memset(eig_mat.data(), 0, eig_mat.size()*sizeof(scalar_type))
119 
120 #define func_not_implemeted(func_name) \
121  throw mtf::utils::FunctonNotImplemented(cv::format("%s :: %s :: Not implemented Yet", name.c_str(), #func_name))
122 
123 #define remap_data(var_name, var_type, data_loc, data_size) new (&var_name) Map< var_type >(data_loc, data_size)
124 //#define CV_TO_EIG_IMG(cv_mat) Map<const MatrixXuc, Aligned>((EIG_PIX_TYPE*)(cv_mat.data), cv_mat.rows, cv_mat.cols);
125 //#define CV_TO_EIG_CORNERS(cv_mat) Map<const Matrix24d, Aligned>((double*)cv_mat.data, cv_mat.rows, cv_mat.cols);
126 
127 #ifndef DISABLE_SPI
128 #define spi_pt_check_mc(mask, id, ch_id) \
129  if(mask && !mask[id]){ ch_id += n_channels; continue;}
130 #define spi_pt_check(mask, id) \
131  if(mask && !mask[id]){ continue;}
132 #define spi_check_mc(mask, id, ch_id) \
133  if(!mask[id]){ ch_id += n_channels; continue;}
134 #define spi_check(mask, id) \
135  if(!mask[id]){continue;}
136 #else
137 #define spi_pt_check(mask, id)
138 #define spi_pt_check_mc(mask, id, ch_id)
139 #define spi_check_mc(mask, id, ch_id)
140 #define spi_check(mask, id)
141 #endif
142 
143 #define corners_to_cv(cv_corners, eig_corners)\
144  for(int corner_id = 0; corner_id < 4; ++corner_id){\
145  cv_corners.at<double>(0, corner_id) = eig_corners(0, corner_id);\
146  cv_corners.at<double>(1, corner_id) = eig_corners(1, corner_id);\
147  }
148 #define corners_from_cv(eig_corners, cv_corners)\
149  for(int corner_id = 0; corner_id < 4; ++corner_id){\
150  eig_corners(0, corner_id) = cv_corners.at<double>(0, corner_id);\
151  eig_corners(1, corner_id) = cv_corners.at<double>(1, corner_id);\
152  }
153 #define corners_to_points(points, eig_corners)\
154  for(int corner_id = 0; corner_id < 4; ++corner_id){\
155  points[corner_id].x = curr_corners(0, corner_id);\
156  points[corner_id].y = curr_corners(1, corner_id);\
157  }
158 #define HETEROGENEOUS_INPUT -1
159 
160 #define SRC_IMG 'j'
161 #define SRC_VID 'm'
162 #define SRC_USB_CAM 'u'
163 #define SRC_PG_FW_CAM 'p'
164 #define SRC_FW_CAM 'f'
165 #define SRC_DISK 'd'
166 
167 #define _MTF_BEGIN_NAMESPACE namespace mtf {
168 #define _MTF_END_NAMESPACE }
169 
171 #define MTF_RES 50
172 
173 #if CV_MAJOR_VERSION < 3
174 #define cv_format(...) cv::format(__VA_ARGS__)
175 #else
176 #define cv_format(...) cv::format(__VA_ARGS__).c_str()
177 #ifndef CV_RGB
178 #define CV_RGB( r, g, b ) cvScalar( (b), (g), (r), 0 )
179 #endif
180 #endif
181 
182 using namespace std;
183 using namespace Eigen;
184 
185 _MTF_BEGIN_NAMESPACE
186 
187 typedef unsigned char uchar;
188 typedef unsigned int uint;
189 
190 typedef float EigPixT;
191 typedef float CVPixT;
192 
193 typedef Matrix<double, 3, 4> Matrix34d;
194 typedef Matrix<double, 2, 4> Matrix24d;
195 typedef Matrix<double, 2, 5> Matrix25d;
196 typedef Matrix<double, 5, 5> Matrix5d;
197 typedef Matrix<double, 10, 1> Vector10d;
198 typedef Matrix<double, 8, 1> Vector8d;
199 typedef Matrix<double, 5, 1> Vector5d;
200 typedef Matrix<double, 6, 1> Vector6d;
201 
202 typedef Matrix<double, 8, Dynamic> Matrix8Xd;
203 typedef Matrix<double, 16, Dynamic> Matrix16Xd;
204 
205 typedef Matrix<double, Dynamic, 9> MatrixX9d;
206 typedef Matrix<double, 9, Dynamic> Matrix9Xd;
207 
208 typedef Matrix<double, 8, 8> Matrix8d;
209 typedef Matrix<double, 7, 7> Matrix7d;
210 typedef Matrix<double, 6, 6> Matrix6d;
211 typedef Matrix<double, 2, 8> Matrix28d;
212 typedef Matrix<double, 2, 6> Matrix26d;
213 typedef Matrix<double, 9, 8> Matrix98d;
214 typedef Matrix<double, 8, 9> Matrix89d;
215 typedef Matrix<double, 8, 6> Matrix86d;
216 typedef Matrix<double, 8, 5> Matrix85d;
217 typedef Matrix<double, 8, 4> Matrix84d;
218 typedef Matrix<double, 8, 3> Matrix83d;
219 typedef Matrix<double, 7, 2> Matrix72d;
220 typedef Matrix<double, 6, 6> Matrix66d;
221 typedef Matrix<double, 5, 5> Matrix55d;
222 typedef Matrix<double, 4, 4> Matrix44d;
223 typedef Matrix<double, 4, 3> Matrix43d;
224 typedef Matrix<double, 3, 9> Matrix39d;
225 typedef Matrix<double, 2, 3> Matrix23d;
226 
227 typedef Matrix<bool, Dynamic, 1> VectorXb;
228 typedef Array<bool, Dynamic, 1> ArryaXb;
229 typedef Matrix<double, 9, 1> Vector9d;
230 typedef Matrix<unsigned char, Dynamic, 1> VectorXc;
231 
232 typedef Map<VectorXd> VectorXdM;
233 typedef Map<VectorXb> VectorXbM;
234 typedef Map<RowVectorXd> RowVectorXdM;
235 typedef Map<MatrixXd> MatrixXdM;
236 typedef Map<MatrixX2d> MatrixX2dM;
237 typedef Map<Matrix2d> Matrix2dM;
238 
239 typedef Matrix<double, Dynamic, Dynamic, RowMajor> MatrixXdr;
240 typedef Matrix<double, Dynamic, 1, RowMajor> VectorXdr;
241 typedef Matrix<int, Dynamic, 1, RowMajor> VectorXir;
242 typedef Matrix<EigPixT, Dynamic, Dynamic, RowMajor> EigImgMat;
243 
244 typedef Map<EigImgMat> EigImgT;
245 typedef Map<MatrixXdr> MatrixXdMr;
246 
247 typedef VectorXd PixValT;
248 typedef MatrixX2d PixGradT;
249 typedef Matrix4Xd PixHessT;
250 
251 typedef Matrix3d ProjWarpT;
252 typedef Matrix2Xd PtsT;
253 typedef Matrix2Xf PtsfT;
254 typedef Matrix24d CornersT;
255 typedef Matrix3Xd HomPtsT;
256 typedef Matrix34d HomCornersT;
257 typedef Matrix8Xd GradPtsT;
258 typedef Matrix16Xd HessPtsT;
259 
260 typedef cv::Rect_<double> Rectd;
261 
262 typedef std::vector<double> vectord;
263 typedef std::vector<float> vectorf;
264 typedef std::vector<int> vectori;
265 typedef std::vector<std::string> vector_s;
266 typedef std::vector<vectord> vectorvd;
267 typedef std::vector<vectori> vectorvi;
268 
269 _MTF_END_NAMESPACE
270 
271 #endif