1 | /*M/////////////////////////////////////////////////////////////////////////////////////// |
2 | // |
3 | // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. |
4 | // |
5 | // By downloading, copying, installing or using the software you agree to this license. |
6 | // If you do not agree to this license, do not download, install, |
7 | // copy or use the software. |
8 | // |
9 | // |
10 | // License Agreement |
11 | // For Open Source Computer Vision Library |
12 | // |
13 | // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. |
14 | // Copyright (C) 2009, Willow Garage Inc., all rights reserved. |
15 | // Copyright (C) 2013, OpenCV Foundation, all rights reserved. |
16 | // Third party copyrights are property of their respective owners. |
17 | // |
18 | // Redistribution and use in source and binary forms, with or without modification, |
19 | // are permitted provided that the following conditions are met: |
20 | // |
21 | // * Redistribution's of source code must retain the above copyright notice, |
22 | // this list of conditions and the following disclaimer. |
23 | // |
24 | // * Redistribution's in binary form must reproduce the above copyright notice, |
25 | // this list of conditions and the following disclaimer in the documentation |
26 | // and/or other materials provided with the distribution. |
27 | // |
28 | // * The name of the copyright holders may not be used to endorse or promote products |
29 | // derived from this software without specific prior written permission. |
30 | // |
31 | // This software is provided by the copyright holders and contributors "as is" and |
32 | // any express or implied warranties, including, but not limited to, the implied |
33 | // warranties of merchantability and fitness for a particular purpose are disclaimed. |
34 | // In no event shall the Intel Corporation or contributors be liable for any direct, |
35 | // indirect, incidental, special, exemplary, or consequential damages |
36 | // (including, but not limited to, procurement of substitute goods or services; |
37 | // loss of use, data, or profits; or business interruption) however caused |
38 | // and on any theory of liability, whether in contract, strict liability, |
39 | // or tort (including negligence or otherwise) arising in any way out of |
40 | // the use of this software, even if advised of the possibility of such damage. |
41 | // |
42 | //M*/ |
43 | |
44 | #ifndef OPENCV_TRACKING_HPP |
45 | #define OPENCV_TRACKING_HPP |
46 | |
47 | #include "opencv2/core.hpp" |
48 | #include "opencv2/imgproc.hpp" |
49 | #ifdef HAVE_OPENCV_DNN |
50 | # include "opencv2/dnn.hpp" |
51 | #endif |
52 | |
53 | namespace cv |
54 | { |
55 | |
56 | //! @addtogroup video_track |
57 | //! @{ |
58 | |
59 | enum { OPTFLOW_USE_INITIAL_FLOW = 4, |
60 | OPTFLOW_LK_GET_MIN_EIGENVALS = 8, |
61 | OPTFLOW_FARNEBACK_GAUSSIAN = 256 |
62 | }; |
63 | |
64 | /** @brief Finds an object center, size, and orientation. |
65 | |
66 | @param probImage Back projection of the object histogram. See calcBackProject. |
67 | @param window Initial search window. |
68 | @param criteria Stop criteria for the underlying meanShift. |
69 | returns |
70 | (in old interfaces) Number of iterations CAMSHIFT took to converge |
71 | The function implements the CAMSHIFT object tracking algorithm @cite Bradski98 . First, it finds an |
72 | object center using meanShift and then adjusts the window size and finds the optimal rotation. The |
73 | function returns the rotated rectangle structure that includes the object position, size, and |
74 | orientation. The next position of the search window can be obtained with RotatedRect::boundingRect() |
75 | |
76 | See the OpenCV sample camshiftdemo.c that tracks colored objects. |
77 | |
78 | @note |
79 | - (Python) A sample explaining the camshift tracking algorithm can be found at |
80 | opencv_source_code/samples/python/camshift.py |
81 | */ |
82 | CV_EXPORTS_W RotatedRect CamShift( InputArray probImage, CV_IN_OUT Rect& window, |
83 | TermCriteria criteria ); |
84 | /** @example samples/cpp/camshiftdemo.cpp |
85 | An example using the mean-shift tracking algorithm |
86 | */ |
87 | |
88 | /** @brief Finds an object on a back projection image. |
89 | |
90 | @param probImage Back projection of the object histogram. See calcBackProject for details. |
91 | @param window Initial search window. |
92 | @param criteria Stop criteria for the iterative search algorithm. |
93 | returns |
94 | : Number of iterations CAMSHIFT took to converge. |
95 | The function implements the iterative object search algorithm. It takes the input back projection of |
96 | an object and the initial position. The mass center in window of the back projection image is |
97 | computed and the search window center shifts to the mass center. The procedure is repeated until the |
98 | specified number of iterations criteria.maxCount is done or until the window center shifts by less |
99 | than criteria.epsilon. The algorithm is used inside CamShift and, unlike CamShift , the search |
100 | window size or orientation do not change during the search. You can simply pass the output of |
101 | calcBackProject to this function. But better results can be obtained if you pre-filter the back |
102 | projection and remove the noise. For example, you can do this by retrieving connected components |
103 | with findContours , throwing away contours with small area ( contourArea ), and rendering the |
104 | remaining contours with drawContours. |
105 | |
106 | */ |
107 | CV_EXPORTS_W int meanShift( InputArray probImage, CV_IN_OUT Rect& window, TermCriteria criteria ); |
108 | |
109 | /** @brief Constructs the image pyramid which can be passed to calcOpticalFlowPyrLK. |
110 | |
111 | @param img 8-bit input image. |
112 | @param pyramid output pyramid. |
113 | @param winSize window size of optical flow algorithm. Must be not less than winSize argument of |
114 | calcOpticalFlowPyrLK. It is needed to calculate required padding for pyramid levels. |
115 | @param maxLevel 0-based maximal pyramid level number. |
116 | @param withDerivatives set to precompute gradients for the every pyramid level. If pyramid is |
117 | constructed without the gradients then calcOpticalFlowPyrLK will calculate them internally. |
118 | @param pyrBorder the border mode for pyramid layers. |
119 | @param derivBorder the border mode for gradients. |
120 | @param tryReuseInputImage put ROI of input image into the pyramid if possible. You can pass false |
121 | to force data copying. |
122 | @return number of levels in constructed pyramid. Can be less than maxLevel. |
123 | */ |
124 | CV_EXPORTS_W int buildOpticalFlowPyramid( InputArray img, OutputArrayOfArrays pyramid, |
125 | Size winSize, int maxLevel, bool withDerivatives = true, |
126 | int pyrBorder = BORDER_REFLECT_101, |
127 | int derivBorder = BORDER_CONSTANT, |
128 | bool tryReuseInputImage = true ); |
129 | |
130 | /** @example samples/cpp/lkdemo.cpp |
131 | An example using the Lucas-Kanade optical flow algorithm |
132 | */ |
133 | |
134 | /** @brief Calculates an optical flow for a sparse feature set using the iterative Lucas-Kanade method with |
135 | pyramids. |
136 | |
137 | @param prevImg first 8-bit input image or pyramid constructed by buildOpticalFlowPyramid. |
138 | @param nextImg second input image or pyramid of the same size and the same type as prevImg. |
139 | @param prevPts vector of 2D points for which the flow needs to be found; point coordinates must be |
140 | single-precision floating-point numbers. |
141 | @param nextPts output vector of 2D points (with single-precision floating-point coordinates) |
142 | containing the calculated new positions of input features in the second image; when |
143 | OPTFLOW_USE_INITIAL_FLOW flag is passed, the vector must have the same size as in the input. |
144 | @param status output status vector (of unsigned chars); each element of the vector is set to 1 if |
145 | the flow for the corresponding features has been found, otherwise, it is set to 0. |
146 | @param err output vector of errors; each element of the vector is set to an error for the |
147 | corresponding feature, type of the error measure can be set in flags parameter; if the flow wasn't |
148 | found then the error is not defined (use the status parameter to find such cases). |
149 | @param winSize size of the search window at each pyramid level. |
150 | @param maxLevel 0-based maximal pyramid level number; if set to 0, pyramids are not used (single |
151 | level), if set to 1, two levels are used, and so on; if pyramids are passed to input then |
152 | algorithm will use as many levels as pyramids have but no more than maxLevel. |
153 | @param criteria parameter, specifying the termination criteria of the iterative search algorithm |
154 | (after the specified maximum number of iterations criteria.maxCount or when the search window |
155 | moves by less than criteria.epsilon. |
156 | @param flags operation flags: |
157 | - **OPTFLOW_USE_INITIAL_FLOW** uses initial estimations, stored in nextPts; if the flag is |
158 | not set, then prevPts is copied to nextPts and is considered the initial estimate. |
159 | - **OPTFLOW_LK_GET_MIN_EIGENVALS** use minimum eigen values as an error measure (see |
160 | minEigThreshold description); if the flag is not set, then L1 distance between patches |
161 | around the original and a moved point, divided by number of pixels in a window, is used as a |
162 | error measure. |
163 | @param minEigThreshold the algorithm calculates the minimum eigen value of a 2x2 normal matrix of |
164 | optical flow equations (this matrix is called a spatial gradient matrix in @cite Bouguet00), divided |
165 | by number of pixels in a window; if this value is less than minEigThreshold, then a corresponding |
166 | feature is filtered out and its flow is not processed, so it allows to remove bad points and get a |
167 | performance boost. |
168 | |
169 | The function implements a sparse iterative version of the Lucas-Kanade optical flow in pyramids. See |
170 | @cite Bouguet00 . The function is parallelized with the TBB library. |
171 | |
172 | @note Some examples: |
173 | |
174 | - An example using the Lucas-Kanade optical flow algorithm can be found at |
175 | opencv_source_code/samples/cpp/lkdemo.cpp |
176 | - (Python) An example using the Lucas-Kanade optical flow algorithm can be found at |
177 | opencv_source_code/samples/python/lk_track.py |
178 | - (Python) An example using the Lucas-Kanade tracker for homography matching can be found at |
179 | opencv_source_code/samples/python/lk_homography.py |
180 | */ |
181 | CV_EXPORTS_W void calcOpticalFlowPyrLK( InputArray prevImg, InputArray nextImg, |
182 | InputArray prevPts, InputOutputArray nextPts, |
183 | OutputArray status, OutputArray err, |
184 | Size winSize = Size(21,21), int maxLevel = 3, |
185 | TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), |
186 | int flags = 0, double minEigThreshold = 1e-4 ); |
187 | |
188 | /** @brief Computes a dense optical flow using the Gunnar Farneback's algorithm. |
189 | |
190 | @param prev first 8-bit single-channel input image. |
191 | @param next second input image of the same size and the same type as prev. |
192 | @param flow computed flow image that has the same size as prev and type CV_32FC2. |
193 | @param pyr_scale parameter, specifying the image scale (\<1) to build pyramids for each image; |
194 | pyr_scale=0.5 means a classical pyramid, where each next layer is twice smaller than the previous |
195 | one. |
196 | @param levels number of pyramid layers including the initial image; levels=1 means that no extra |
197 | layers are created and only the original images are used. |
198 | @param winsize averaging window size; larger values increase the algorithm robustness to image |
199 | noise and give more chances for fast motion detection, but yield more blurred motion field. |
200 | @param iterations number of iterations the algorithm does at each pyramid level. |
201 | @param poly_n size of the pixel neighborhood used to find polynomial expansion in each pixel; |
202 | larger values mean that the image will be approximated with smoother surfaces, yielding more |
203 | robust algorithm and more blurred motion field, typically poly_n =5 or 7. |
204 | @param poly_sigma standard deviation of the Gaussian that is used to smooth derivatives used as a |
205 | basis for the polynomial expansion; for poly_n=5, you can set poly_sigma=1.1, for poly_n=7, a |
206 | good value would be poly_sigma=1.5. |
207 | @param flags operation flags that can be a combination of the following: |
208 | - **OPTFLOW_USE_INITIAL_FLOW** uses the input flow as an initial flow approximation. |
209 | - **OPTFLOW_FARNEBACK_GAUSSIAN** uses the Gaussian \f$\texttt{winsize}\times\texttt{winsize}\f$ |
210 | filter instead of a box filter of the same size for optical flow estimation; usually, this |
211 | option gives z more accurate flow than with a box filter, at the cost of lower speed; |
212 | normally, winsize for a Gaussian window should be set to a larger value to achieve the same |
213 | level of robustness. |
214 | |
215 | The function finds an optical flow for each prev pixel using the @cite Farneback2003 algorithm so that |
216 | |
217 | \f[\texttt{prev} (y,x) \sim \texttt{next} ( y + \texttt{flow} (y,x)[1], x + \texttt{flow} (y,x)[0])\f] |
218 | |
219 | @note Some examples: |
220 | |
221 | - An example using the optical flow algorithm described by Gunnar Farneback can be found at |
222 | opencv_source_code/samples/cpp/fback.cpp |
223 | - (Python) An example using the optical flow algorithm described by Gunnar Farneback can be |
224 | found at opencv_source_code/samples/python/opt_flow.py |
225 | */ |
226 | CV_EXPORTS_W void calcOpticalFlowFarneback( InputArray prev, InputArray next, InputOutputArray flow, |
227 | double pyr_scale, int levels, int winsize, |
228 | int iterations, int poly_n, double poly_sigma, |
229 | int flags ); |
230 | |
231 | /** @brief Computes an optimal affine transformation between two 2D point sets. |
232 | |
233 | @param src First input 2D point set stored in std::vector or Mat, or an image stored in Mat. |
234 | @param dst Second input 2D point set of the same size and the same type as A, or another image. |
235 | @param fullAffine If true, the function finds an optimal affine transformation with no additional |
236 | restrictions (6 degrees of freedom). Otherwise, the class of transformations to choose from is |
237 | limited to combinations of translation, rotation, and uniform scaling (4 degrees of freedom). |
238 | |
239 | The function finds an optimal affine transform *[A|b]* (a 2 x 3 floating-point matrix) that |
240 | approximates best the affine transformation between: |
241 | |
242 | * Two point sets |
243 | * Two raster images. In this case, the function first finds some features in the src image and |
244 | finds the corresponding features in dst image. After that, the problem is reduced to the first |
245 | case. |
246 | In case of point sets, the problem is formulated as follows: you need to find a 2x2 matrix *A* and |
247 | 2x1 vector *b* so that: |
248 | |
249 | \f[[A^*|b^*] = arg \min _{[A|b]} \sum _i \| \texttt{dst}[i] - A { \texttt{src}[i]}^T - b \| ^2\f] |
250 | where src[i] and dst[i] are the i-th points in src and dst, respectively |
251 | \f$[A|b]\f$ can be either arbitrary (when fullAffine=true ) or have a form of |
252 | \f[\begin{bmatrix} a_{11} & a_{12} & b_1 \\ -a_{12} & a_{11} & b_2 \end{bmatrix}\f] |
253 | when fullAffine=false. |
254 | |
255 | @deprecated Use cv::estimateAffine2D, cv::estimateAffinePartial2D instead. If you are using this function |
256 | with images, extract points using cv::calcOpticalFlowPyrLK and then use the estimation functions. |
257 | |
258 | @sa |
259 | estimateAffine2D, estimateAffinePartial2D, getAffineTransform, getPerspectiveTransform, findHomography |
260 | */ |
261 | CV_DEPRECATED CV_EXPORTS Mat estimateRigidTransform( InputArray src, InputArray dst, bool fullAffine ); |
262 | |
263 | enum |
264 | { |
265 | MOTION_TRANSLATION = 0, |
266 | MOTION_EUCLIDEAN = 1, |
267 | MOTION_AFFINE = 2, |
268 | MOTION_HOMOGRAPHY = 3 |
269 | }; |
270 | |
271 | /** @brief Computes the Enhanced Correlation Coefficient value between two images @cite EP08 . |
272 | |
273 | @param templateImage single-channel template image; CV_8U or CV_32F array. |
274 | @param inputImage single-channel input image to be warped to provide an image similar to |
275 | templateImage, same type as templateImage. |
276 | @param inputMask An optional mask to indicate valid values of inputImage. |
277 | |
278 | @sa |
279 | findTransformECC |
280 | */ |
281 | |
282 | CV_EXPORTS_W double computeECC(InputArray templateImage, InputArray inputImage, InputArray inputMask = noArray()); |
283 | |
284 | /** @example samples/cpp/image_alignment.cpp |
285 | An example using the image alignment ECC algorithm |
286 | */ |
287 | |
288 | /** @brief Finds the geometric transform (warp) between two images in terms of the ECC criterion @cite EP08 . |
289 | |
290 | @param templateImage single-channel template image; CV_8U or CV_32F array. |
291 | @param inputImage single-channel input image which should be warped with the final warpMatrix in |
292 | order to provide an image similar to templateImage, same type as templateImage. |
293 | @param warpMatrix floating-point \f$2\times 3\f$ or \f$3\times 3\f$ mapping matrix (warp). |
294 | @param motionType parameter, specifying the type of motion: |
295 | - **MOTION_TRANSLATION** sets a translational motion model; warpMatrix is \f$2\times 3\f$ with |
296 | the first \f$2\times 2\f$ part being the unity matrix and the rest two parameters being |
297 | estimated. |
298 | - **MOTION_EUCLIDEAN** sets a Euclidean (rigid) transformation as motion model; three |
299 | parameters are estimated; warpMatrix is \f$2\times 3\f$. |
300 | - **MOTION_AFFINE** sets an affine motion model (DEFAULT); six parameters are estimated; |
301 | warpMatrix is \f$2\times 3\f$. |
302 | - **MOTION_HOMOGRAPHY** sets a homography as a motion model; eight parameters are |
303 | estimated;\`warpMatrix\` is \f$3\times 3\f$. |
304 | @param criteria parameter, specifying the termination criteria of the ECC algorithm; |
305 | criteria.epsilon defines the threshold of the increment in the correlation coefficient between two |
306 | iterations (a negative criteria.epsilon makes criteria.maxcount the only termination criterion). |
307 | Default values are shown in the declaration above. |
308 | @param inputMask An optional mask to indicate valid values of inputImage. |
309 | @param gaussFiltSize An optional value indicating size of gaussian blur filter; (DEFAULT: 5) |
310 | |
311 | The function estimates the optimum transformation (warpMatrix) with respect to ECC criterion |
312 | (@cite EP08), that is |
313 | |
314 | \f[\texttt{warpMatrix} = \arg\max_{W} \texttt{ECC}(\texttt{templateImage}(x,y),\texttt{inputImage}(x',y'))\f] |
315 | |
316 | where |
317 | |
318 | \f[\begin{bmatrix} x' \\ y' \end{bmatrix} = W \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\f] |
319 | |
320 | (the equation holds with homogeneous coordinates for homography). It returns the final enhanced |
321 | correlation coefficient, that is the correlation coefficient between the template image and the |
322 | final warped input image. When a \f$3\times 3\f$ matrix is given with motionType =0, 1 or 2, the third |
323 | row is ignored. |
324 | |
325 | Unlike findHomography and estimateRigidTransform, the function findTransformECC implements an |
326 | area-based alignment that builds on intensity similarities. In essence, the function updates the |
327 | initial transformation that roughly aligns the images. If this information is missing, the identity |
328 | warp (unity matrix) is used as an initialization. Note that if images undergo strong |
329 | displacements/rotations, an initial transformation that roughly aligns the images is necessary |
330 | (e.g., a simple euclidean/similarity transform that allows for the images showing the same image |
331 | content approximately). Use inverse warping in the second image to take an image close to the first |
332 | one, i.e. use the flag WARP_INVERSE_MAP with warpAffine or warpPerspective. See also the OpenCV |
333 | sample image_alignment.cpp that demonstrates the use of the function. Note that the function throws |
334 | an exception if algorithm does not converges. |
335 | |
336 | @sa |
337 | computeECC, estimateAffine2D, estimateAffinePartial2D, findHomography |
338 | */ |
339 | CV_EXPORTS_W double findTransformECC( InputArray templateImage, InputArray inputImage, |
340 | InputOutputArray warpMatrix, int motionType, |
341 | TermCriteria criteria, |
342 | InputArray inputMask, int gaussFiltSize); |
343 | |
344 | /** @overload */ |
345 | CV_EXPORTS_W |
346 | double findTransformECC(InputArray templateImage, InputArray inputImage, |
347 | InputOutputArray warpMatrix, int motionType = MOTION_AFFINE, |
348 | TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 50, 0.001), |
349 | InputArray inputMask = noArray()); |
350 | |
351 | /** @example samples/cpp/kalman.cpp |
352 | An example using the standard Kalman filter |
353 | */ |
354 | |
355 | /** @brief Kalman filter class. |
356 | |
357 | The class implements a standard Kalman filter <http://en.wikipedia.org/wiki/Kalman_filter>, |
358 | @cite Welch95 . However, you can modify transitionMatrix, controlMatrix, and measurementMatrix to get |
359 | an extended Kalman filter functionality. |
360 | @note In C API when CvKalman\* kalmanFilter structure is not needed anymore, it should be released |
361 | with cvReleaseKalman(&kalmanFilter) |
362 | */ |
363 | class CV_EXPORTS_W KalmanFilter |
364 | { |
365 | public: |
366 | CV_WRAP KalmanFilter(); |
367 | /** @overload |
368 | @param dynamParams Dimensionality of the state. |
369 | @param measureParams Dimensionality of the measurement. |
370 | @param controlParams Dimensionality of the control vector. |
371 | @param type Type of the created matrices that should be CV_32F or CV_64F. |
372 | */ |
373 | CV_WRAP KalmanFilter( int dynamParams, int measureParams, int controlParams = 0, int type = CV_32F ); |
374 | |
375 | /** @brief Re-initializes Kalman filter. The previous content is destroyed. |
376 | |
377 | @param dynamParams Dimensionality of the state. |
378 | @param measureParams Dimensionality of the measurement. |
379 | @param controlParams Dimensionality of the control vector. |
380 | @param type Type of the created matrices that should be CV_32F or CV_64F. |
381 | */ |
382 | void init( int dynamParams, int measureParams, int controlParams = 0, int type = CV_32F ); |
383 | |
384 | /** @brief Computes a predicted state. |
385 | |
386 | @param control The optional input control |
387 | */ |
388 | CV_WRAP const Mat& predict( const Mat& control = Mat() ); |
389 | |
390 | /** @brief Updates the predicted state from the measurement. |
391 | |
392 | @param measurement The measured system parameters |
393 | */ |
394 | CV_WRAP const Mat& correct( const Mat& measurement ); |
395 | |
396 | CV_PROP_RW Mat statePre; //!< predicted state (x'(k)): x(k)=A*x(k-1)+B*u(k) |
397 | CV_PROP_RW Mat statePost; //!< corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k)) |
398 | CV_PROP_RW Mat transitionMatrix; //!< state transition matrix (A) |
399 | CV_PROP_RW Mat controlMatrix; //!< control matrix (B) (not used if there is no control) |
400 | CV_PROP_RW Mat measurementMatrix; //!< measurement matrix (H) |
401 | CV_PROP_RW Mat processNoiseCov; //!< process noise covariance matrix (Q) |
402 | CV_PROP_RW Mat measurementNoiseCov;//!< measurement noise covariance matrix (R) |
403 | CV_PROP_RW Mat errorCovPre; //!< priori error estimate covariance matrix (P'(k)): P'(k)=A*P(k-1)*At + Q)*/ |
404 | CV_PROP_RW Mat gain; //!< Kalman gain matrix (K(k)): K(k)=P'(k)*Ht*inv(H*P'(k)*Ht+R) |
405 | CV_PROP_RW Mat errorCovPost; //!< posteriori error estimate covariance matrix (P(k)): P(k)=(I-K(k)*H)*P'(k) |
406 | |
407 | // temporary matrices |
408 | Mat temp1; |
409 | Mat temp2; |
410 | Mat temp3; |
411 | Mat temp4; |
412 | Mat temp5; |
413 | }; |
414 | |
415 | |
416 | /** @brief Read a .flo file |
417 | |
418 | @param path Path to the file to be loaded |
419 | |
420 | The function readOpticalFlow loads a flow field from a file and returns it as a single matrix. |
421 | Resulting Mat has a type CV_32FC2 - floating-point, 2-channel. First channel corresponds to the |
422 | flow in the horizontal direction (u), second - vertical (v). |
423 | */ |
424 | CV_EXPORTS_W Mat readOpticalFlow( const String& path ); |
425 | /** @brief Write a .flo to disk |
426 | |
427 | @param path Path to the file to be written |
428 | @param flow Flow field to be stored |
429 | |
430 | The function stores a flow field in a file, returns true on success, false otherwise. |
431 | The flow field must be a 2-channel, floating-point matrix (CV_32FC2). First channel corresponds |
432 | to the flow in the horizontal direction (u), second - vertical (v). |
433 | */ |
434 | CV_EXPORTS_W bool writeOpticalFlow( const String& path, InputArray flow ); |
435 | |
436 | /** |
437 | Base class for dense optical flow algorithms |
438 | */ |
439 | class CV_EXPORTS_W DenseOpticalFlow : public Algorithm |
440 | { |
441 | public: |
442 | /** @brief Calculates an optical flow. |
443 | |
444 | @param I0 first 8-bit single-channel input image. |
445 | @param I1 second input image of the same size and the same type as prev. |
446 | @param flow computed flow image that has the same size as prev and type CV_32FC2. |
447 | */ |
448 | CV_WRAP virtual void calc( InputArray I0, InputArray I1, InputOutputArray flow ) = 0; |
449 | /** @brief Releases all inner buffers. |
450 | */ |
451 | CV_WRAP virtual void collectGarbage() = 0; |
452 | }; |
453 | |
454 | /** @brief Base interface for sparse optical flow algorithms. |
455 | */ |
456 | class CV_EXPORTS_W SparseOpticalFlow : public Algorithm |
457 | { |
458 | public: |
459 | /** @brief Calculates a sparse optical flow. |
460 | |
461 | @param prevImg First input image. |
462 | @param nextImg Second input image of the same size and the same type as prevImg. |
463 | @param prevPts Vector of 2D points for which the flow needs to be found. |
464 | @param nextPts Output vector of 2D points containing the calculated new positions of input features in the second image. |
465 | @param status Output status vector. Each element of the vector is set to 1 if the |
466 | flow for the corresponding features has been found. Otherwise, it is set to 0. |
467 | @param err Optional output vector that contains error response for each point (inverse confidence). |
468 | */ |
469 | CV_WRAP virtual void calc(InputArray prevImg, InputArray nextImg, |
470 | InputArray prevPts, InputOutputArray nextPts, |
471 | OutputArray status, |
472 | OutputArray err = cv::noArray()) = 0; |
473 | }; |
474 | |
475 | |
476 | /** @brief Class computing a dense optical flow using the Gunnar Farneback's algorithm. |
477 | */ |
478 | class CV_EXPORTS_W FarnebackOpticalFlow : public DenseOpticalFlow |
479 | { |
480 | public: |
481 | CV_WRAP virtual int getNumLevels() const = 0; |
482 | CV_WRAP virtual void setNumLevels(int numLevels) = 0; |
483 | |
484 | CV_WRAP virtual double getPyrScale() const = 0; |
485 | CV_WRAP virtual void setPyrScale(double pyrScale) = 0; |
486 | |
487 | CV_WRAP virtual bool getFastPyramids() const = 0; |
488 | CV_WRAP virtual void setFastPyramids(bool fastPyramids) = 0; |
489 | |
490 | CV_WRAP virtual int getWinSize() const = 0; |
491 | CV_WRAP virtual void setWinSize(int winSize) = 0; |
492 | |
493 | CV_WRAP virtual int getNumIters() const = 0; |
494 | CV_WRAP virtual void setNumIters(int numIters) = 0; |
495 | |
496 | CV_WRAP virtual int getPolyN() const = 0; |
497 | CV_WRAP virtual void setPolyN(int polyN) = 0; |
498 | |
499 | CV_WRAP virtual double getPolySigma() const = 0; |
500 | CV_WRAP virtual void setPolySigma(double polySigma) = 0; |
501 | |
502 | CV_WRAP virtual int getFlags() const = 0; |
503 | CV_WRAP virtual void setFlags(int flags) = 0; |
504 | |
505 | CV_WRAP static Ptr<FarnebackOpticalFlow> create( |
506 | int numLevels = 5, |
507 | double pyrScale = 0.5, |
508 | bool fastPyramids = false, |
509 | int winSize = 13, |
510 | int numIters = 10, |
511 | int polyN = 5, |
512 | double polySigma = 1.1, |
513 | int flags = 0); |
514 | }; |
515 | |
516 | /** @brief Variational optical flow refinement |
517 | |
518 | This class implements variational refinement of the input flow field, i.e. |
519 | it uses input flow to initialize the minimization of the following functional: |
520 | \f$E(U) = \int_{\Omega} \delta \Psi(E_I) + \gamma \Psi(E_G) + \alpha \Psi(E_S) \f$, |
521 | where \f$E_I,E_G,E_S\f$ are color constancy, gradient constancy and smoothness terms |
522 | respectively. \f$\Psi(s^2)=\sqrt{s^2+\epsilon^2}\f$ is a robust penalizer to limit the |
523 | influence of outliers. A complete formulation and a description of the minimization |
524 | procedure can be found in @cite Brox2004 |
525 | */ |
526 | class CV_EXPORTS_W VariationalRefinement : public DenseOpticalFlow |
527 | { |
528 | public: |
529 | /** @brief @ref calc function overload to handle separate horizontal (u) and vertical (v) flow components |
530 | (to avoid extra splits/merges) */ |
531 | CV_WRAP virtual void calcUV(InputArray I0, InputArray I1, InputOutputArray flow_u, InputOutputArray flow_v) = 0; |
532 | |
533 | /** @brief Number of outer (fixed-point) iterations in the minimization procedure. |
534 | @see setFixedPointIterations */ |
535 | CV_WRAP virtual int getFixedPointIterations() const = 0; |
536 | /** @copybrief getFixedPointIterations @see getFixedPointIterations */ |
537 | CV_WRAP virtual void setFixedPointIterations(int val) = 0; |
538 | |
539 | /** @brief Number of inner successive over-relaxation (SOR) iterations |
540 | in the minimization procedure to solve the respective linear system. |
541 | @see setSorIterations */ |
542 | CV_WRAP virtual int getSorIterations() const = 0; |
543 | /** @copybrief getSorIterations @see getSorIterations */ |
544 | CV_WRAP virtual void setSorIterations(int val) = 0; |
545 | |
546 | /** @brief Relaxation factor in SOR |
547 | @see setOmega */ |
548 | CV_WRAP virtual float getOmega() const = 0; |
549 | /** @copybrief getOmega @see getOmega */ |
550 | CV_WRAP virtual void setOmega(float val) = 0; |
551 | |
552 | /** @brief Weight of the smoothness term |
553 | @see setAlpha */ |
554 | CV_WRAP virtual float getAlpha() const = 0; |
555 | /** @copybrief getAlpha @see getAlpha */ |
556 | CV_WRAP virtual void setAlpha(float val) = 0; |
557 | |
558 | /** @brief Weight of the color constancy term |
559 | @see setDelta */ |
560 | CV_WRAP virtual float getDelta() const = 0; |
561 | /** @copybrief getDelta @see getDelta */ |
562 | CV_WRAP virtual void setDelta(float val) = 0; |
563 | |
564 | /** @brief Weight of the gradient constancy term |
565 | @see setGamma */ |
566 | CV_WRAP virtual float getGamma() const = 0; |
567 | /** @copybrief getGamma @see getGamma */ |
568 | CV_WRAP virtual void setGamma(float val) = 0; |
569 | |
570 | /** @brief Norm value shift for robust penalizer |
571 | @see setEpsilon */ |
572 | CV_WRAP virtual float getEpsilon() const = 0; |
573 | /** @copybrief getEpsilon @see getEpsilon */ |
574 | CV_WRAP virtual void setEpsilon(float val) = 0; |
575 | |
576 | /** @brief Creates an instance of VariationalRefinement |
577 | */ |
578 | CV_WRAP static Ptr<VariationalRefinement> create(); |
579 | }; |
580 | |
581 | /** @brief DIS optical flow algorithm. |
582 | |
583 | This class implements the Dense Inverse Search (DIS) optical flow algorithm. More |
584 | details about the algorithm can be found at @cite Kroeger2016 . Includes three presets with preselected |
585 | parameters to provide reasonable trade-off between speed and quality. However, even the slowest preset is |
586 | still relatively fast, use DeepFlow if you need better quality and don't care about speed. |
587 | |
588 | This implementation includes several additional features compared to the algorithm described in the paper, |
589 | including spatial propagation of flow vectors (@ref getUseSpatialPropagation), as well as an option to |
590 | utilize an initial flow approximation passed to @ref calc (which is, essentially, temporal propagation, |
591 | if the previous frame's flow field is passed). |
592 | */ |
593 | class CV_EXPORTS_W DISOpticalFlow : public DenseOpticalFlow |
594 | { |
595 | public: |
596 | enum |
597 | { |
598 | PRESET_ULTRAFAST = 0, |
599 | PRESET_FAST = 1, |
600 | PRESET_MEDIUM = 2 |
601 | }; |
602 | |
603 | /** @brief Finest level of the Gaussian pyramid on which the flow is computed (zero level |
604 | corresponds to the original image resolution). The final flow is obtained by bilinear upscaling. |
605 | @see setFinestScale */ |
606 | CV_WRAP virtual int getFinestScale() const = 0; |
607 | /** @copybrief getFinestScale @see getFinestScale */ |
608 | CV_WRAP virtual void setFinestScale(int val) = 0; |
609 | |
610 | /** @brief Size of an image patch for matching (in pixels). Normally, default 8x8 patches work well |
611 | enough in most cases. |
612 | @see setPatchSize */ |
613 | CV_WRAP virtual int getPatchSize() const = 0; |
614 | /** @copybrief getPatchSize @see getPatchSize */ |
615 | CV_WRAP virtual void setPatchSize(int val) = 0; |
616 | |
617 | /** @brief Stride between neighbor patches. Must be less than patch size. Lower values correspond |
618 | to higher flow quality. |
619 | @see setPatchStride */ |
620 | CV_WRAP virtual int getPatchStride() const = 0; |
621 | /** @copybrief getPatchStride @see getPatchStride */ |
622 | CV_WRAP virtual void setPatchStride(int val) = 0; |
623 | |
624 | /** @brief Maximum number of gradient descent iterations in the patch inverse search stage. Higher values |
625 | may improve quality in some cases. |
626 | @see setGradientDescentIterations */ |
627 | CV_WRAP virtual int getGradientDescentIterations() const = 0; |
628 | /** @copybrief getGradientDescentIterations @see getGradientDescentIterations */ |
629 | CV_WRAP virtual void setGradientDescentIterations(int val) = 0; |
630 | |
631 | /** @brief Number of fixed point iterations of variational refinement per scale. Set to zero to |
632 | disable variational refinement completely. Higher values will typically result in more smooth and |
633 | high-quality flow. |
634 | @see setGradientDescentIterations */ |
635 | CV_WRAP virtual int getVariationalRefinementIterations() const = 0; |
636 | /** @copybrief getGradientDescentIterations @see getGradientDescentIterations */ |
637 | CV_WRAP virtual void setVariationalRefinementIterations(int val) = 0; |
638 | |
639 | /** @brief Weight of the smoothness term |
640 | @see setVariationalRefinementAlpha */ |
641 | CV_WRAP virtual float getVariationalRefinementAlpha() const = 0; |
642 | /** @copybrief getVariationalRefinementAlpha @see getVariationalRefinementAlpha */ |
643 | CV_WRAP virtual void setVariationalRefinementAlpha(float val) = 0; |
644 | |
645 | /** @brief Weight of the color constancy term |
646 | @see setVariationalRefinementDelta */ |
647 | CV_WRAP virtual float getVariationalRefinementDelta() const = 0; |
648 | /** @copybrief getVariationalRefinementDelta @see getVariationalRefinementDelta */ |
649 | CV_WRAP virtual void setVariationalRefinementDelta(float val) = 0; |
650 | |
651 | /** @brief Weight of the gradient constancy term |
652 | @see setVariationalRefinementGamma */ |
653 | CV_WRAP virtual float getVariationalRefinementGamma() const = 0; |
654 | /** @copybrief getVariationalRefinementGamma @see getVariationalRefinementGamma */ |
655 | CV_WRAP virtual void setVariationalRefinementGamma(float val) = 0; |
656 | |
657 | /** @brief Norm value shift for robust penalizer |
658 | @see setVariationalRefinementEpsilon */ |
659 | CV_WRAP virtual float getVariationalRefinementEpsilon() const = 0; |
660 | /** @copybrief getVariationalRefinementEpsilon @see getVariationalRefinementEpsilon */ |
661 | CV_WRAP virtual void setVariationalRefinementEpsilon(float val) = 0; |
662 | |
663 | |
664 | /** @brief Whether to use mean-normalization of patches when computing patch distance. It is turned on |
665 | by default as it typically provides a noticeable quality boost because of increased robustness to |
666 | illumination variations. Turn it off if you are certain that your sequence doesn't contain any changes |
667 | in illumination. |
668 | @see setUseMeanNormalization */ |
669 | CV_WRAP virtual bool getUseMeanNormalization() const = 0; |
670 | /** @copybrief getUseMeanNormalization @see getUseMeanNormalization */ |
671 | CV_WRAP virtual void setUseMeanNormalization(bool val) = 0; |
672 | |
673 | /** @brief Whether to use spatial propagation of good optical flow vectors. This option is turned on by |
674 | default, as it tends to work better on average and can sometimes help recover from major errors |
675 | introduced by the coarse-to-fine scheme employed by the DIS optical flow algorithm. Turning this |
676 | option off can make the output flow field a bit smoother, however. |
677 | @see setUseSpatialPropagation */ |
678 | CV_WRAP virtual bool getUseSpatialPropagation() const = 0; |
679 | /** @copybrief getUseSpatialPropagation @see getUseSpatialPropagation */ |
680 | CV_WRAP virtual void setUseSpatialPropagation(bool val) = 0; |
681 | |
682 | /** @brief Creates an instance of DISOpticalFlow |
683 | |
684 | @param preset one of PRESET_ULTRAFAST, PRESET_FAST and PRESET_MEDIUM |
685 | */ |
686 | CV_WRAP static Ptr<DISOpticalFlow> create(int preset = DISOpticalFlow::PRESET_FAST); |
687 | }; |
688 | |
689 | /** @brief Class used for calculating a sparse optical flow. |
690 | |
691 | The class can calculate an optical flow for a sparse feature set using the |
692 | iterative Lucas-Kanade method with pyramids. |
693 | |
694 | @sa calcOpticalFlowPyrLK |
695 | |
696 | */ |
697 | class CV_EXPORTS_W SparsePyrLKOpticalFlow : public SparseOpticalFlow |
698 | { |
699 | public: |
700 | CV_WRAP virtual Size getWinSize() const = 0; |
701 | CV_WRAP virtual void setWinSize(Size winSize) = 0; |
702 | |
703 | CV_WRAP virtual int getMaxLevel() const = 0; |
704 | CV_WRAP virtual void setMaxLevel(int maxLevel) = 0; |
705 | |
706 | CV_WRAP virtual TermCriteria getTermCriteria() const = 0; |
707 | CV_WRAP virtual void setTermCriteria(TermCriteria& crit) = 0; |
708 | |
709 | CV_WRAP virtual int getFlags() const = 0; |
710 | CV_WRAP virtual void setFlags(int flags) = 0; |
711 | |
712 | CV_WRAP virtual double getMinEigThreshold() const = 0; |
713 | CV_WRAP virtual void setMinEigThreshold(double minEigThreshold) = 0; |
714 | |
715 | CV_WRAP static Ptr<SparsePyrLKOpticalFlow> create( |
716 | Size winSize = Size(21, 21), |
717 | int maxLevel = 3, TermCriteria crit = |
718 | TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), |
719 | int flags = 0, |
720 | double minEigThreshold = 1e-4); |
721 | }; |
722 | |
723 | |
724 | |
725 | |
726 | /** @brief Base abstract class for the long-term tracker |
727 | */ |
728 | class CV_EXPORTS_W Tracker |
729 | { |
730 | protected: |
731 | Tracker(); |
732 | public: |
733 | virtual ~Tracker(); |
734 | |
735 | /** @brief Initialize the tracker with a known bounding box that surrounded the target |
736 | @param image The initial frame |
737 | @param boundingBox The initial bounding box |
738 | */ |
739 | CV_WRAP virtual |
740 | void init(InputArray image, const Rect& boundingBox) = 0; |
741 | |
742 | /** @brief Update the tracker, find the new most likely bounding box for the target |
743 | @param image The current frame |
744 | @param boundingBox The bounding box that represent the new target location, if true was returned, not |
745 | modified otherwise |
746 | |
747 | @return True means that target was located and false means that tracker cannot locate target in |
748 | current frame. Note, that latter *does not* imply that tracker has failed, maybe target is indeed |
749 | missing from the frame (say, out of sight) |
750 | */ |
751 | CV_WRAP virtual |
752 | bool update(InputArray image, CV_OUT Rect& boundingBox) = 0; |
753 | }; |
754 | |
755 | |
756 | |
757 | /** @brief The MIL algorithm trains a classifier in an online manner to separate the object from the |
758 | background. |
759 | |
760 | Multiple Instance Learning avoids the drift problem for a robust tracking. The implementation is |
761 | based on @cite MIL . |
762 | |
763 | Original code can be found here <http://vision.ucsd.edu/~bbabenko/project_miltrack.shtml> |
764 | */ |
765 | class CV_EXPORTS_W TrackerMIL : public Tracker |
766 | { |
767 | protected: |
768 | TrackerMIL(); // use ::create() |
769 | public: |
770 | virtual ~TrackerMIL() CV_OVERRIDE; |
771 | |
772 | struct CV_EXPORTS_W_SIMPLE Params |
773 | { |
774 | CV_WRAP Params(); |
775 | //parameters for sampler |
776 | CV_PROP_RW float samplerInitInRadius; //!< radius for gathering positive instances during init |
777 | CV_PROP_RW int samplerInitMaxNegNum; //!< # negative samples to use during init |
778 | CV_PROP_RW float samplerSearchWinSize; //!< size of search window |
779 | CV_PROP_RW float samplerTrackInRadius; //!< radius for gathering positive instances during tracking |
780 | CV_PROP_RW int samplerTrackMaxPosNum; //!< # positive samples to use during tracking |
781 | CV_PROP_RW int samplerTrackMaxNegNum; //!< # negative samples to use during tracking |
782 | CV_PROP_RW int featureSetNumFeatures; //!< # features |
783 | }; |
784 | |
785 | /** @brief Create MIL tracker instance |
786 | * @param parameters MIL parameters TrackerMIL::Params |
787 | */ |
788 | static CV_WRAP |
789 | Ptr<TrackerMIL> create(const TrackerMIL::Params ¶meters = TrackerMIL::Params()); |
790 | |
791 | //void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; |
792 | //bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; |
793 | }; |
794 | |
795 | |
796 | |
797 | /** @brief the GOTURN (Generic Object Tracking Using Regression Networks) tracker |
798 | * |
799 | * GOTURN (@cite GOTURN) is kind of trackers based on Convolutional Neural Networks (CNN). While taking all advantages of CNN trackers, |
800 | * GOTURN is much faster due to offline training without online fine-tuning nature. |
801 | * GOTURN tracker addresses the problem of single target tracking: given a bounding box label of an object in the first frame of the video, |
802 | * we track that object through the rest of the video. NOTE: Current method of GOTURN does not handle occlusions; however, it is fairly |
803 | * robust to viewpoint changes, lighting changes, and deformations. |
804 | * Inputs of GOTURN are two RGB patches representing Target and Search patches resized to 227x227. |
805 | * Outputs of GOTURN are predicted bounding box coordinates, relative to Search patch coordinate system, in format X1,Y1,X2,Y2. |
806 | * Original paper is here: <http://davheld.github.io/GOTURN/GOTURN.pdf> |
807 | * As long as original authors implementation: <https://github.com/davheld/GOTURN#train-the-tracker> |
808 | * Implementation of training algorithm is placed in separately here due to 3d-party dependencies: |
809 | * <https://github.com/Auron-X/GOTURN_Training_Toolkit> |
810 | * GOTURN architecture goturn.prototxt and trained model goturn.caffemodel are accessible on opencv_extra GitHub repository. |
811 | */ |
812 | class CV_EXPORTS_W TrackerGOTURN : public Tracker |
813 | { |
814 | protected: |
815 | TrackerGOTURN(); // use ::create() |
816 | public: |
817 | virtual ~TrackerGOTURN() CV_OVERRIDE; |
818 | |
819 | struct CV_EXPORTS_W_SIMPLE Params |
820 | { |
821 | CV_WRAP Params(); |
822 | CV_PROP_RW std::string modelTxt; |
823 | CV_PROP_RW std::string modelBin; |
824 | }; |
825 | |
826 | /** @brief Constructor |
827 | @param parameters GOTURN parameters TrackerGOTURN::Params |
828 | */ |
829 | static CV_WRAP |
830 | Ptr<TrackerGOTURN> create(const TrackerGOTURN::Params& parameters = TrackerGOTURN::Params()); |
831 | |
832 | #ifdef HAVE_OPENCV_DNN |
833 | /** @brief Constructor |
834 | @param model pre-loaded GOTURN model |
835 | */ |
836 | static CV_WRAP Ptr<TrackerGOTURN> create(const dnn::Net& model); |
837 | #endif |
838 | |
839 | //void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; |
840 | //bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; |
841 | }; |
842 | |
843 | class CV_EXPORTS_W TrackerDaSiamRPN : public Tracker |
844 | { |
845 | protected: |
846 | TrackerDaSiamRPN(); // use ::create() |
847 | public: |
848 | virtual ~TrackerDaSiamRPN() CV_OVERRIDE; |
849 | |
850 | struct CV_EXPORTS_W_SIMPLE Params |
851 | { |
852 | CV_WRAP Params(); |
853 | CV_PROP_RW std::string model; |
854 | CV_PROP_RW std::string kernel_cls1; |
855 | CV_PROP_RW std::string kernel_r1; |
856 | CV_PROP_RW int backend; |
857 | CV_PROP_RW int target; |
858 | }; |
859 | |
860 | /** @brief Constructor |
861 | @param parameters DaSiamRPN parameters TrackerDaSiamRPN::Params |
862 | */ |
863 | static CV_WRAP |
864 | Ptr<TrackerDaSiamRPN> create(const TrackerDaSiamRPN::Params& parameters = TrackerDaSiamRPN::Params()); |
865 | |
866 | #ifdef HAVE_OPENCV_DNN |
867 | /** @brief Constructor |
868 | * @param siam_rpn pre-loaded SiamRPN model |
869 | * @param kernel_cls1 pre-loaded CLS model |
870 | * @param kernel_r1 pre-loaded R1 model |
871 | */ |
872 | static CV_WRAP |
873 | Ptr<TrackerDaSiamRPN> create(const dnn::Net& siam_rpn, const dnn::Net& kernel_cls1, const dnn::Net& kernel_r1); |
874 | #endif |
875 | |
876 | /** @brief Return tracking score |
877 | */ |
878 | CV_WRAP virtual float getTrackingScore() = 0; |
879 | |
880 | //void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; |
881 | //bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; |
882 | }; |
883 | |
884 | /** @brief the Nano tracker is a super lightweight dnn-based general object tracking. |
885 | * |
886 | * Nano tracker is much faster and extremely lightweight due to special model structure, the whole model size is about 1.9 MB. |
887 | * Nano tracker needs two models: one for feature extraction (backbone) and the another for localization (neckhead). |
888 | * Model download link: https://github.com/HonglinChu/SiamTrackers/tree/master/NanoTrack/models/nanotrackv2 |
889 | * Original repo is here: https://github.com/HonglinChu/NanoTrack |
890 | * Author: HongLinChu, 1628464345@qq.com |
891 | */ |
892 | class CV_EXPORTS_W TrackerNano : public Tracker |
893 | { |
894 | protected: |
895 | TrackerNano(); // use ::create() |
896 | public: |
897 | virtual ~TrackerNano() CV_OVERRIDE; |
898 | |
899 | struct CV_EXPORTS_W_SIMPLE Params |
900 | { |
901 | CV_WRAP Params(); |
902 | CV_PROP_RW std::string backbone; |
903 | CV_PROP_RW std::string neckhead; |
904 | CV_PROP_RW int backend; |
905 | CV_PROP_RW int target; |
906 | }; |
907 | |
908 | /** @brief Constructor |
909 | @param parameters NanoTrack parameters TrackerNano::Params |
910 | */ |
911 | static CV_WRAP |
912 | Ptr<TrackerNano> create(const TrackerNano::Params& parameters = TrackerNano::Params()); |
913 | |
914 | #ifdef HAVE_OPENCV_DNN |
915 | /** @brief Constructor |
916 | * @param backbone pre-loaded backbone model |
917 | * @param neckhead pre-loaded neckhead model |
918 | */ |
919 | static CV_WRAP |
920 | Ptr<TrackerNano> create(const dnn::Net& backbone, const dnn::Net& neckhead); |
921 | #endif |
922 | |
923 | /** @brief Return tracking score |
924 | */ |
925 | CV_WRAP virtual float getTrackingScore() = 0; |
926 | |
927 | //void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; |
928 | //bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; |
929 | }; |
930 | |
931 | /** @brief the VIT tracker is a super lightweight dnn-based general object tracking. |
932 | * |
933 | * VIT tracker is much faster and extremely lightweight due to special model structure, the model file is about 767KB. |
934 | * Model download link: https://github.com/opencv/opencv_zoo/tree/main/models/object_tracking_vittrack |
935 | * Author: PengyuLiu, 1872918507@qq.com |
936 | */ |
937 | class CV_EXPORTS_W TrackerVit : public Tracker |
938 | { |
939 | protected: |
940 | TrackerVit(); // use ::create() |
941 | public: |
942 | virtual ~TrackerVit() CV_OVERRIDE; |
943 | |
944 | struct CV_EXPORTS_W_SIMPLE Params |
945 | { |
946 | CV_WRAP Params(); |
947 | CV_PROP_RW std::string net; |
948 | CV_PROP_RW int backend; |
949 | CV_PROP_RW int target; |
950 | CV_PROP_RW Scalar meanvalue; |
951 | CV_PROP_RW Scalar stdvalue; |
952 | CV_PROP_RW float tracking_score_threshold; |
953 | }; |
954 | |
955 | /** @brief Constructor |
956 | @param parameters vit tracker parameters TrackerVit::Params |
957 | */ |
958 | static CV_WRAP |
959 | Ptr<TrackerVit> create(const TrackerVit::Params& parameters = TrackerVit::Params()); |
960 | |
961 | #ifdef HAVE_OPENCV_DNN |
962 | /** @brief Constructor |
963 | * @param model pre-loaded DNN model |
964 | * @param meanvalue mean value for image preprocessing |
965 | * @param stdvalue std value for image preprocessing |
966 | * @param tracking_score_threshold threshold for tracking score |
967 | */ |
968 | static CV_WRAP |
969 | Ptr<TrackerVit> create(const dnn::Net& model, Scalar meanvalue = Scalar(0.485, 0.456, 0.406), |
970 | Scalar stdvalue = Scalar(0.229, 0.224, 0.225), float tracking_score_threshold = 0.20f); |
971 | #endif |
972 | |
973 | /** @brief Return tracking score |
974 | */ |
975 | CV_WRAP virtual float getTrackingScore() = 0; |
976 | |
977 | // void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; |
978 | // bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; |
979 | }; |
980 | |
981 | //! @} video_track |
982 | |
983 | } // cv |
984 | |
985 | #endif |
986 | |