| 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 | |