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 // Third party copyrights are property of their respective owners. 16 // 17 // Redistribution and use in source and binary forms, with or without modification, 18 // are permitted provided that the following conditions are met: 19 // 20 // * Redistribution's of source code must retain the above copyright notice, 21 // this list of conditions and the following disclaimer. 22 // 23 // * Redistribution's in binary form must reproduce the above copyright notice, 24 // this list of conditions and the following disclaimer in the documentation 25 // and/or other materials provided with the distribution. 26 // 27 // * The name of the copyright holders may not be used to endorse or promote products 28 // derived from this software without specific prior written permission. 29 // 30 // This software is provided by the copyright holders and contributors "as is" and 31 // any express or implied warranties, including, but not limited to, the implied 32 // warranties of merchantability and fitness for a particular purpose are disclaimed. 33 // In no event shall the Intel Corporation or contributors be liable for any direct, 34 // indirect, incidental, special, exemplary, or consequential damages 35 // (including, but not limited to, procurement of substitute goods or services; 36 // loss of use, data, or profits; or business interruption) however caused 37 // and on any theory of liability, whether in contract, strict liability, 38 // or tort (including negligence or otherwise) arising in any way out of 39 // the use of this software, even if advised of the possibility of such damage. 40 // 41 //M*/ 42 43 #ifndef __OPENCV_IMGPROC_HPP__ 44 #define __OPENCV_IMGPROC_HPP__ 45 46 #include "opencv2/core.hpp" 47 48 /** 49 @defgroup imgproc Image processing 50 @{ 51 @defgroup imgproc_filter Image Filtering 52 53 Functions and classes described in this section are used to perform various linear or non-linear 54 filtering operations on 2D images (represented as Mat's). It means that for each pixel location 55 \f$(x,y)\f$ in the source image (normally, rectangular), its neighborhood is considered and used to 56 compute the response. In case of a linear filter, it is a weighted sum of pixel values. In case of 57 morphological operations, it is the minimum or maximum values, and so on. The computed response is 58 stored in the destination image at the same location \f$(x,y)\f$. It means that the output image 59 will be of the same size as the input image. Normally, the functions support multi-channel arrays, 60 in which case every channel is processed independently. Therefore, the output image will also have 61 the same number of channels as the input one. 62 63 Another common feature of the functions and classes described in this section is that, unlike 64 simple arithmetic functions, they need to extrapolate values of some non-existing pixels. For 65 example, if you want to smooth an image using a Gaussian \f$3 \times 3\f$ filter, then, when 66 processing the left-most pixels in each row, you need pixels to the left of them, that is, outside 67 of the image. You can let these pixels be the same as the left-most image pixels ("replicated 68 border" extrapolation method), or assume that all the non-existing pixels are zeros ("constant 69 border" extrapolation method), and so on. OpenCV enables you to specify the extrapolation method. 70 For details, see cv::BorderTypes 71 72 @anchor filter_depths 73 ### Depth combinations 74 Input depth (src.depth()) | Output depth (ddepth) 75 --------------------------|---------------------- 76 CV_8U | -1/CV_16S/CV_32F/CV_64F 77 CV_16U/CV_16S | -1/CV_32F/CV_64F 78 CV_32F | -1/CV_32F/CV_64F 79 CV_64F | -1/CV_64F 80 81 @note when ddepth=-1, the output image will have the same depth as the source. 82 83 @defgroup imgproc_transform Geometric Image Transformations 84 85 The functions in this section perform various geometrical transformations of 2D images. They do not 86 change the image content but deform the pixel grid and map this deformed grid to the destination 87 image. In fact, to avoid sampling artifacts, the mapping is done in the reverse order, from 88 destination to the source. That is, for each pixel \f$(x, y)\f$ of the destination image, the 89 functions compute coordinates of the corresponding "donor" pixel in the source image and copy the 90 pixel value: 91 92 \f[\texttt{dst} (x,y)= \texttt{src} (f_x(x,y), f_y(x,y))\f] 93 94 In case when you specify the forward mapping \f$\left<g_x, g_y\right>: \texttt{src} \rightarrow 95 \texttt{dst}\f$, the OpenCV functions first compute the corresponding inverse mapping 96 \f$\left<f_x, f_y\right>: \texttt{dst} \rightarrow \texttt{src}\f$ and then use the above formula. 97 98 The actual implementations of the geometrical transformations, from the most generic remap and to 99 the simplest and the fastest resize, need to solve two main problems with the above formula: 100 101 - Extrapolation of non-existing pixels. Similarly to the filtering functions described in the 102 previous section, for some \f$(x,y)\f$, either one of \f$f_x(x,y)\f$, or \f$f_y(x,y)\f$, or both 103 of them may fall outside of the image. In this case, an extrapolation method needs to be used. 104 OpenCV provides the same selection of extrapolation methods as in the filtering functions. In 105 addition, it provides the method BORDER_TRANSPARENT. This means that the corresponding pixels in 106 the destination image will not be modified at all. 107 108 - Interpolation of pixel values. Usually \f$f_x(x,y)\f$ and \f$f_y(x,y)\f$ are floating-point 109 numbers. This means that \f$\left<f_x, f_y\right>\f$ can be either an affine or perspective 110 transformation, or radial lens distortion correction, and so on. So, a pixel value at fractional 111 coordinates needs to be retrieved. In the simplest case, the coordinates can be just rounded to the 112 nearest integer coordinates and the corresponding pixel can be used. This is called a 113 nearest-neighbor interpolation. However, a better result can be achieved by using more 114 sophisticated [interpolation methods](http://en.wikipedia.org/wiki/Multivariate_interpolation) , 115 where a polynomial function is fit into some neighborhood of the computed pixel \f$(f_x(x,y), 116 f_y(x,y))\f$, and then the value of the polynomial at \f$(f_x(x,y), f_y(x,y))\f$ is taken as the 117 interpolated pixel value. In OpenCV, you can choose between several interpolation methods. See 118 resize for details. 119 120 @defgroup imgproc_misc Miscellaneous Image Transformations 121 @defgroup imgproc_draw Drawing Functions 122 123 Drawing functions work with matrices/images of arbitrary depth. The boundaries of the shapes can be 124 rendered with antialiasing (implemented only for 8-bit images for now). All the functions include 125 the parameter color that uses an RGB value (that may be constructed with the Scalar constructor ) 126 for color images and brightness for grayscale images. For color images, the channel ordering is 127 normally *Blue, Green, Red*. This is what imshow, imread, and imwrite expect. So, if you form a 128 color using the Scalar constructor, it should look like: 129 130 \f[\texttt{Scalar} (blue \_ component, green \_ component, red \_ component[, alpha \_ component])\f] 131 132 If you are using your own image rendering and I/O functions, you can use any channel ordering. The 133 drawing functions process each channel independently and do not depend on the channel order or even 134 on the used color space. The whole image can be converted from BGR to RGB or to a different color 135 space using cvtColor . 136 137 If a drawn figure is partially or completely outside the image, the drawing functions clip it. Also, 138 many drawing functions can handle pixel coordinates specified with sub-pixel accuracy. This means 139 that the coordinates can be passed as fixed-point numbers encoded as integers. The number of 140 fractional bits is specified by the shift parameter and the real point coordinates are calculated as 141 \f$\texttt{Point}(x,y)\rightarrow\texttt{Point2f}(x*2^{-shift},y*2^{-shift})\f$ . This feature is 142 especially effective when rendering antialiased shapes. 143 144 @note The functions do not support alpha-transparency when the target image is 4-channel. In this 145 case, the color[3] is simply copied to the repainted pixels. Thus, if you want to paint 146 semi-transparent shapes, you can paint them in a separate buffer and then blend it with the main 147 image. 148 149 @defgroup imgproc_colormap ColorMaps in OpenCV 150 151 The human perception isn't built for observing fine changes in grayscale images. Human eyes are more 152 sensitive to observing changes between colors, so you often need to recolor your grayscale images to 153 get a clue about them. OpenCV now comes with various colormaps to enhance the visualization in your 154 computer vision application. 155 156 In OpenCV you only need applyColorMap to apply a colormap on a given image. The following sample 157 code reads the path to an image from command line, applies a Jet colormap on it and shows the 158 result: 159 160 @code 161 #include <opencv2/core.hpp> 162 #include <opencv2/imgproc.hpp> 163 #include <opencv2/imgcodecs.hpp> 164 #include <opencv2/highgui.hpp> 165 using namespace cv; 166 167 #include <iostream> 168 using namespace std; 169 170 int main(int argc, const char *argv[]) 171 { 172 // We need an input image. (can be grayscale or color) 173 if (argc < 2) 174 { 175 cerr << "We need an image to process here. Please run: colorMap [path_to_image]" << endl; 176 return -1; 177 } 178 Mat img_in = imread(argv[1]); 179 if(img_in.empty()) 180 { 181 cerr << "Sample image (" << argv[1] << ") is empty. Please adjust your path, so it points to a valid input image!" << endl; 182 return -1; 183 } 184 // Holds the colormap version of the image: 185 Mat img_color; 186 // Apply the colormap: 187 applyColorMap(img_in, img_color, COLORMAP_JET); 188 // Show the result: 189 imshow("colorMap", img_color); 190 waitKey(0); 191 return 0; 192 } 193 @endcode 194 195 @see cv::ColormapTypes 196 197 @defgroup imgproc_hist Histograms 198 @defgroup imgproc_shape Structural Analysis and Shape Descriptors 199 @defgroup imgproc_motion Motion Analysis and Object Tracking 200 @defgroup imgproc_feature Feature Detection 201 @defgroup imgproc_object Object Detection 202 @defgroup imgproc_c C API 203 @} 204 */ 205 206 namespace cv 207 { 208 209 /** @addtogroup imgproc 210 @{ 211 */ 212 213 //! @addtogroup imgproc_filter 214 //! @{ 215 216 //! type of morphological operation 217 enum MorphTypes{ 218 MORPH_ERODE = 0, //!< see cv::erode 219 MORPH_DILATE = 1, //!< see cv::dilate 220 MORPH_OPEN = 2, //!< an opening operation 221 //!< \f[\texttt{dst} = \mathrm{open} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \mathrm{erode} ( \texttt{src} , \texttt{element} ))\f] 222 MORPH_CLOSE = 3, //!< a closing operation 223 //!< \f[\texttt{dst} = \mathrm{close} ( \texttt{src} , \texttt{element} )= \mathrm{erode} ( \mathrm{dilate} ( \texttt{src} , \texttt{element} ))\f] 224 MORPH_GRADIENT = 4, //!< a morphological gradient 225 //!< \f[\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} )\f] 226 MORPH_TOPHAT = 5, //!< "top hat" 227 //!< \f[\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} )\f] 228 MORPH_BLACKHAT = 6 //!< "black hat" 229 //!< \f[\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}\f] 230 }; 231 232 //! shape of the structuring element 233 enum MorphShapes { 234 MORPH_RECT = 0, //!< a rectangular structuring element: \f[E_{ij}=1\f] 235 MORPH_CROSS = 1, //!< a cross-shaped structuring element: 236 //!< \f[E_{ij} = \fork{1}{if i=\texttt{anchor.y} or j=\texttt{anchor.x}}{0}{otherwise}\f] 237 MORPH_ELLIPSE = 2 //!< an elliptic structuring element, that is, a filled ellipse inscribed 238 //!< into the rectangle Rect(0, 0, esize.width, 0.esize.height) 239 }; 240 241 //! @} imgproc_filter 242 243 //! @addtogroup imgproc_transform 244 //! @{ 245 246 //! interpolation algorithm 247 enum InterpolationFlags{ 248 /** nearest neighbor interpolation */ 249 INTER_NEAREST = 0, 250 /** bilinear interpolation */ 251 INTER_LINEAR = 1, 252 /** bicubic interpolation */ 253 INTER_CUBIC = 2, 254 /** resampling using pixel area relation. It may be a preferred method for image decimation, as 255 it gives moire'-free results. But when the image is zoomed, it is similar to the INTER_NEAREST 256 method. */ 257 INTER_AREA = 3, 258 /** Lanczos interpolation over 8x8 neighborhood */ 259 INTER_LANCZOS4 = 4, 260 /** mask for interpolation codes */ 261 INTER_MAX = 7, 262 /** flag, fills all of the destination image pixels. If some of them correspond to outliers in the 263 source image, they are set to zero */ 264 WARP_FILL_OUTLIERS = 8, 265 /** flag, inverse transformation 266 267 For example, polar transforms: 268 - flag is __not__ set: \f$dst( \phi , \rho ) = src(x,y)\f$ 269 - flag is set: \f$dst(x,y) = src( \phi , \rho )\f$ 270 */ 271 WARP_INVERSE_MAP = 16 272 }; 273 274 enum InterpolationMasks { 275 INTER_BITS = 5, 276 INTER_BITS2 = INTER_BITS * 2, 277 INTER_TAB_SIZE = 1 << INTER_BITS, 278 INTER_TAB_SIZE2 = INTER_TAB_SIZE * INTER_TAB_SIZE 279 }; 280 281 //! @} imgproc_transform 282 283 //! @addtogroup imgproc_misc 284 //! @{ 285 286 //! Distance types for Distance Transform and M-estimators 287 //! @see cv::distanceTransform, cv::fitLine 288 enum DistanceTypes { 289 DIST_USER = -1, //!< User defined distance 290 DIST_L1 = 1, //!< distance = |x1-x2| + |y1-y2| 291 DIST_L2 = 2, //!< the simple euclidean distance 292 DIST_C = 3, //!< distance = max(|x1-x2|,|y1-y2|) 293 DIST_L12 = 4, //!< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) 294 DIST_FAIR = 5, //!< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998 295 DIST_WELSCH = 6, //!< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846 296 DIST_HUBER = 7 //!< distance = |x|<c ? x^2/2 : c(|x|-c/2), c=1.345 297 }; 298 299 //! Mask size for distance transform 300 enum DistanceTransformMasks { 301 DIST_MASK_3 = 3, //!< mask=3 302 DIST_MASK_5 = 5, //!< mask=5 303 DIST_MASK_PRECISE = 0 //!< 304 }; 305 306 //! type of the threshold operation 307 //! ![threshold types](pics/threshold.png) 308 enum ThresholdTypes { 309 THRESH_BINARY = 0, //!< \f[\texttt{dst} (x,y) = \fork{\texttt{maxval}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\f] 310 THRESH_BINARY_INV = 1, //!< \f[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{maxval}}{otherwise}\f] 311 THRESH_TRUNC = 2, //!< \f[\texttt{dst} (x,y) = \fork{\texttt{threshold}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f] 312 THRESH_TOZERO = 3, //!< \f[\texttt{dst} (x,y) = \fork{\texttt{src}(x,y)}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\f] 313 THRESH_TOZERO_INV = 4, //!< \f[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f] 314 THRESH_MASK = 7, 315 THRESH_OTSU = 8, //!< flag, use Otsu algorithm to choose the optimal threshold value 316 THRESH_TRIANGLE = 16 //!< flag, use Triangle algorithm to choose the optimal threshold value 317 }; 318 319 //! adaptive threshold algorithm 320 //! see cv::adaptiveThreshold 321 enum AdaptiveThresholdTypes { 322 /** the threshold value \f$T(x,y)\f$ is a mean of the \f$\texttt{blockSize} \times 323 \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$ minus C */ 324 ADAPTIVE_THRESH_MEAN_C = 0, 325 /** the threshold value \f$T(x, y)\f$ is a weighted sum (cross-correlation with a Gaussian 326 window) of the \f$\texttt{blockSize} \times \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$ 327 minus C . The default sigma (standard deviation) is used for the specified blockSize . See 328 cv::getGaussianKernel*/ 329 ADAPTIVE_THRESH_GAUSSIAN_C = 1 330 }; 331 332 //! cv::undistort mode 333 enum UndistortTypes { 334 PROJ_SPHERICAL_ORTHO = 0, 335 PROJ_SPHERICAL_EQRECT = 1 336 }; 337 338 //! class of the pixel in GrabCut algorithm 339 enum GrabCutClasses { 340 GC_BGD = 0, //!< an obvious background pixels 341 GC_FGD = 1, //!< an obvious foreground (object) pixel 342 GC_PR_BGD = 2, //!< a possible background pixel 343 GC_PR_FGD = 3 //!< a possible foreground pixel 344 }; 345 346 //! GrabCut algorithm flags 347 enum GrabCutModes { 348 /** The function initializes the state and the mask using the provided rectangle. After that it 349 runs iterCount iterations of the algorithm. */ 350 GC_INIT_WITH_RECT = 0, 351 /** The function initializes the state using the provided mask. Note that GC_INIT_WITH_RECT 352 and GC_INIT_WITH_MASK can be combined. Then, all the pixels outside of the ROI are 353 automatically initialized with GC_BGD .*/ 354 GC_INIT_WITH_MASK = 1, 355 /** The value means that the algorithm should just resume. */ 356 GC_EVAL = 2 357 }; 358 359 //! distanceTransform algorithm flags 360 enum DistanceTransformLabelTypes { 361 /** each connected component of zeros in src (as well as all the non-zero pixels closest to the 362 connected component) will be assigned the same label */ 363 DIST_LABEL_CCOMP = 0, 364 /** each zero pixel (and all the non-zero pixels closest to it) gets its own label. */ 365 DIST_LABEL_PIXEL = 1 366 }; 367 368 //! floodfill algorithm flags 369 enum FloodFillFlags { 370 /** If set, the difference between the current pixel and seed pixel is considered. Otherwise, 371 the difference between neighbor pixels is considered (that is, the range is floating). */ 372 FLOODFILL_FIXED_RANGE = 1 << 16, 373 /** If set, the function does not change the image ( newVal is ignored), and only fills the 374 mask with the value specified in bits 8-16 of flags as described above. This option only make 375 sense in function variants that have the mask parameter. */ 376 FLOODFILL_MASK_ONLY = 1 << 17 377 }; 378 379 //! @} imgproc_misc 380 381 //! @addtogroup imgproc_shape 382 //! @{ 383 384 //! connected components algorithm output formats 385 enum ConnectedComponentsTypes { 386 CC_STAT_LEFT = 0, //!< The leftmost (x) coordinate which is the inclusive start of the bounding 387 //!< box in the horizontal direction. 388 CC_STAT_TOP = 1, //!< The topmost (y) coordinate which is the inclusive start of the bounding 389 //!< box in the vertical direction. 390 CC_STAT_WIDTH = 2, //!< The horizontal size of the bounding box 391 CC_STAT_HEIGHT = 3, //!< The vertical size of the bounding box 392 CC_STAT_AREA = 4, //!< The total area (in pixels) of the connected component 393 CC_STAT_MAX = 5 394 }; 395 396 //! mode of the contour retrieval algorithm 397 enum RetrievalModes { 398 /** retrieves only the extreme outer contours. It sets `hierarchy[i][2]=hierarchy[i][3]=-1` for 399 all the contours. */ 400 RETR_EXTERNAL = 0, 401 /** retrieves all of the contours without establishing any hierarchical relationships. */ 402 RETR_LIST = 1, 403 /** retrieves all of the contours and organizes them into a two-level hierarchy. At the top 404 level, there are external boundaries of the components. At the second level, there are 405 boundaries of the holes. If there is another contour inside a hole of a connected component, it 406 is still put at the top level. */ 407 RETR_CCOMP = 2, 408 /** retrieves all of the contours and reconstructs a full hierarchy of nested contours.*/ 409 RETR_TREE = 3, 410 RETR_FLOODFILL = 4 //!< 411 }; 412 413 //! the contour approximation algorithm 414 enum ContourApproximationModes { 415 /** stores absolutely all the contour points. That is, any 2 subsequent points (x1,y1) and 416 (x2,y2) of the contour will be either horizontal, vertical or diagonal neighbors, that is, 417 max(abs(x1-x2),abs(y2-y1))==1. */ 418 CHAIN_APPROX_NONE = 1, 419 /** compresses horizontal, vertical, and diagonal segments and leaves only their end points. 420 For example, an up-right rectangular contour is encoded with 4 points. */ 421 CHAIN_APPROX_SIMPLE = 2, 422 /** applies one of the flavors of the Teh-Chin chain approximation algorithm @cite TehChin89 */ 423 CHAIN_APPROX_TC89_L1 = 3, 424 /** applies one of the flavors of the Teh-Chin chain approximation algorithm @cite TehChin89 */ 425 CHAIN_APPROX_TC89_KCOS = 4 426 }; 427 428 //! @} imgproc_shape 429 430 //! Variants of a Hough transform 431 enum HoughModes { 432 433 /** classical or standard Hough transform. Every line is represented by two floating-point 434 numbers \f$(\rho, \theta)\f$ , where \f$\rho\f$ is a distance between (0,0) point and the line, 435 and \f$\theta\f$ is the angle between x-axis and the normal to the line. Thus, the matrix must 436 be (the created sequence will be) of CV_32FC2 type */ 437 HOUGH_STANDARD = 0, 438 /** probabilistic Hough transform (more efficient in case if the picture contains a few long 439 linear segments). It returns line segments rather than the whole line. Each segment is 440 represented by starting and ending points, and the matrix must be (the created sequence will 441 be) of the CV_32SC4 type. */ 442 HOUGH_PROBABILISTIC = 1, 443 /** multi-scale variant of the classical Hough transform. The lines are encoded the same way as 444 HOUGH_STANDARD. */ 445 HOUGH_MULTI_SCALE = 2, 446 HOUGH_GRADIENT = 3 //!< basically *21HT*, described in @cite Yuen90 447 }; 448 449 //! Variants of Line Segment %Detector 450 //! @ingroup imgproc_feature 451 enum LineSegmentDetectorModes { 452 LSD_REFINE_NONE = 0, //!< No refinement applied 453 LSD_REFINE_STD = 1, //!< Standard refinement is applied. E.g. breaking arches into smaller straighter line approximations. 454 LSD_REFINE_ADV = 2 //!< Advanced refinement. Number of false alarms is calculated, lines are 455 //!< refined through increase of precision, decrement in size, etc. 456 }; 457 458 /** Histogram comparison methods 459 @ingroup imgproc_hist 460 */ 461 enum HistCompMethods { 462 /** Correlation 463 \f[d(H_1,H_2) = \frac{\sum_I (H_1(I) - \bar{H_1}) (H_2(I) - \bar{H_2})}{\sqrt{\sum_I(H_1(I) - \bar{H_1})^2 \sum_I(H_2(I) - \bar{H_2})^2}}\f] 464 where 465 \f[\bar{H_k} = \frac{1}{N} \sum _J H_k(J)\f] 466 and \f$N\f$ is a total number of histogram bins. */ 467 HISTCMP_CORREL = 0, 468 /** Chi-Square 469 \f[d(H_1,H_2) = \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)}\f] */ 470 HISTCMP_CHISQR = 1, 471 /** Intersection 472 \f[d(H_1,H_2) = \sum _I \min (H_1(I), H_2(I))\f] */ 473 HISTCMP_INTERSECT = 2, 474 /** Bhattacharyya distance 475 (In fact, OpenCV computes Hellinger distance, which is related to Bhattacharyya coefficient.) 476 \f[d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} N^2}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}\f] */ 477 HISTCMP_BHATTACHARYYA = 3, 478 HISTCMP_HELLINGER = HISTCMP_BHATTACHARYYA, //!< Synonym for HISTCMP_BHATTACHARYYA 479 /** Alternative Chi-Square 480 \f[d(H_1,H_2) = 2 * \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)+H_2(I)}\f] 481 This alternative formula is regularly used for texture comparison. See e.g. @cite Puzicha1997 */ 482 HISTCMP_CHISQR_ALT = 4, 483 /** Kullback-Leibler divergence 484 \f[d(H_1,H_2) = \sum _I H_1(I) \log \left(\frac{H_1(I)}{H_2(I)}\right)\f] */ 485 HISTCMP_KL_DIV = 5 486 }; 487 488 /** the color conversion code 489 @see @ref imgproc_color_conversions 490 @ingroup imgproc_misc 491 */ 492 enum ColorConversionCodes { 493 COLOR_BGR2BGRA = 0, //!< add alpha channel to RGB or BGR image 494 COLOR_RGB2RGBA = COLOR_BGR2BGRA, 495 496 COLOR_BGRA2BGR = 1, //!< remove alpha channel from RGB or BGR image 497 COLOR_RGBA2RGB = COLOR_BGRA2BGR, 498 499 COLOR_BGR2RGBA = 2, //!< convert between RGB and BGR color spaces (with or without alpha channel) 500 COLOR_RGB2BGRA = COLOR_BGR2RGBA, 501 502 COLOR_RGBA2BGR = 3, 503 COLOR_BGRA2RGB = COLOR_RGBA2BGR, 504 505 COLOR_BGR2RGB = 4, 506 COLOR_RGB2BGR = COLOR_BGR2RGB, 507 508 COLOR_BGRA2RGBA = 5, 509 COLOR_RGBA2BGRA = COLOR_BGRA2RGBA, 510 511 COLOR_BGR2GRAY = 6, //!< convert between RGB/BGR and grayscale, @ref color_convert_rgb_gray "color conversions" 512 COLOR_RGB2GRAY = 7, 513 COLOR_GRAY2BGR = 8, 514 COLOR_GRAY2RGB = COLOR_GRAY2BGR, 515 COLOR_GRAY2BGRA = 9, 516 COLOR_GRAY2RGBA = COLOR_GRAY2BGRA, 517 COLOR_BGRA2GRAY = 10, 518 COLOR_RGBA2GRAY = 11, 519 520 COLOR_BGR2BGR565 = 12, //!< convert between RGB/BGR and BGR565 (16-bit images) 521 COLOR_RGB2BGR565 = 13, 522 COLOR_BGR5652BGR = 14, 523 COLOR_BGR5652RGB = 15, 524 COLOR_BGRA2BGR565 = 16, 525 COLOR_RGBA2BGR565 = 17, 526 COLOR_BGR5652BGRA = 18, 527 COLOR_BGR5652RGBA = 19, 528 529 COLOR_GRAY2BGR565 = 20, //!< convert between grayscale to BGR565 (16-bit images) 530 COLOR_BGR5652GRAY = 21, 531 532 COLOR_BGR2BGR555 = 22, //!< convert between RGB/BGR and BGR555 (16-bit images) 533 COLOR_RGB2BGR555 = 23, 534 COLOR_BGR5552BGR = 24, 535 COLOR_BGR5552RGB = 25, 536 COLOR_BGRA2BGR555 = 26, 537 COLOR_RGBA2BGR555 = 27, 538 COLOR_BGR5552BGRA = 28, 539 COLOR_BGR5552RGBA = 29, 540 541 COLOR_GRAY2BGR555 = 30, //!< convert between grayscale and BGR555 (16-bit images) 542 COLOR_BGR5552GRAY = 31, 543 544 COLOR_BGR2XYZ = 32, //!< convert RGB/BGR to CIE XYZ, @ref color_convert_rgb_xyz "color conversions" 545 COLOR_RGB2XYZ = 33, 546 COLOR_XYZ2BGR = 34, 547 COLOR_XYZ2RGB = 35, 548 549 COLOR_BGR2YCrCb = 36, //!< convert RGB/BGR to luma-chroma (aka YCC), @ref color_convert_rgb_ycrcb "color conversions" 550 COLOR_RGB2YCrCb = 37, 551 COLOR_YCrCb2BGR = 38, 552 COLOR_YCrCb2RGB = 39, 553 554 COLOR_BGR2HSV = 40, //!< convert RGB/BGR to HSV (hue saturation value), @ref color_convert_rgb_hsv "color conversions" 555 COLOR_RGB2HSV = 41, 556 557 COLOR_BGR2Lab = 44, //!< convert RGB/BGR to CIE Lab, @ref color_convert_rgb_lab "color conversions" 558 COLOR_RGB2Lab = 45, 559 560 COLOR_BGR2Luv = 50, //!< convert RGB/BGR to CIE Luv, @ref color_convert_rgb_luv "color conversions" 561 COLOR_RGB2Luv = 51, 562 COLOR_BGR2HLS = 52, //!< convert RGB/BGR to HLS (hue lightness saturation), @ref color_convert_rgb_hls "color conversions" 563 COLOR_RGB2HLS = 53, 564 565 COLOR_HSV2BGR = 54, //!< backward conversions to RGB/BGR 566 COLOR_HSV2RGB = 55, 567 568 COLOR_Lab2BGR = 56, 569 COLOR_Lab2RGB = 57, 570 COLOR_Luv2BGR = 58, 571 COLOR_Luv2RGB = 59, 572 COLOR_HLS2BGR = 60, 573 COLOR_HLS2RGB = 61, 574 575 COLOR_BGR2HSV_FULL = 66, //!< 576 COLOR_RGB2HSV_FULL = 67, 577 COLOR_BGR2HLS_FULL = 68, 578 COLOR_RGB2HLS_FULL = 69, 579 580 COLOR_HSV2BGR_FULL = 70, 581 COLOR_HSV2RGB_FULL = 71, 582 COLOR_HLS2BGR_FULL = 72, 583 COLOR_HLS2RGB_FULL = 73, 584 585 COLOR_LBGR2Lab = 74, 586 COLOR_LRGB2Lab = 75, 587 COLOR_LBGR2Luv = 76, 588 COLOR_LRGB2Luv = 77, 589 590 COLOR_Lab2LBGR = 78, 591 COLOR_Lab2LRGB = 79, 592 COLOR_Luv2LBGR = 80, 593 COLOR_Luv2LRGB = 81, 594 595 COLOR_BGR2YUV = 82, //!< convert between RGB/BGR and YUV 596 COLOR_RGB2YUV = 83, 597 COLOR_YUV2BGR = 84, 598 COLOR_YUV2RGB = 85, 599 600 //! YUV 4:2:0 family to RGB 601 COLOR_YUV2RGB_NV12 = 90, 602 COLOR_YUV2BGR_NV12 = 91, 603 COLOR_YUV2RGB_NV21 = 92, 604 COLOR_YUV2BGR_NV21 = 93, 605 COLOR_YUV420sp2RGB = COLOR_YUV2RGB_NV21, 606 COLOR_YUV420sp2BGR = COLOR_YUV2BGR_NV21, 607 608 COLOR_YUV2RGBA_NV12 = 94, 609 COLOR_YUV2BGRA_NV12 = 95, 610 COLOR_YUV2RGBA_NV21 = 96, 611 COLOR_YUV2BGRA_NV21 = 97, 612 COLOR_YUV420sp2RGBA = COLOR_YUV2RGBA_NV21, 613 COLOR_YUV420sp2BGRA = COLOR_YUV2BGRA_NV21, 614 615 COLOR_YUV2RGB_YV12 = 98, 616 COLOR_YUV2BGR_YV12 = 99, 617 COLOR_YUV2RGB_IYUV = 100, 618 COLOR_YUV2BGR_IYUV = 101, 619 COLOR_YUV2RGB_I420 = COLOR_YUV2RGB_IYUV, 620 COLOR_YUV2BGR_I420 = COLOR_YUV2BGR_IYUV, 621 COLOR_YUV420p2RGB = COLOR_YUV2RGB_YV12, 622 COLOR_YUV420p2BGR = COLOR_YUV2BGR_YV12, 623 624 COLOR_YUV2RGBA_YV12 = 102, 625 COLOR_YUV2BGRA_YV12 = 103, 626 COLOR_YUV2RGBA_IYUV = 104, 627 COLOR_YUV2BGRA_IYUV = 105, 628 COLOR_YUV2RGBA_I420 = COLOR_YUV2RGBA_IYUV, 629 COLOR_YUV2BGRA_I420 = COLOR_YUV2BGRA_IYUV, 630 COLOR_YUV420p2RGBA = COLOR_YUV2RGBA_YV12, 631 COLOR_YUV420p2BGRA = COLOR_YUV2BGRA_YV12, 632 633 COLOR_YUV2GRAY_420 = 106, 634 COLOR_YUV2GRAY_NV21 = COLOR_YUV2GRAY_420, 635 COLOR_YUV2GRAY_NV12 = COLOR_YUV2GRAY_420, 636 COLOR_YUV2GRAY_YV12 = COLOR_YUV2GRAY_420, 637 COLOR_YUV2GRAY_IYUV = COLOR_YUV2GRAY_420, 638 COLOR_YUV2GRAY_I420 = COLOR_YUV2GRAY_420, 639 COLOR_YUV420sp2GRAY = COLOR_YUV2GRAY_420, 640 COLOR_YUV420p2GRAY = COLOR_YUV2GRAY_420, 641 642 //! YUV 4:2:2 family to RGB 643 COLOR_YUV2RGB_UYVY = 107, 644 COLOR_YUV2BGR_UYVY = 108, 645 //COLOR_YUV2RGB_VYUY = 109, 646 //COLOR_YUV2BGR_VYUY = 110, 647 COLOR_YUV2RGB_Y422 = COLOR_YUV2RGB_UYVY, 648 COLOR_YUV2BGR_Y422 = COLOR_YUV2BGR_UYVY, 649 COLOR_YUV2RGB_UYNV = COLOR_YUV2RGB_UYVY, 650 COLOR_YUV2BGR_UYNV = COLOR_YUV2BGR_UYVY, 651 652 COLOR_YUV2RGBA_UYVY = 111, 653 COLOR_YUV2BGRA_UYVY = 112, 654 //COLOR_YUV2RGBA_VYUY = 113, 655 //COLOR_YUV2BGRA_VYUY = 114, 656 COLOR_YUV2RGBA_Y422 = COLOR_YUV2RGBA_UYVY, 657 COLOR_YUV2BGRA_Y422 = COLOR_YUV2BGRA_UYVY, 658 COLOR_YUV2RGBA_UYNV = COLOR_YUV2RGBA_UYVY, 659 COLOR_YUV2BGRA_UYNV = COLOR_YUV2BGRA_UYVY, 660 661 COLOR_YUV2RGB_YUY2 = 115, 662 COLOR_YUV2BGR_YUY2 = 116, 663 COLOR_YUV2RGB_YVYU = 117, 664 COLOR_YUV2BGR_YVYU = 118, 665 COLOR_YUV2RGB_YUYV = COLOR_YUV2RGB_YUY2, 666 COLOR_YUV2BGR_YUYV = COLOR_YUV2BGR_YUY2, 667 COLOR_YUV2RGB_YUNV = COLOR_YUV2RGB_YUY2, 668 COLOR_YUV2BGR_YUNV = COLOR_YUV2BGR_YUY2, 669 670 COLOR_YUV2RGBA_YUY2 = 119, 671 COLOR_YUV2BGRA_YUY2 = 120, 672 COLOR_YUV2RGBA_YVYU = 121, 673 COLOR_YUV2BGRA_YVYU = 122, 674 COLOR_YUV2RGBA_YUYV = COLOR_YUV2RGBA_YUY2, 675 COLOR_YUV2BGRA_YUYV = COLOR_YUV2BGRA_YUY2, 676 COLOR_YUV2RGBA_YUNV = COLOR_YUV2RGBA_YUY2, 677 COLOR_YUV2BGRA_YUNV = COLOR_YUV2BGRA_YUY2, 678 679 COLOR_YUV2GRAY_UYVY = 123, 680 COLOR_YUV2GRAY_YUY2 = 124, 681 //CV_YUV2GRAY_VYUY = CV_YUV2GRAY_UYVY, 682 COLOR_YUV2GRAY_Y422 = COLOR_YUV2GRAY_UYVY, 683 COLOR_YUV2GRAY_UYNV = COLOR_YUV2GRAY_UYVY, 684 COLOR_YUV2GRAY_YVYU = COLOR_YUV2GRAY_YUY2, 685 COLOR_YUV2GRAY_YUYV = COLOR_YUV2GRAY_YUY2, 686 COLOR_YUV2GRAY_YUNV = COLOR_YUV2GRAY_YUY2, 687 688 //! alpha premultiplication 689 COLOR_RGBA2mRGBA = 125, 690 COLOR_mRGBA2RGBA = 126, 691 692 //! RGB to YUV 4:2:0 family 693 COLOR_RGB2YUV_I420 = 127, 694 COLOR_BGR2YUV_I420 = 128, 695 COLOR_RGB2YUV_IYUV = COLOR_RGB2YUV_I420, 696 COLOR_BGR2YUV_IYUV = COLOR_BGR2YUV_I420, 697 698 COLOR_RGBA2YUV_I420 = 129, 699 COLOR_BGRA2YUV_I420 = 130, 700 COLOR_RGBA2YUV_IYUV = COLOR_RGBA2YUV_I420, 701 COLOR_BGRA2YUV_IYUV = COLOR_BGRA2YUV_I420, 702 COLOR_RGB2YUV_YV12 = 131, 703 COLOR_BGR2YUV_YV12 = 132, 704 COLOR_RGBA2YUV_YV12 = 133, 705 COLOR_BGRA2YUV_YV12 = 134, 706 707 //! Demosaicing 708 COLOR_BayerBG2BGR = 46, 709 COLOR_BayerGB2BGR = 47, 710 COLOR_BayerRG2BGR = 48, 711 COLOR_BayerGR2BGR = 49, 712 713 COLOR_BayerBG2RGB = COLOR_BayerRG2BGR, 714 COLOR_BayerGB2RGB = COLOR_BayerGR2BGR, 715 COLOR_BayerRG2RGB = COLOR_BayerBG2BGR, 716 COLOR_BayerGR2RGB = COLOR_BayerGB2BGR, 717 718 COLOR_BayerBG2GRAY = 86, 719 COLOR_BayerGB2GRAY = 87, 720 COLOR_BayerRG2GRAY = 88, 721 COLOR_BayerGR2GRAY = 89, 722 723 //! Demosaicing using Variable Number of Gradients 724 COLOR_BayerBG2BGR_VNG = 62, 725 COLOR_BayerGB2BGR_VNG = 63, 726 COLOR_BayerRG2BGR_VNG = 64, 727 COLOR_BayerGR2BGR_VNG = 65, 728 729 COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG, 730 COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG, 731 COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG, 732 COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG, 733 734 //! Edge-Aware Demosaicing 735 COLOR_BayerBG2BGR_EA = 135, 736 COLOR_BayerGB2BGR_EA = 136, 737 COLOR_BayerRG2BGR_EA = 137, 738 COLOR_BayerGR2BGR_EA = 138, 739 740 COLOR_BayerBG2RGB_EA = COLOR_BayerRG2BGR_EA, 741 COLOR_BayerGB2RGB_EA = COLOR_BayerGR2BGR_EA, 742 COLOR_BayerRG2RGB_EA = COLOR_BayerBG2BGR_EA, 743 COLOR_BayerGR2RGB_EA = COLOR_BayerGB2BGR_EA, 744 745 746 COLOR_COLORCVT_MAX = 139 747 }; 748 749 /** types of intersection between rectangles 750 @ingroup imgproc_shape 751 */ 752 enum RectanglesIntersectTypes { 753 INTERSECT_NONE = 0, //!< No intersection 754 INTERSECT_PARTIAL = 1, //!< There is a partial intersection 755 INTERSECT_FULL = 2 //!< One of the rectangle is fully enclosed in the other 756 }; 757 758 //! finds arbitrary template in the grayscale image using Generalized Hough Transform 759 class CV_EXPORTS GeneralizedHough : public Algorithm 760 { 761 public: 762 //! set template to search 763 virtual void setTemplate(InputArray templ, Point templCenter = Point(-1, -1)) = 0; 764 virtual void setTemplate(InputArray edges, InputArray dx, InputArray dy, Point templCenter = Point(-1, -1)) = 0; 765 766 //! find template on image 767 virtual void detect(InputArray image, OutputArray positions, OutputArray votes = noArray()) = 0; 768 virtual void detect(InputArray edges, InputArray dx, InputArray dy, OutputArray positions, OutputArray votes = noArray()) = 0; 769 770 //! Canny low threshold. 771 virtual void setCannyLowThresh(int cannyLowThresh) = 0; 772 virtual int getCannyLowThresh() const = 0; 773 774 //! Canny high threshold. 775 virtual void setCannyHighThresh(int cannyHighThresh) = 0; 776 virtual int getCannyHighThresh() const = 0; 777 778 //! Minimum distance between the centers of the detected objects. 779 virtual void setMinDist(double minDist) = 0; 780 virtual double getMinDist() const = 0; 781 782 //! Inverse ratio of the accumulator resolution to the image resolution. 783 virtual void setDp(double dp) = 0; 784 virtual double getDp() const = 0; 785 786 //! Maximal size of inner buffers. 787 virtual void setMaxBufferSize(int maxBufferSize) = 0; 788 virtual int getMaxBufferSize() const = 0; 789 }; 790 791 //! Ballard, D.H. (1981). Generalizing the Hough transform to detect arbitrary shapes. Pattern Recognition 13 (2): 111-122. 792 //! Detects position only without traslation and rotation 793 class CV_EXPORTS GeneralizedHoughBallard : public GeneralizedHough 794 { 795 public: 796 //! R-Table levels. 797 virtual void setLevels(int levels) = 0; 798 virtual int getLevels() const = 0; 799 800 //! The accumulator threshold for the template centers at the detection stage. The smaller it is, the more false positions may be detected. 801 virtual void setVotesThreshold(int votesThreshold) = 0; 802 virtual int getVotesThreshold() const = 0; 803 }; 804 805 //! Guil, N., Gonzlez-Linares, J.M. and Zapata, E.L. (1999). Bidimensional shape detection using an invariant approach. Pattern Recognition 32 (6): 1025-1038. 806 //! Detects position, traslation and rotation 807 class CV_EXPORTS GeneralizedHoughGuil : public GeneralizedHough 808 { 809 public: 810 //! Angle difference in degrees between two points in feature. 811 virtual void setXi(double xi) = 0; 812 virtual double getXi() const = 0; 813 814 //! Feature table levels. 815 virtual void setLevels(int levels) = 0; 816 virtual int getLevels() const = 0; 817 818 //! Maximal difference between angles that treated as equal. 819 virtual void setAngleEpsilon(double angleEpsilon) = 0; 820 virtual double getAngleEpsilon() const = 0; 821 822 //! Minimal rotation angle to detect in degrees. 823 virtual void setMinAngle(double minAngle) = 0; 824 virtual double getMinAngle() const = 0; 825 826 //! Maximal rotation angle to detect in degrees. 827 virtual void setMaxAngle(double maxAngle) = 0; 828 virtual double getMaxAngle() const = 0; 829 830 //! Angle step in degrees. 831 virtual void setAngleStep(double angleStep) = 0; 832 virtual double getAngleStep() const = 0; 833 834 //! Angle votes threshold. 835 virtual void setAngleThresh(int angleThresh) = 0; 836 virtual int getAngleThresh() const = 0; 837 838 //! Minimal scale to detect. 839 virtual void setMinScale(double minScale) = 0; 840 virtual double getMinScale() const = 0; 841 842 //! Maximal scale to detect. 843 virtual void setMaxScale(double maxScale) = 0; 844 virtual double getMaxScale() const = 0; 845 846 //! Scale step. 847 virtual void setScaleStep(double scaleStep) = 0; 848 virtual double getScaleStep() const = 0; 849 850 //! Scale votes threshold. 851 virtual void setScaleThresh(int scaleThresh) = 0; 852 virtual int getScaleThresh() const = 0; 853 854 //! Position votes threshold. 855 virtual void setPosThresh(int posThresh) = 0; 856 virtual int getPosThresh() const = 0; 857 }; 858 859 860 class CV_EXPORTS_W CLAHE : public Algorithm 861 { 862 public: 863 CV_WRAP virtual void apply(InputArray src, OutputArray dst) = 0; 864 865 CV_WRAP virtual void setClipLimit(double clipLimit) = 0; 866 CV_WRAP virtual double getClipLimit() const = 0; 867 868 CV_WRAP virtual void setTilesGridSize(Size tileGridSize) = 0; 869 CV_WRAP virtual Size getTilesGridSize() const = 0; 870 871 CV_WRAP virtual void collectGarbage() = 0; 872 }; 873 874 875 class CV_EXPORTS_W Subdiv2D 876 { 877 public: 878 enum { PTLOC_ERROR = -2, 879 PTLOC_OUTSIDE_RECT = -1, 880 PTLOC_INSIDE = 0, 881 PTLOC_VERTEX = 1, 882 PTLOC_ON_EDGE = 2 883 }; 884 885 enum { NEXT_AROUND_ORG = 0x00, 886 NEXT_AROUND_DST = 0x22, 887 PREV_AROUND_ORG = 0x11, 888 PREV_AROUND_DST = 0x33, 889 NEXT_AROUND_LEFT = 0x13, 890 NEXT_AROUND_RIGHT = 0x31, 891 PREV_AROUND_LEFT = 0x20, 892 PREV_AROUND_RIGHT = 0x02 893 }; 894 895 CV_WRAP Subdiv2D(); 896 CV_WRAP Subdiv2D(Rect rect); 897 CV_WRAP void initDelaunay(Rect rect); 898 899 CV_WRAP int insert(Point2f pt); 900 CV_WRAP void insert(const std::vector<Point2f>& ptvec); 901 CV_WRAP int locate(Point2f pt, CV_OUT int& edge, CV_OUT int& vertex); 902 903 CV_WRAP int findNearest(Point2f pt, CV_OUT Point2f* nearestPt = 0); 904 CV_WRAP void getEdgeList(CV_OUT std::vector<Vec4f>& edgeList) const; 905 CV_WRAP void getTriangleList(CV_OUT std::vector<Vec6f>& triangleList) const; 906 CV_WRAP void getVoronoiFacetList(const std::vector<int>& idx, CV_OUT std::vector<std::vector<Point2f> >& facetList, 907 CV_OUT std::vector<Point2f>& facetCenters); 908 909 CV_WRAP Point2f getVertex(int vertex, CV_OUT int* firstEdge = 0) const; 910 911 CV_WRAP int getEdge( int edge, int nextEdgeType ) const; 912 CV_WRAP int nextEdge(int edge) const; 913 CV_WRAP int rotateEdge(int edge, int rotate) const; 914 CV_WRAP int symEdge(int edge) const; 915 CV_WRAP int edgeOrg(int edge, CV_OUT Point2f* orgpt = 0) const; 916 CV_WRAP int edgeDst(int edge, CV_OUT Point2f* dstpt = 0) const; 917 918 protected: 919 int newEdge(); 920 void deleteEdge(int edge); 921 int newPoint(Point2f pt, bool isvirtual, int firstEdge = 0); 922 void deletePoint(int vtx); 923 void setEdgePoints( int edge, int orgPt, int dstPt ); 924 void splice( int edgeA, int edgeB ); 925 int connectEdges( int edgeA, int edgeB ); 926 void swapEdges( int edge ); 927 int isRightOf(Point2f pt, int edge) const; 928 void calcVoronoi(); 929 void clearVoronoi(); 930 void checkSubdiv() const; 931 932 struct CV_EXPORTS Vertex 933 { 934 Vertex(); 935 Vertex(Point2f pt, bool _isvirtual, int _firstEdge=0); 936 bool isvirtual() const; 937 bool isfree() const; 938 939 int firstEdge; 940 int type; 941 Point2f pt; 942 }; 943 944 struct CV_EXPORTS QuadEdge 945 { 946 QuadEdge(); 947 QuadEdge(int edgeidx); 948 bool isfree() const; 949 950 int next[4]; 951 int pt[4]; 952 }; 953 954 std::vector<Vertex> vtx; 955 std::vector<QuadEdge> qedges; 956 int freeQEdge; 957 int freePoint; 958 bool validGeometry; 959 960 int recentEdge; 961 Point2f topLeft; 962 Point2f bottomRight; 963 }; 964 965 //! @addtogroup imgproc_feature 966 //! @{ 967 968 /** @example lsd_lines.cpp 969 An example using the LineSegmentDetector 970 */ 971 972 /** @brief Line segment detector class 973 974 following the algorithm described at @cite Rafael12 . 975 */ 976 class CV_EXPORTS_W LineSegmentDetector : public Algorithm 977 { 978 public: 979 980 /** @brief Finds lines in the input image. 981 982 This is the output of the default parameters of the algorithm on the above shown image. 983 984 ![image](pics/building_lsd.png) 985 986 @param _image A grayscale (CV_8UC1) input image. If only a roi needs to be selected, use: 987 `lsd_ptr-\>detect(image(roi), lines, ...); lines += Scalar(roi.x, roi.y, roi.x, roi.y);` 988 @param _lines A vector of Vec4i or Vec4f elements specifying the beginning and ending point of a line. Where 989 Vec4i/Vec4f is (x1, y1, x2, y2), point 1 is the start, point 2 - end. Returned lines are strictly 990 oriented depending on the gradient. 991 @param width Vector of widths of the regions, where the lines are found. E.g. Width of line. 992 @param prec Vector of precisions with which the lines are found. 993 @param nfa Vector containing number of false alarms in the line region, with precision of 10%. The 994 bigger the value, logarithmically better the detection. 995 - -1 corresponds to 10 mean false alarms 996 - 0 corresponds to 1 mean false alarm 997 - 1 corresponds to 0.1 mean false alarms 998 This vector will be calculated only when the objects type is LSD_REFINE_ADV. 999 */ 1000 CV_WRAP virtual void detect(InputArray _image, OutputArray _lines, 1001 OutputArray width = noArray(), OutputArray prec = noArray(), 1002 OutputArray nfa = noArray()) = 0; 1003 1004 /** @brief Draws the line segments on a given image. 1005 @param _image The image, where the liens will be drawn. Should be bigger or equal to the image, 1006 where the lines were found. 1007 @param lines A vector of the lines that needed to be drawn. 1008 */ 1009 CV_WRAP virtual void drawSegments(InputOutputArray _image, InputArray lines) = 0; 1010 1011 /** @brief Draws two groups of lines in blue and red, counting the non overlapping (mismatching) pixels. 1012 1013 @param size The size of the image, where lines1 and lines2 were found. 1014 @param lines1 The first group of lines that needs to be drawn. It is visualized in blue color. 1015 @param lines2 The second group of lines. They visualized in red color. 1016 @param _image Optional image, where the lines will be drawn. The image should be color(3-channel) 1017 in order for lines1 and lines2 to be drawn in the above mentioned colors. 1018 */ 1019 CV_WRAP virtual int compareSegments(const Size& size, InputArray lines1, InputArray lines2, InputOutputArray _image = noArray()) = 0; 1020 1021 virtual ~LineSegmentDetector() { } 1022 }; 1023 1024 /** @brief Creates a smart pointer to a LineSegmentDetector object and initializes it. 1025 1026 The LineSegmentDetector algorithm is defined using the standard values. Only advanced users may want 1027 to edit those, as to tailor it for their own application. 1028 1029 @param _refine The way found lines will be refined, see cv::LineSegmentDetectorModes 1030 @param _scale The scale of the image that will be used to find the lines. Range (0..1]. 1031 @param _sigma_scale Sigma for Gaussian filter. It is computed as sigma = _sigma_scale/_scale. 1032 @param _quant Bound to the quantization error on the gradient norm. 1033 @param _ang_th Gradient angle tolerance in degrees. 1034 @param _log_eps Detection threshold: -log10(NFA) \> log_eps. Used only when advancent refinement 1035 is chosen. 1036 @param _density_th Minimal density of aligned region points in the enclosing rectangle. 1037 @param _n_bins Number of bins in pseudo-ordering of gradient modulus. 1038 */ 1039 CV_EXPORTS_W Ptr<LineSegmentDetector> createLineSegmentDetector( 1040 int _refine = LSD_REFINE_STD, double _scale = 0.8, 1041 double _sigma_scale = 0.6, double _quant = 2.0, double _ang_th = 22.5, 1042 double _log_eps = 0, double _density_th = 0.7, int _n_bins = 1024); 1043 1044 //! @} imgproc_feature 1045 1046 //! @addtogroup imgproc_filter 1047 //! @{ 1048 1049 /** @brief Returns Gaussian filter coefficients. 1050 1051 The function computes and returns the \f$\texttt{ksize} \times 1\f$ matrix of Gaussian filter 1052 coefficients: 1053 1054 \f[G_i= \alpha *e^{-(i-( \texttt{ksize} -1)/2)^2/(2* \texttt{sigma}^2)},\f] 1055 1056 where \f$i=0..\texttt{ksize}-1\f$ and \f$\alpha\f$ is the scale factor chosen so that \f$\sum_i G_i=1\f$. 1057 1058 Two of such generated kernels can be passed to sepFilter2D. Those functions automatically recognize 1059 smoothing kernels (a symmetrical kernel with sum of weights equal to 1) and handle them accordingly. 1060 You may also use the higher-level GaussianBlur. 1061 @param ksize Aperture size. It should be odd ( \f$\texttt{ksize} \mod 2 = 1\f$ ) and positive. 1062 @param sigma Gaussian standard deviation. If it is non-positive, it is computed from ksize as 1063 `sigma = 0.3\*((ksize-1)\*0.5 - 1) + 0.8`. 1064 @param ktype Type of filter coefficients. It can be CV_32F or CV_64F . 1065 @sa sepFilter2D, getDerivKernels, getStructuringElement, GaussianBlur 1066 */ 1067 CV_EXPORTS_W Mat getGaussianKernel( int ksize, double sigma, int ktype = CV_64F ); 1068 1069 /** @brief Returns filter coefficients for computing spatial image derivatives. 1070 1071 The function computes and returns the filter coefficients for spatial image derivatives. When 1072 `ksize=CV_SCHARR`, the Scharr \f$3 \times 3\f$ kernels are generated (see cv::Scharr). Otherwise, Sobel 1073 kernels are generated (see cv::Sobel). The filters are normally passed to sepFilter2D or to 1074 1075 @param kx Output matrix of row filter coefficients. It has the type ktype . 1076 @param ky Output matrix of column filter coefficients. It has the type ktype . 1077 @param dx Derivative order in respect of x. 1078 @param dy Derivative order in respect of y. 1079 @param ksize Aperture size. It can be CV_SCHARR, 1, 3, 5, or 7. 1080 @param normalize Flag indicating whether to normalize (scale down) the filter coefficients or not. 1081 Theoretically, the coefficients should have the denominator \f$=2^{ksize*2-dx-dy-2}\f$. If you are 1082 going to filter floating-point images, you are likely to use the normalized kernels. But if you 1083 compute derivatives of an 8-bit image, store the results in a 16-bit image, and wish to preserve 1084 all the fractional bits, you may want to set normalize=false . 1085 @param ktype Type of filter coefficients. It can be CV_32f or CV_64F . 1086 */ 1087 CV_EXPORTS_W void getDerivKernels( OutputArray kx, OutputArray ky, 1088 int dx, int dy, int ksize, 1089 bool normalize = false, int ktype = CV_32F ); 1090 1091 /** @brief Returns Gabor filter coefficients. 1092 1093 For more details about gabor filter equations and parameters, see: [Gabor 1094 Filter](http://en.wikipedia.org/wiki/Gabor_filter). 1095 1096 @param ksize Size of the filter returned. 1097 @param sigma Standard deviation of the gaussian envelope. 1098 @param theta Orientation of the normal to the parallel stripes of a Gabor function. 1099 @param lambd Wavelength of the sinusoidal factor. 1100 @param gamma Spatial aspect ratio. 1101 @param psi Phase offset. 1102 @param ktype Type of filter coefficients. It can be CV_32F or CV_64F . 1103 */ 1104 CV_EXPORTS_W Mat getGaborKernel( Size ksize, double sigma, double theta, double lambd, 1105 double gamma, double psi = CV_PI*0.5, int ktype = CV_64F ); 1106 1107 //! returns "magic" border value for erosion and dilation. It is automatically transformed to Scalar::all(-DBL_MAX) for dilation. 1108 static inline Scalar morphologyDefaultBorderValue() { return Scalar::all(DBL_MAX); } 1109 1110 /** @brief Returns a structuring element of the specified size and shape for morphological operations. 1111 1112 The function constructs and returns the structuring element that can be further passed to cv::erode, 1113 cv::dilate or cv::morphologyEx. But you can also construct an arbitrary binary mask yourself and use it as 1114 the structuring element. 1115 1116 @param shape Element shape that could be one of cv::MorphShapes 1117 @param ksize Size of the structuring element. 1118 @param anchor Anchor position within the element. The default value \f$(-1, -1)\f$ means that the 1119 anchor is at the center. Note that only the shape of a cross-shaped element depends on the anchor 1120 position. In other cases the anchor just regulates how much the result of the morphological 1121 operation is shifted. 1122 */ 1123 CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1)); 1124 1125 /** @brief Blurs an image using the median filter. 1126 1127 The function smoothes an image using the median filter with the \f$\texttt{ksize} \times 1128 \texttt{ksize}\f$ aperture. Each channel of a multi-channel image is processed independently. 1129 In-place operation is supported. 1130 1131 @param src input 1-, 3-, or 4-channel image; when ksize is 3 or 5, the image depth should be 1132 CV_8U, CV_16U, or CV_32F, for larger aperture sizes, it can only be CV_8U. 1133 @param dst destination array of the same size and type as src. 1134 @param ksize aperture linear size; it must be odd and greater than 1, for example: 3, 5, 7 ... 1135 @sa bilateralFilter, blur, boxFilter, GaussianBlur 1136 */ 1137 CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize ); 1138 1139 /** @brief Blurs an image using a Gaussian filter. 1140 1141 The function convolves the source image with the specified Gaussian kernel. In-place filtering is 1142 supported. 1143 1144 @param src input image; the image can have any number of channels, which are processed 1145 independently, but the depth should be CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. 1146 @param dst output image of the same size and type as src. 1147 @param ksize Gaussian kernel size. ksize.width and ksize.height can differ but they both must be 1148 positive and odd. Or, they can be zero's and then they are computed from sigma. 1149 @param sigmaX Gaussian kernel standard deviation in X direction. 1150 @param sigmaY Gaussian kernel standard deviation in Y direction; if sigmaY is zero, it is set to be 1151 equal to sigmaX, if both sigmas are zeros, they are computed from ksize.width and ksize.height, 1152 respectively (see cv::getGaussianKernel for details); to fully control the result regardless of 1153 possible future modifications of all this semantics, it is recommended to specify all of ksize, 1154 sigmaX, and sigmaY. 1155 @param borderType pixel extrapolation method, see cv::BorderTypes 1156 1157 @sa sepFilter2D, filter2D, blur, boxFilter, bilateralFilter, medianBlur 1158 */ 1159 CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize, 1160 double sigmaX, double sigmaY = 0, 1161 int borderType = BORDER_DEFAULT ); 1162 1163 /** @brief Applies the bilateral filter to an image. 1164 1165 The function applies bilateral filtering to the input image, as described in 1166 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 1167 bilateralFilter can reduce unwanted noise very well while keeping edges fairly sharp. However, it is 1168 very slow compared to most filters. 1169 1170 _Sigma values_: For simplicity, you can set the 2 sigma values to be the same. If they are small (\< 1171 10), the filter will not have much effect, whereas if they are large (\> 150), they will have a very 1172 strong effect, making the image look "cartoonish". 1173 1174 _Filter size_: Large filters (d \> 5) are very slow, so it is recommended to use d=5 for real-time 1175 applications, and perhaps d=9 for offline applications that need heavy noise filtering. 1176 1177 This filter does not work inplace. 1178 @param src Source 8-bit or floating-point, 1-channel or 3-channel image. 1179 @param dst Destination image of the same size and type as src . 1180 @param d Diameter of each pixel neighborhood that is used during filtering. If it is non-positive, 1181 it is computed from sigmaSpace. 1182 @param sigmaColor Filter sigma in the color space. A larger value of the parameter means that 1183 farther colors within the pixel neighborhood (see sigmaSpace) will be mixed together, resulting 1184 in larger areas of semi-equal color. 1185 @param sigmaSpace Filter sigma in the coordinate space. A larger value of the parameter means that 1186 farther pixels will influence each other as long as their colors are close enough (see sigmaColor 1187 ). When d\>0, it specifies the neighborhood size regardless of sigmaSpace. Otherwise, d is 1188 proportional to sigmaSpace. 1189 @param borderType border mode used to extrapolate pixels outside of the image, see cv::BorderTypes 1190 */ 1191 CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d, 1192 double sigmaColor, double sigmaSpace, 1193 int borderType = BORDER_DEFAULT ); 1194 1195 /** @brief Blurs an image using the box filter. 1196 1197 The function smoothes an image using the kernel: 1198 1199 \f[\texttt{K} = \alpha \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \end{bmatrix}\f] 1200 1201 where 1202 1203 \f[\alpha = \fork{\frac{1}{\texttt{ksize.width*ksize.height}}}{when \texttt{normalize=true}}{1}{otherwise}\f] 1204 1205 Unnormalized box filter is useful for computing various integral characteristics over each pixel 1206 neighborhood, such as covariance matrices of image derivatives (used in dense optical flow 1207 algorithms, and so on). If you need to compute pixel sums over variable-size windows, use cv::integral. 1208 1209 @param src input image. 1210 @param dst output image of the same size and type as src. 1211 @param ddepth the output image depth (-1 to use src.depth()). 1212 @param ksize blurring kernel size. 1213 @param anchor anchor point; default value Point(-1,-1) means that the anchor is at the kernel 1214 center. 1215 @param normalize flag, specifying whether the kernel is normalized by its area or not. 1216 @param borderType border mode used to extrapolate pixels outside of the image, see cv::BorderTypes 1217 @sa blur, bilateralFilter, GaussianBlur, medianBlur, integral 1218 */ 1219 CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth, 1220 Size ksize, Point anchor = Point(-1,-1), 1221 bool normalize = true, 1222 int borderType = BORDER_DEFAULT ); 1223 1224 /** @brief Calculates the normalized sum of squares of the pixel values overlapping the filter. 1225 1226 For every pixel \f$ (x, y) \f$ in the source image, the function calculates the sum of squares of those neighboring 1227 pixel values which overlap the filter placed over the pixel \f$ (x, y) \f$. 1228 1229 The unnormalized square box filter can be useful in computing local image statistics such as the the local 1230 variance and standard deviation around the neighborhood of a pixel. 1231 1232 @param _src input image 1233 @param _dst output image of the same size and type as _src 1234 @param ddepth the output image depth (-1 to use src.depth()) 1235 @param ksize kernel size 1236 @param anchor kernel anchor point. The default value of Point(-1, -1) denotes that the anchor is at the kernel 1237 center. 1238 @param normalize flag, specifying whether the kernel is to be normalized by it's area or not. 1239 @param borderType border mode used to extrapolate pixels outside of the image, see cv::BorderTypes 1240 @sa boxFilter 1241 */ 1242 CV_EXPORTS_W void sqrBoxFilter( InputArray _src, OutputArray _dst, int ddepth, 1243 Size ksize, Point anchor = Point(-1, -1), 1244 bool normalize = true, 1245 int borderType = BORDER_DEFAULT ); 1246 1247 /** @brief Blurs an image using the normalized box filter. 1248 1249 The function smoothes an image using the kernel: 1250 1251 \f[\texttt{K} = \frac{1}{\texttt{ksize.width*ksize.height}} \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \end{bmatrix}\f] 1252 1253 The call `blur(src, dst, ksize, anchor, borderType)` is equivalent to `boxFilter(src, dst, src.type(), 1254 anchor, true, borderType)`. 1255 1256 @param src input image; it can have any number of channels, which are processed independently, but 1257 the depth should be CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. 1258 @param dst output image of the same size and type as src. 1259 @param ksize blurring kernel size. 1260 @param anchor anchor point; default value Point(-1,-1) means that the anchor is at the kernel 1261 center. 1262 @param borderType border mode used to extrapolate pixels outside of the image, see cv::BorderTypes 1263 @sa boxFilter, bilateralFilter, GaussianBlur, medianBlur 1264 */ 1265 CV_EXPORTS_W void blur( InputArray src, OutputArray dst, 1266 Size ksize, Point anchor = Point(-1,-1), 1267 int borderType = BORDER_DEFAULT ); 1268 1269 /** @brief Convolves an image with the kernel. 1270 1271 The function applies an arbitrary linear filter to an image. In-place operation is supported. When 1272 the aperture is partially outside the image, the function interpolates outlier pixel values 1273 according to the specified border mode. 1274 1275 The function does actually compute correlation, not the convolution: 1276 1277 \f[\texttt{dst} (x,y) = \sum _{ \stackrel{0\leq x' < \texttt{kernel.cols},}{0\leq y' < \texttt{kernel.rows}} } \texttt{kernel} (x',y')* \texttt{src} (x+x'- \texttt{anchor.x} ,y+y'- \texttt{anchor.y} )\f] 1278 1279 That is, the kernel is not mirrored around the anchor point. If you need a real convolution, flip 1280 the kernel using cv::flip and set the new anchor to `(kernel.cols - anchor.x - 1, kernel.rows - 1281 anchor.y - 1)`. 1282 1283 The function uses the DFT-based algorithm in case of sufficiently large kernels (~`11 x 11` or 1284 larger) and the direct algorithm for small kernels. 1285 1286 @param src input image. 1287 @param dst output image of the same size and the same number of channels as src. 1288 @param ddepth desired depth of the destination image, see @ref filter_depths "combinations" 1289 @param kernel convolution kernel (or rather a correlation kernel), a single-channel floating point 1290 matrix; if you want to apply different kernels to different channels, split the image into 1291 separate color planes using split and process them individually. 1292 @param anchor anchor of the kernel that indicates the relative position of a filtered point within 1293 the kernel; the anchor should lie within the kernel; default value (-1,-1) means that the anchor 1294 is at the kernel center. 1295 @param delta optional value added to the filtered pixels before storing them in dst. 1296 @param borderType pixel extrapolation method, see cv::BorderTypes 1297 @sa sepFilter2D, dft, matchTemplate 1298 */ 1299 CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth, 1300 InputArray kernel, Point anchor = Point(-1,-1), 1301 double delta = 0, int borderType = BORDER_DEFAULT ); 1302 1303 /** @brief Applies a separable linear filter to an image. 1304 1305 The function applies a separable linear filter to the image. That is, first, every row of src is 1306 filtered with the 1D kernel kernelX. Then, every column of the result is filtered with the 1D 1307 kernel kernelY. The final result shifted by delta is stored in dst . 1308 1309 @param src Source image. 1310 @param dst Destination image of the same size and the same number of channels as src . 1311 @param ddepth Destination image depth, see @ref filter_depths "combinations" 1312 @param kernelX Coefficients for filtering each row. 1313 @param kernelY Coefficients for filtering each column. 1314 @param anchor Anchor position within the kernel. The default value \f$(-1,-1)\f$ means that the anchor 1315 is at the kernel center. 1316 @param delta Value added to the filtered results before storing them. 1317 @param borderType Pixel extrapolation method, see cv::BorderTypes 1318 @sa filter2D, Sobel, GaussianBlur, boxFilter, blur 1319 */ 1320 CV_EXPORTS_W void sepFilter2D( InputArray src, OutputArray dst, int ddepth, 1321 InputArray kernelX, InputArray kernelY, 1322 Point anchor = Point(-1,-1), 1323 double delta = 0, int borderType = BORDER_DEFAULT ); 1324 1325 /** @brief Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. 1326 1327 In all cases except one, the \f$\texttt{ksize} \times \texttt{ksize}\f$ separable kernel is used to 1328 calculate the derivative. When \f$\texttt{ksize = 1}\f$, the \f$3 \times 1\f$ or \f$1 \times 3\f$ 1329 kernel is used (that is, no Gaussian smoothing is done). `ksize = 1` can only be used for the first 1330 or the second x- or y- derivatives. 1331 1332 There is also the special value `ksize = CV_SCHARR (-1)` that corresponds to the \f$3\times3\f$ Scharr 1333 filter that may give more accurate results than the \f$3\times3\f$ Sobel. The Scharr aperture is 1334 1335 \f[\vecthreethree{-3}{0}{3}{-10}{0}{10}{-3}{0}{3}\f] 1336 1337 for the x-derivative, or transposed for the y-derivative. 1338 1339 The function calculates an image derivative by convolving the image with the appropriate kernel: 1340 1341 \f[\texttt{dst} = \frac{\partial^{xorder+yorder} \texttt{src}}{\partial x^{xorder} \partial y^{yorder}}\f] 1342 1343 The Sobel operators combine Gaussian smoothing and differentiation, so the result is more or less 1344 resistant to the noise. Most often, the function is called with ( xorder = 1, yorder = 0, ksize = 3) 1345 or ( xorder = 0, yorder = 1, ksize = 3) to calculate the first x- or y- image derivative. The first 1346 case corresponds to a kernel of: 1347 1348 \f[\vecthreethree{-1}{0}{1}{-2}{0}{2}{-1}{0}{1}\f] 1349 1350 The second case corresponds to a kernel of: 1351 1352 \f[\vecthreethree{-1}{-2}{-1}{0}{0}{0}{1}{2}{1}\f] 1353 1354 @param src input image. 1355 @param dst output image of the same size and the same number of channels as src . 1356 @param ddepth output image depth, see @ref filter_depths "combinations"; in the case of 1357 8-bit input images it will result in truncated derivatives. 1358 @param dx order of the derivative x. 1359 @param dy order of the derivative y. 1360 @param ksize size of the extended Sobel kernel; it must be 1, 3, 5, or 7. 1361 @param scale optional scale factor for the computed derivative values; by default, no scaling is 1362 applied (see cv::getDerivKernels for details). 1363 @param delta optional delta value that is added to the results prior to storing them in dst. 1364 @param borderType pixel extrapolation method, see cv::BorderTypes 1365 @sa Scharr, Laplacian, sepFilter2D, filter2D, GaussianBlur, cartToPolar 1366 */ 1367 CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth, 1368 int dx, int dy, int ksize = 3, 1369 double scale = 1, double delta = 0, 1370 int borderType = BORDER_DEFAULT ); 1371 1372 /** @brief Calculates the first x- or y- image derivative using Scharr operator. 1373 1374 The function computes the first x- or y- spatial image derivative using the Scharr operator. The 1375 call 1376 1377 \f[\texttt{Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType)}\f] 1378 1379 is equivalent to 1380 1381 \f[\texttt{Sobel(src, dst, ddepth, dx, dy, CV\_SCHARR, scale, delta, borderType)} .\f] 1382 1383 @param src input image. 1384 @param dst output image of the same size and the same number of channels as src. 1385 @param ddepth output image depth, see @ref filter_depths "combinations" 1386 @param dx order of the derivative x. 1387 @param dy order of the derivative y. 1388 @param scale optional scale factor for the computed derivative values; by default, no scaling is 1389 applied (see getDerivKernels for details). 1390 @param delta optional delta value that is added to the results prior to storing them in dst. 1391 @param borderType pixel extrapolation method, see cv::BorderTypes 1392 @sa cartToPolar 1393 */ 1394 CV_EXPORTS_W void Scharr( InputArray src, OutputArray dst, int ddepth, 1395 int dx, int dy, double scale = 1, double delta = 0, 1396 int borderType = BORDER_DEFAULT ); 1397 1398 /** @example laplace.cpp 1399 An example using Laplace transformations for edge detection 1400 */ 1401 1402 /** @brief Calculates the Laplacian of an image. 1403 1404 The function calculates the Laplacian of the source image by adding up the second x and y 1405 derivatives calculated using the Sobel operator: 1406 1407 \f[\texttt{dst} = \Delta \texttt{src} = \frac{\partial^2 \texttt{src}}{\partial x^2} + \frac{\partial^2 \texttt{src}}{\partial y^2}\f] 1408 1409 This is done when `ksize > 1`. When `ksize == 1`, the Laplacian is computed by filtering the image 1410 with the following \f$3 \times 3\f$ aperture: 1411 1412 \f[\vecthreethree {0}{1}{0}{1}{-4}{1}{0}{1}{0}\f] 1413 1414 @param src Source image. 1415 @param dst Destination image of the same size and the same number of channels as src . 1416 @param ddepth Desired depth of the destination image. 1417 @param ksize Aperture size used to compute the second-derivative filters. See getDerivKernels for 1418 details. The size must be positive and odd. 1419 @param scale Optional scale factor for the computed Laplacian values. By default, no scaling is 1420 applied. See getDerivKernels for details. 1421 @param delta Optional delta value that is added to the results prior to storing them in dst . 1422 @param borderType Pixel extrapolation method, see cv::BorderTypes 1423 @sa Sobel, Scharr 1424 */ 1425 CV_EXPORTS_W void Laplacian( InputArray src, OutputArray dst, int ddepth, 1426 int ksize = 1, double scale = 1, double delta = 0, 1427 int borderType = BORDER_DEFAULT ); 1428 1429 //! @} imgproc_filter 1430 1431 //! @addtogroup imgproc_feature 1432 //! @{ 1433 1434 /** @example edge.cpp 1435 An example on using the canny edge detector 1436 */ 1437 1438 /** @brief Finds edges in an image using the Canny algorithm @cite Canny86 . 1439 1440 The function finds edges in the input image image and marks them in the output map edges using the 1441 Canny algorithm. The smallest value between threshold1 and threshold2 is used for edge linking. The 1442 largest value is used to find initial segments of strong edges. See 1443 <http://en.wikipedia.org/wiki/Canny_edge_detector> 1444 1445 @param image 8-bit input image. 1446 @param edges output edge map; single channels 8-bit image, which has the same size as image . 1447 @param threshold1 first threshold for the hysteresis procedure. 1448 @param threshold2 second threshold for the hysteresis procedure. 1449 @param apertureSize aperture size for the Sobel operator. 1450 @param L2gradient a flag, indicating whether a more accurate \f$L_2\f$ norm 1451 \f$=\sqrt{(dI/dx)^2 + (dI/dy)^2}\f$ should be used to calculate the image gradient magnitude ( 1452 L2gradient=true ), or whether the default \f$L_1\f$ norm \f$=|dI/dx|+|dI/dy|\f$ is enough ( 1453 L2gradient=false ). 1454 */ 1455 CV_EXPORTS_W void Canny( InputArray image, OutputArray edges, 1456 double threshold1, double threshold2, 1457 int apertureSize = 3, bool L2gradient = false ); 1458 1459 /** @brief Calculates the minimal eigenvalue of gradient matrices for corner detection. 1460 1461 The function is similar to cornerEigenValsAndVecs but it calculates and stores only the minimal 1462 eigenvalue of the covariance matrix of derivatives, that is, \f$\min(\lambda_1, \lambda_2)\f$ in terms 1463 of the formulae in the cornerEigenValsAndVecs description. 1464 1465 @param src Input single-channel 8-bit or floating-point image. 1466 @param dst Image to store the minimal eigenvalues. It has the type CV_32FC1 and the same size as 1467 src . 1468 @param blockSize Neighborhood size (see the details on cornerEigenValsAndVecs ). 1469 @param ksize Aperture parameter for the Sobel operator. 1470 @param borderType Pixel extrapolation method. See cv::BorderTypes. 1471 */ 1472 CV_EXPORTS_W void cornerMinEigenVal( InputArray src, OutputArray dst, 1473 int blockSize, int ksize = 3, 1474 int borderType = BORDER_DEFAULT ); 1475 1476 /** @brief Harris corner detector. 1477 1478 The function runs the Harris corner detector on the image. Similarly to cornerMinEigenVal and 1479 cornerEigenValsAndVecs , for each pixel \f$(x, y)\f$ it calculates a \f$2\times2\f$ gradient covariance 1480 matrix \f$M^{(x,y)}\f$ over a \f$\texttt{blockSize} \times \texttt{blockSize}\f$ neighborhood. Then, it 1481 computes the following characteristic: 1482 1483 \f[\texttt{dst} (x,y) = \mathrm{det} M^{(x,y)} - k \cdot \left ( \mathrm{tr} M^{(x,y)} \right )^2\f] 1484 1485 Corners in the image can be found as the local maxima of this response map. 1486 1487 @param src Input single-channel 8-bit or floating-point image. 1488 @param dst Image to store the Harris detector responses. It has the type CV_32FC1 and the same 1489 size as src . 1490 @param blockSize Neighborhood size (see the details on cornerEigenValsAndVecs ). 1491 @param ksize Aperture parameter for the Sobel operator. 1492 @param k Harris detector free parameter. See the formula below. 1493 @param borderType Pixel extrapolation method. See cv::BorderTypes. 1494 */ 1495 CV_EXPORTS_W void cornerHarris( InputArray src, OutputArray dst, int blockSize, 1496 int ksize, double k, 1497 int borderType = BORDER_DEFAULT ); 1498 1499 /** @brief Calculates eigenvalues and eigenvectors of image blocks for corner detection. 1500 1501 For every pixel \f$p\f$ , the function cornerEigenValsAndVecs considers a blockSize \f$\times\f$ blockSize 1502 neighborhood \f$S(p)\f$ . It calculates the covariation matrix of derivatives over the neighborhood as: 1503 1504 \f[M = \begin{bmatrix} \sum _{S(p)}(dI/dx)^2 & \sum _{S(p)}dI/dx dI/dy \\ \sum _{S(p)}dI/dx dI/dy & \sum _{S(p)}(dI/dy)^2 \end{bmatrix}\f] 1505 1506 where the derivatives are computed using the Sobel operator. 1507 1508 After that, it finds eigenvectors and eigenvalues of \f$M\f$ and stores them in the destination image as 1509 \f$(\lambda_1, \lambda_2, x_1, y_1, x_2, y_2)\f$ where 1510 1511 - \f$\lambda_1, \lambda_2\f$ are the non-sorted eigenvalues of \f$M\f$ 1512 - \f$x_1, y_1\f$ are the eigenvectors corresponding to \f$\lambda_1\f$ 1513 - \f$x_2, y_2\f$ are the eigenvectors corresponding to \f$\lambda_2\f$ 1514 1515 The output of the function can be used for robust edge or corner detection. 1516 1517 @param src Input single-channel 8-bit or floating-point image. 1518 @param dst Image to store the results. It has the same size as src and the type CV_32FC(6) . 1519 @param blockSize Neighborhood size (see details below). 1520 @param ksize Aperture parameter for the Sobel operator. 1521 @param borderType Pixel extrapolation method. See cv::BorderTypes. 1522 1523 @sa cornerMinEigenVal, cornerHarris, preCornerDetect 1524 */ 1525 CV_EXPORTS_W void cornerEigenValsAndVecs( InputArray src, OutputArray dst, 1526 int blockSize, int ksize, 1527 int borderType = BORDER_DEFAULT ); 1528 1529 /** @brief Calculates a feature map for corner detection. 1530 1531 The function calculates the complex spatial derivative-based function of the source image 1532 1533 \f[\texttt{dst} = (D_x \texttt{src} )^2 \cdot D_{yy} \texttt{src} + (D_y \texttt{src} )^2 \cdot D_{xx} \texttt{src} - 2 D_x \texttt{src} \cdot D_y \texttt{src} \cdot D_{xy} \texttt{src}\f] 1534 1535 where \f$D_x\f$,\f$D_y\f$ are the first image derivatives, \f$D_{xx}\f$,\f$D_{yy}\f$ are the second image 1536 derivatives, and \f$D_{xy}\f$ is the mixed derivative. 1537 1538 The corners can be found as local maximums of the functions, as shown below: 1539 @code 1540 Mat corners, dilated_corners; 1541 preCornerDetect(image, corners, 3); 1542 // dilation with 3x3 rectangular structuring element 1543 dilate(corners, dilated_corners, Mat(), 1); 1544 Mat corner_mask = corners == dilated_corners; 1545 @endcode 1546 1547 @param src Source single-channel 8-bit of floating-point image. 1548 @param dst Output image that has the type CV_32F and the same size as src . 1549 @param ksize %Aperture size of the Sobel . 1550 @param borderType Pixel extrapolation method. See cv::BorderTypes. 1551 */ 1552 CV_EXPORTS_W void preCornerDetect( InputArray src, OutputArray dst, int ksize, 1553 int borderType = BORDER_DEFAULT ); 1554 1555 /** @brief Refines the corner locations. 1556 1557 The function iterates to find the sub-pixel accurate location of corners or radial saddle points, as 1558 shown on the figure below. 1559 1560 ![image](pics/cornersubpix.png) 1561 1562 Sub-pixel accurate corner locator is based on the observation that every vector from the center \f$q\f$ 1563 to a point \f$p\f$ located within a neighborhood of \f$q\f$ is orthogonal to the image gradient at \f$p\f$ 1564 subject to image and measurement noise. Consider the expression: 1565 1566 \f[\epsilon _i = {DI_{p_i}}^T \cdot (q - p_i)\f] 1567 1568 where \f${DI_{p_i}}\f$ is an image gradient at one of the points \f$p_i\f$ in a neighborhood of \f$q\f$ . The 1569 value of \f$q\f$ is to be found so that \f$\epsilon_i\f$ is minimized. A system of equations may be set up 1570 with \f$\epsilon_i\f$ set to zero: 1571 1572 \f[\sum _i(DI_{p_i} \cdot {DI_{p_i}}^T) - \sum _i(DI_{p_i} \cdot {DI_{p_i}}^T \cdot p_i)\f] 1573 1574 where the gradients are summed within a neighborhood ("search window") of \f$q\f$ . Calling the first 1575 gradient term \f$G\f$ and the second gradient term \f$b\f$ gives: 1576 1577 \f[q = G^{-1} \cdot b\f] 1578 1579 The algorithm sets the center of the neighborhood window at this new center \f$q\f$ and then iterates 1580 until the center stays within a set threshold. 1581 1582 @param image Input image. 1583 @param corners Initial coordinates of the input corners and refined coordinates provided for 1584 output. 1585 @param winSize Half of the side length of the search window. For example, if winSize=Size(5,5) , 1586 then a \f$5*2+1 \times 5*2+1 = 11 \times 11\f$ search window is used. 1587 @param zeroZone Half of the size of the dead region in the middle of the search zone over which 1588 the summation in the formula below is not done. It is used sometimes to avoid possible 1589 singularities of the autocorrelation matrix. The value of (-1,-1) indicates that there is no such 1590 a size. 1591 @param criteria Criteria for termination of the iterative process of corner refinement. That is, 1592 the process of corner position refinement stops either after criteria.maxCount iterations or when 1593 the corner position moves by less than criteria.epsilon on some iteration. 1594 */ 1595 CV_EXPORTS_W void cornerSubPix( InputArray image, InputOutputArray corners, 1596 Size winSize, Size zeroZone, 1597 TermCriteria criteria ); 1598 1599 /** @brief Determines strong corners on an image. 1600 1601 The function finds the most prominent corners in the image or in the specified image region, as 1602 described in @cite Shi94 1603 1604 - Function calculates the corner quality measure at every source image pixel using the 1605 cornerMinEigenVal or cornerHarris . 1606 - Function performs a non-maximum suppression (the local maximums in *3 x 3* neighborhood are 1607 retained). 1608 - The corners with the minimal eigenvalue less than 1609 \f$\texttt{qualityLevel} \cdot \max_{x,y} qualityMeasureMap(x,y)\f$ are rejected. 1610 - The remaining corners are sorted by the quality measure in the descending order. 1611 - Function throws away each corner for which there is a stronger corner at a distance less than 1612 maxDistance. 1613 1614 The function can be used to initialize a point-based tracker of an object. 1615 1616 @note If the function is called with different values A and B of the parameter qualityLevel , and 1617 A \> B, the vector of returned corners with qualityLevel=A will be the prefix of the output vector 1618 with qualityLevel=B . 1619 1620 @param image Input 8-bit or floating-point 32-bit, single-channel image. 1621 @param corners Output vector of detected corners. 1622 @param maxCorners Maximum number of corners to return. If there are more corners than are found, 1623 the strongest of them is returned. 1624 @param qualityLevel Parameter characterizing the minimal accepted quality of image corners. The 1625 parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue 1626 (see cornerMinEigenVal ) or the Harris function response (see cornerHarris ). The corners with the 1627 quality measure less than the product are rejected. For example, if the best corner has the 1628 quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure 1629 less than 15 are rejected. 1630 @param minDistance Minimum possible Euclidean distance between the returned corners. 1631 @param mask Optional region of interest. If the image is not empty (it needs to have the type 1632 CV_8UC1 and the same size as image ), it specifies the region in which the corners are detected. 1633 @param blockSize Size of an average block for computing a derivative covariation matrix over each 1634 pixel neighborhood. See cornerEigenValsAndVecs . 1635 @param useHarrisDetector Parameter indicating whether to use a Harris detector (see cornerHarris) 1636 or cornerMinEigenVal. 1637 @param k Free parameter of the Harris detector. 1638 1639 @sa cornerMinEigenVal, cornerHarris, calcOpticalFlowPyrLK, estimateRigidTransform, 1640 */ 1641 CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners, 1642 int maxCorners, double qualityLevel, double minDistance, 1643 InputArray mask = noArray(), int blockSize = 3, 1644 bool useHarrisDetector = false, double k = 0.04 ); 1645 1646 /** @example houghlines.cpp 1647 An example using the Hough line detector 1648 */ 1649 1650 /** @brief Finds lines in a binary image using the standard Hough transform. 1651 1652 The function implements the standard or standard multi-scale Hough transform algorithm for line 1653 detection. See <http://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm> for a good explanation of Hough 1654 transform. 1655 1656 @param image 8-bit, single-channel binary source image. The image may be modified by the function. 1657 @param lines Output vector of lines. Each line is represented by a two-element vector 1658 \f$(\rho, \theta)\f$ . \f$\rho\f$ is the distance from the coordinate origin \f$(0,0)\f$ (top-left corner of 1659 the image). \f$\theta\f$ is the line rotation angle in radians ( 1660 \f$0 \sim \textrm{vertical line}, \pi/2 \sim \textrm{horizontal line}\f$ ). 1661 @param rho Distance resolution of the accumulator in pixels. 1662 @param theta Angle resolution of the accumulator in radians. 1663 @param threshold Accumulator threshold parameter. Only those lines are returned that get enough 1664 votes ( \f$>\texttt{threshold}\f$ ). 1665 @param srn For the multi-scale Hough transform, it is a divisor for the distance resolution rho . 1666 The coarse accumulator distance resolution is rho and the accurate accumulator resolution is 1667 rho/srn . If both srn=0 and stn=0 , the classical Hough transform is used. Otherwise, both these 1668 parameters should be positive. 1669 @param stn For the multi-scale Hough transform, it is a divisor for the distance resolution theta. 1670 @param min_theta For standard and multi-scale Hough transform, minimum angle to check for lines. 1671 Must fall between 0 and max_theta. 1672 @param max_theta For standard and multi-scale Hough transform, maximum angle to check for lines. 1673 Must fall between min_theta and CV_PI. 1674 */ 1675 CV_EXPORTS_W void HoughLines( InputArray image, OutputArray lines, 1676 double rho, double theta, int threshold, 1677 double srn = 0, double stn = 0, 1678 double min_theta = 0, double max_theta = CV_PI ); 1679 1680 /** @brief Finds line segments in a binary image using the probabilistic Hough transform. 1681 1682 The function implements the probabilistic Hough transform algorithm for line detection, described 1683 in @cite Matas00 1684 1685 See the line detection example below: 1686 1687 @code 1688 #include <opencv2/imgproc.hpp> 1689 #include <opencv2/highgui.hpp> 1690 1691 using namespace cv; 1692 1693 int main(int argc, char** argv) 1694 { 1695 Mat src, dst, color_dst; 1696 if( argc != 2 || !(src=imread(argv[1], 0)).data) 1697 return -1; 1698 1699 Canny( src, dst, 50, 200, 3 ); 1700 cvtColor( dst, color_dst, COLOR_GRAY2BGR ); 1701 1702 #if 0 1703 vector<Vec2f> lines; 1704 HoughLines( dst, lines, 1, CV_PI/180, 100 ); 1705 1706 for( size_t i = 0; i < lines.size(); i++ ) 1707 { 1708 float rho = lines[i][0]; 1709 float theta = lines[i][1]; 1710 double a = cos(theta), b = sin(theta); 1711 double x0 = a*rho, y0 = b*rho; 1712 Point pt1(cvRound(x0 + 1000*(-b)), 1713 cvRound(y0 + 1000*(a))); 1714 Point pt2(cvRound(x0 - 1000*(-b)), 1715 cvRound(y0 - 1000*(a))); 1716 line( color_dst, pt1, pt2, Scalar(0,0,255), 3, 8 ); 1717 } 1718 #else 1719 vector<Vec4i> lines; 1720 HoughLinesP( dst, lines, 1, CV_PI/180, 80, 30, 10 ); 1721 for( size_t i = 0; i < lines.size(); i++ ) 1722 { 1723 line( color_dst, Point(lines[i][0], lines[i][1]), 1724 Point(lines[i][2], lines[i][3]), Scalar(0,0,255), 3, 8 ); 1725 } 1726 #endif 1727 namedWindow( "Source", 1 ); 1728 imshow( "Source", src ); 1729 1730 namedWindow( "Detected Lines", 1 ); 1731 imshow( "Detected Lines", color_dst ); 1732 1733 waitKey(0); 1734 return 0; 1735 } 1736 @endcode 1737 This is a sample picture the function parameters have been tuned for: 1738 1739 ![image](pics/building.jpg) 1740 1741 And this is the output of the above program in case of the probabilistic Hough transform: 1742 1743 ![image](pics/houghp.png) 1744 1745 @param image 8-bit, single-channel binary source image. The image may be modified by the function. 1746 @param lines Output vector of lines. Each line is represented by a 4-element vector 1747 \f$(x_1, y_1, x_2, y_2)\f$ , where \f$(x_1,y_1)\f$ and \f$(x_2, y_2)\f$ are the ending points of each detected 1748 line segment. 1749 @param rho Distance resolution of the accumulator in pixels. 1750 @param theta Angle resolution of the accumulator in radians. 1751 @param threshold Accumulator threshold parameter. Only those lines are returned that get enough 1752 votes ( \f$>\texttt{threshold}\f$ ). 1753 @param minLineLength Minimum line length. Line segments shorter than that are rejected. 1754 @param maxLineGap Maximum allowed gap between points on the same line to link them. 1755 1756 @sa LineSegmentDetector 1757 */ 1758 CV_EXPORTS_W void HoughLinesP( InputArray image, OutputArray lines, 1759 double rho, double theta, int threshold, 1760 double minLineLength = 0, double maxLineGap = 0 ); 1761 1762 /** @example houghcircles.cpp 1763 An example using the Hough circle detector 1764 */ 1765 1766 /** @brief Finds circles in a grayscale image using the Hough transform. 1767 1768 The function finds circles in a grayscale image using a modification of the Hough transform. 1769 1770 Example: : 1771 @code 1772 #include <opencv2/imgproc.hpp> 1773 #include <opencv2/highgui.hpp> 1774 #include <math.h> 1775 1776 using namespace cv; 1777 1778 int main(int argc, char** argv) 1779 { 1780 Mat img, gray; 1781 if( argc != 2 && !(img=imread(argv[1], 1)).data) 1782 return -1; 1783 cvtColor(img, gray, COLOR_BGR2GRAY); 1784 // smooth it, otherwise a lot of false circles may be detected 1785 GaussianBlur( gray, gray, Size(9, 9), 2, 2 ); 1786 vector<Vec3f> circles; 1787 HoughCircles(gray, circles, HOUGH_GRADIENT, 1788 2, gray->rows/4, 200, 100 ); 1789 for( size_t i = 0; i < circles.size(); i++ ) 1790 { 1791 Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 1792 int radius = cvRound(circles[i][2]); 1793 // draw the circle center 1794 circle( img, center, 3, Scalar(0,255,0), -1, 8, 0 ); 1795 // draw the circle outline 1796 circle( img, center, radius, Scalar(0,0,255), 3, 8, 0 ); 1797 } 1798 namedWindow( "circles", 1 ); 1799 imshow( "circles", img ); 1800 return 0; 1801 } 1802 @endcode 1803 1804 @note Usually the function detects the centers of circles well. However, it may fail to find correct 1805 radii. You can assist to the function by specifying the radius range ( minRadius and maxRadius ) if 1806 you know it. Or, you may ignore the returned radius, use only the center, and find the correct 1807 radius using an additional procedure. 1808 1809 @param image 8-bit, single-channel, grayscale input image. 1810 @param circles Output vector of found circles. Each vector is encoded as a 3-element 1811 floating-point vector \f$(x, y, radius)\f$ . 1812 @param method Detection method, see cv::HoughModes. Currently, the only implemented method is HOUGH_GRADIENT 1813 @param dp Inverse ratio of the accumulator resolution to the image resolution. For example, if 1814 dp=1 , the accumulator has the same resolution as the input image. If dp=2 , the accumulator has 1815 half as big width and height. 1816 @param minDist Minimum distance between the centers of the detected circles. If the parameter is 1817 too small, multiple neighbor circles may be falsely detected in addition to a true one. If it is 1818 too large, some circles may be missed. 1819 @param param1 First method-specific parameter. In case of CV_HOUGH_GRADIENT , it is the higher 1820 threshold of the two passed to the Canny edge detector (the lower one is twice smaller). 1821 @param param2 Second method-specific parameter. In case of CV_HOUGH_GRADIENT , it is the 1822 accumulator threshold for the circle centers at the detection stage. The smaller it is, the more 1823 false circles may be detected. Circles, corresponding to the larger accumulator values, will be 1824 returned first. 1825 @param minRadius Minimum circle radius. 1826 @param maxRadius Maximum circle radius. 1827 1828 @sa fitEllipse, minEnclosingCircle 1829 */ 1830 CV_EXPORTS_W void HoughCircles( InputArray image, OutputArray circles, 1831 int method, double dp, double minDist, 1832 double param1 = 100, double param2 = 100, 1833 int minRadius = 0, int maxRadius = 0 ); 1834 1835 //! @} imgproc_feature 1836 1837 //! @addtogroup imgproc_filter 1838 //! @{ 1839 1840 /** @example morphology2.cpp 1841 An example using the morphological operations 1842 */ 1843 1844 /** @brief Erodes an image by using a specific structuring element. 1845 1846 The function erodes the source image using the specified structuring element that determines the 1847 shape of a pixel neighborhood over which the minimum is taken: 1848 1849 \f[\texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\f] 1850 1851 The function supports the in-place mode. Erosion can be applied several ( iterations ) times. In 1852 case of multi-channel images, each channel is processed independently. 1853 1854 @param src input image; the number of channels can be arbitrary, but the depth should be one of 1855 CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. 1856 @param dst output image of the same size and type as src. 1857 @param kernel structuring element used for erosion; if `element=Mat()`, a `3 x 3` rectangular 1858 structuring element is used. Kernel can be created using getStructuringElement. 1859 @param anchor position of the anchor within the element; default value (-1, -1) means that the 1860 anchor is at the element center. 1861 @param iterations number of times erosion is applied. 1862 @param borderType pixel extrapolation method, see cv::BorderTypes 1863 @param borderValue border value in case of a constant border 1864 @sa dilate, morphologyEx, getStructuringElement 1865 */ 1866 CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel, 1867 Point anchor = Point(-1,-1), int iterations = 1, 1868 int borderType = BORDER_CONSTANT, 1869 const Scalar& borderValue = morphologyDefaultBorderValue() ); 1870 1871 /** @brief Dilates an image by using a specific structuring element. 1872 1873 The function dilates the source image using the specified structuring element that determines the 1874 shape of a pixel neighborhood over which the maximum is taken: 1875 \f[\texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\f] 1876 1877 The function supports the in-place mode. Dilation can be applied several ( iterations ) times. In 1878 case of multi-channel images, each channel is processed independently. 1879 1880 @param src input image; the number of channels can be arbitrary, but the depth should be one of 1881 CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. 1882 @param dst output image of the same size and type as src\`. 1883 @param kernel structuring element used for dilation; if elemenat=Mat(), a 3 x 3 rectangular 1884 structuring element is used. Kernel can be created using getStructuringElement 1885 @param anchor position of the anchor within the element; default value (-1, -1) means that the 1886 anchor is at the element center. 1887 @param iterations number of times dilation is applied. 1888 @param borderType pixel extrapolation method, see cv::BorderTypes 1889 @param borderValue border value in case of a constant border 1890 @sa erode, morphologyEx, getStructuringElement 1891 */ 1892 CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel, 1893 Point anchor = Point(-1,-1), int iterations = 1, 1894 int borderType = BORDER_CONSTANT, 1895 const Scalar& borderValue = morphologyDefaultBorderValue() ); 1896 1897 /** @brief Performs advanced morphological transformations. 1898 1899 The function can perform advanced morphological transformations using an erosion and dilation as 1900 basic operations. 1901 1902 Any of the operations can be done in-place. In case of multi-channel images, each channel is 1903 processed independently. 1904 1905 @param src Source image. The number of channels can be arbitrary. The depth should be one of 1906 CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. 1907 @param dst Destination image of the same size and type as src\` . 1908 @param kernel Structuring element. It can be created using getStructuringElement. 1909 @param anchor Anchor position with the kernel. Negative values mean that the anchor is at the 1910 kernel center. 1911 @param op Type of a morphological operation, see cv::MorphTypes 1912 @param iterations Number of times erosion and dilation are applied. 1913 @param borderType Pixel extrapolation method, see cv::BorderTypes 1914 @param borderValue Border value in case of a constant border. The default value has a special 1915 meaning. 1916 @sa dilate, erode, getStructuringElement 1917 */ 1918 CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst, 1919 int op, InputArray kernel, 1920 Point anchor = Point(-1,-1), int iterations = 1, 1921 int borderType = BORDER_CONSTANT, 1922 const Scalar& borderValue = morphologyDefaultBorderValue() ); 1923 1924 //! @} imgproc_filter 1925 1926 //! @addtogroup imgproc_transform 1927 //! @{ 1928 1929 /** @brief Resizes an image. 1930 1931 The function resize resizes the image src down to or up to the specified size. Note that the 1932 initial dst type or size are not taken into account. Instead, the size and type are derived from 1933 the `src`,`dsize`,`fx`, and `fy`. If you want to resize src so that it fits the pre-created dst, 1934 you may call the function as follows: 1935 @code 1936 // explicitly specify dsize=dst.size(); fx and fy will be computed from that. 1937 resize(src, dst, dst.size(), 0, 0, interpolation); 1938 @endcode 1939 If you want to decimate the image by factor of 2 in each direction, you can call the function this 1940 way: 1941 @code 1942 // specify fx and fy and let the function compute the destination image size. 1943 resize(src, dst, Size(), 0.5, 0.5, interpolation); 1944 @endcode 1945 To shrink an image, it will generally look best with CV_INTER_AREA interpolation, whereas to 1946 enlarge an image, it will generally look best with CV_INTER_CUBIC (slow) or CV_INTER_LINEAR 1947 (faster but still looks OK). 1948 1949 @param src input image. 1950 @param dst output image; it has the size dsize (when it is non-zero) or the size computed from 1951 src.size(), fx, and fy; the type of dst is the same as of src. 1952 @param dsize output image size; if it equals zero, it is computed as: 1953 \f[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}\f] 1954 Either dsize or both fx and fy must be non-zero. 1955 @param fx scale factor along the horizontal axis; when it equals 0, it is computed as 1956 \f[\texttt{(double)dsize.width/src.cols}\f] 1957 @param fy scale factor along the vertical axis; when it equals 0, it is computed as 1958 \f[\texttt{(double)dsize.height/src.rows}\f] 1959 @param interpolation interpolation method, see cv::InterpolationFlags 1960 1961 @sa warpAffine, warpPerspective, remap 1962 */ 1963 CV_EXPORTS_W void resize( InputArray src, OutputArray dst, 1964 Size dsize, double fx = 0, double fy = 0, 1965 int interpolation = INTER_LINEAR ); 1966 1967 /** @brief Applies an affine transformation to an image. 1968 1969 The function warpAffine transforms the source image using the specified matrix: 1970 1971 \f[\texttt{dst} (x,y) = \texttt{src} ( \texttt{M} _{11} x + \texttt{M} _{12} y + \texttt{M} _{13}, \texttt{M} _{21} x + \texttt{M} _{22} y + \texttt{M} _{23})\f] 1972 1973 when the flag WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted 1974 with cv::invertAffineTransform and then put in the formula above instead of M. The function cannot 1975 operate in-place. 1976 1977 @param src input image. 1978 @param dst output image that has the size dsize and the same type as src . 1979 @param M \f$2\times 3\f$ transformation matrix. 1980 @param dsize size of the output image. 1981 @param flags combination of interpolation methods (see cv::InterpolationFlags) and the optional 1982 flag WARP_INVERSE_MAP that means that M is the inverse transformation ( 1983 \f$\texttt{dst}\rightarrow\texttt{src}\f$ ). 1984 @param borderMode pixel extrapolation method (see cv::BorderTypes); when 1985 borderMode=BORDER_TRANSPARENT, it means that the pixels in the destination image corresponding to 1986 the "outliers" in the source image are not modified by the function. 1987 @param borderValue value used in case of a constant border; by default, it is 0. 1988 1989 @sa warpPerspective, resize, remap, getRectSubPix, transform 1990 */ 1991 CV_EXPORTS_W void warpAffine( InputArray src, OutputArray dst, 1992 InputArray M, Size dsize, 1993 int flags = INTER_LINEAR, 1994 int borderMode = BORDER_CONSTANT, 1995 const Scalar& borderValue = Scalar()); 1996 1997 /** @brief Applies a perspective transformation to an image. 1998 1999 The function warpPerspective transforms the source image using the specified matrix: 2000 2001 \f[\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , 2002 \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right )\f] 2003 2004 when the flag WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted with invert 2005 and then put in the formula above instead of M. The function cannot operate in-place. 2006 2007 @param src input image. 2008 @param dst output image that has the size dsize and the same type as src . 2009 @param M \f$3\times 3\f$ transformation matrix. 2010 @param dsize size of the output image. 2011 @param flags combination of interpolation methods (INTER_LINEAR or INTER_NEAREST) and the 2012 optional flag WARP_INVERSE_MAP, that sets M as the inverse transformation ( 2013 \f$\texttt{dst}\rightarrow\texttt{src}\f$ ). 2014 @param borderMode pixel extrapolation method (BORDER_CONSTANT or BORDER_REPLICATE). 2015 @param borderValue value used in case of a constant border; by default, it equals 0. 2016 2017 @sa warpAffine, resize, remap, getRectSubPix, perspectiveTransform 2018 */ 2019 CV_EXPORTS_W void warpPerspective( InputArray src, OutputArray dst, 2020 InputArray M, Size dsize, 2021 int flags = INTER_LINEAR, 2022 int borderMode = BORDER_CONSTANT, 2023 const Scalar& borderValue = Scalar()); 2024 2025 /** @brief Applies a generic geometrical transformation to an image. 2026 2027 The function remap transforms the source image using the specified map: 2028 2029 \f[\texttt{dst} (x,y) = \texttt{src} (map_x(x,y),map_y(x,y))\f] 2030 2031 where values of pixels with non-integer coordinates are computed using one of available 2032 interpolation methods. \f$map_x\f$ and \f$map_y\f$ can be encoded as separate floating-point maps 2033 in \f$map_1\f$ and \f$map_2\f$ respectively, or interleaved floating-point maps of \f$(x,y)\f$ in 2034 \f$map_1\f$, or fixed-point maps created by using convertMaps. The reason you might want to 2035 convert from floating to fixed-point representations of a map is that they can yield much faster 2036 (\~2x) remapping operations. In the converted case, \f$map_1\f$ contains pairs (cvFloor(x), 2037 cvFloor(y)) and \f$map_2\f$ contains indices in a table of interpolation coefficients. 2038 2039 This function cannot operate in-place. 2040 2041 @param src Source image. 2042 @param dst Destination image. It has the same size as map1 and the same type as src . 2043 @param map1 The first map of either (x,y) points or just x values having the type CV_16SC2 , 2044 CV_32FC1, or CV_32FC2. See convertMaps for details on converting a floating point 2045 representation to fixed-point for speed. 2046 @param map2 The second map of y values having the type CV_16UC1, CV_32FC1, or none (empty map 2047 if map1 is (x,y) points), respectively. 2048 @param interpolation Interpolation method (see cv::InterpolationFlags). The method INTER_AREA is 2049 not supported by this function. 2050 @param borderMode Pixel extrapolation method (see cv::BorderTypes). When 2051 borderMode=BORDER_TRANSPARENT, it means that the pixels in the destination image that 2052 corresponds to the "outliers" in the source image are not modified by the function. 2053 @param borderValue Value used in case of a constant border. By default, it is 0. 2054 */ 2055 CV_EXPORTS_W void remap( InputArray src, OutputArray dst, 2056 InputArray map1, InputArray map2, 2057 int interpolation, int borderMode = BORDER_CONSTANT, 2058 const Scalar& borderValue = Scalar()); 2059 2060 /** @brief Converts image transformation maps from one representation to another. 2061 2062 The function converts a pair of maps for remap from one representation to another. The following 2063 options ( (map1.type(), map2.type()) \f$\rightarrow\f$ (dstmap1.type(), dstmap2.type()) ) are 2064 supported: 2065 2066 - \f$\texttt{(CV\_32FC1, CV\_32FC1)} \rightarrow \texttt{(CV\_16SC2, CV\_16UC1)}\f$. This is the 2067 most frequently used conversion operation, in which the original floating-point maps (see remap ) 2068 are converted to a more compact and much faster fixed-point representation. The first output array 2069 contains the rounded coordinates and the second array (created only when nninterpolation=false ) 2070 contains indices in the interpolation tables. 2071 2072 - \f$\texttt{(CV\_32FC2)} \rightarrow \texttt{(CV\_16SC2, CV\_16UC1)}\f$. The same as above but 2073 the original maps are stored in one 2-channel matrix. 2074 2075 - Reverse conversion. Obviously, the reconstructed floating-point maps will not be exactly the same 2076 as the originals. 2077 2078 @param map1 The first input map of type CV_16SC2, CV_32FC1, or CV_32FC2 . 2079 @param map2 The second input map of type CV_16UC1, CV_32FC1, or none (empty matrix), 2080 respectively. 2081 @param dstmap1 The first output map that has the type dstmap1type and the same size as src . 2082 @param dstmap2 The second output map. 2083 @param dstmap1type Type of the first output map that should be CV_16SC2, CV_32FC1, or 2084 CV_32FC2 . 2085 @param nninterpolation Flag indicating whether the fixed-point maps are used for the 2086 nearest-neighbor or for a more complex interpolation. 2087 2088 @sa remap, undistort, initUndistortRectifyMap 2089 */ 2090 CV_EXPORTS_W void convertMaps( InputArray map1, InputArray map2, 2091 OutputArray dstmap1, OutputArray dstmap2, 2092 int dstmap1type, bool nninterpolation = false ); 2093 2094 /** @brief Calculates an affine matrix of 2D rotation. 2095 2096 The function calculates the following matrix: 2097 2098 \f[\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot \texttt{center.x} - \beta \cdot \texttt{center.y} \\ - \beta & \alpha & \beta \cdot \texttt{center.x} + (1- \alpha ) \cdot \texttt{center.y} \end{bmatrix}\f] 2099 2100 where 2101 2102 \f[\begin{array}{l} \alpha = \texttt{scale} \cdot \cos \texttt{angle} , \\ \beta = \texttt{scale} \cdot \sin \texttt{angle} \end{array}\f] 2103 2104 The transformation maps the rotation center to itself. If this is not the target, adjust the shift. 2105 2106 @param center Center of the rotation in the source image. 2107 @param angle Rotation angle in degrees. Positive values mean counter-clockwise rotation (the 2108 coordinate origin is assumed to be the top-left corner). 2109 @param scale Isotropic scale factor. 2110 2111 @sa getAffineTransform, warpAffine, transform 2112 */ 2113 CV_EXPORTS_W Mat getRotationMatrix2D( Point2f center, double angle, double scale ); 2114 2115 //! returns 3x3 perspective transformation for the corresponding 4 point pairs. 2116 CV_EXPORTS Mat getPerspectiveTransform( const Point2f src[], const Point2f dst[] ); 2117 2118 /** @brief Calculates an affine transform from three pairs of the corresponding points. 2119 2120 The function calculates the \f$2 \times 3\f$ matrix of an affine transform so that: 2121 2122 \f[\begin{bmatrix} x'_i \\ y'_i \end{bmatrix} = \texttt{map\_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\f] 2123 2124 where 2125 2126 \f[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2\f] 2127 2128 @param src Coordinates of triangle vertices in the source image. 2129 @param dst Coordinates of the corresponding triangle vertices in the destination image. 2130 2131 @sa warpAffine, transform 2132 */ 2133 CV_EXPORTS Mat getAffineTransform( const Point2f src[], const Point2f dst[] ); 2134 2135 /** @brief Inverts an affine transformation. 2136 2137 The function computes an inverse affine transformation represented by \f$2 \times 3\f$ matrix M: 2138 2139 \f[\begin{bmatrix} a_{11} & a_{12} & b_1 \\ a_{21} & a_{22} & b_2 \end{bmatrix}\f] 2140 2141 The result is also a \f$2 \times 3\f$ matrix of the same type as M. 2142 2143 @param M Original affine transformation. 2144 @param iM Output reverse affine transformation. 2145 */ 2146 CV_EXPORTS_W void invertAffineTransform( InputArray M, OutputArray iM ); 2147 2148 /** @brief Calculates a perspective transform from four pairs of the corresponding points. 2149 2150 The function calculates the \f$3 \times 3\f$ matrix of a perspective transform so that: 2151 2152 \f[\begin{bmatrix} t_i x'_i \\ t_i y'_i \\ t_i \end{bmatrix} = \texttt{map\_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\f] 2153 2154 where 2155 2156 \f[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2,3\f] 2157 2158 @param src Coordinates of quadrangle vertices in the source image. 2159 @param dst Coordinates of the corresponding quadrangle vertices in the destination image. 2160 2161 @sa findHomography, warpPerspective, perspectiveTransform 2162 */ 2163 CV_EXPORTS_W Mat getPerspectiveTransform( InputArray src, InputArray dst ); 2164 2165 CV_EXPORTS_W Mat getAffineTransform( InputArray src, InputArray dst ); 2166 2167 /** @brief Retrieves a pixel rectangle from an image with sub-pixel accuracy. 2168 2169 The function getRectSubPix extracts pixels from src: 2170 2171 \f[dst(x, y) = src(x + \texttt{center.x} - ( \texttt{dst.cols} -1)*0.5, y + \texttt{center.y} - ( \texttt{dst.rows} -1)*0.5)\f] 2172 2173 where the values of the pixels at non-integer coordinates are retrieved using bilinear 2174 interpolation. Every channel of multi-channel images is processed independently. While the center of 2175 the rectangle must be inside the image, parts of the rectangle may be outside. In this case, the 2176 replication border mode (see cv::BorderTypes) is used to extrapolate the pixel values outside of 2177 the image. 2178 2179 @param image Source image. 2180 @param patchSize Size of the extracted patch. 2181 @param center Floating point coordinates of the center of the extracted rectangle within the 2182 source image. The center must be inside the image. 2183 @param patch Extracted patch that has the size patchSize and the same number of channels as src . 2184 @param patchType Depth of the extracted pixels. By default, they have the same depth as src . 2185 2186 @sa warpAffine, warpPerspective 2187 */ 2188 CV_EXPORTS_W void getRectSubPix( InputArray image, Size patchSize, 2189 Point2f center, OutputArray patch, int patchType = -1 ); 2190 2191 /** @example polar_transforms.cpp 2192 An example using the cv::linearPolar and cv::logPolar operations 2193 */ 2194 2195 /** @brief Remaps an image to log-polar space. 2196 2197 transforms the source image using the following transformation: 2198 \f[dst( \phi , \rho ) = src(x,y)\f] 2199 where 2200 \f[\rho = M \cdot \log{\sqrt{x^2 + y^2}} , \phi =atan(y/x)\f] 2201 2202 The function emulates the human "foveal" vision and can be used for fast scale and 2203 rotation-invariant template matching, for object tracking and so forth. The function can not operate 2204 in-place. 2205 2206 @param src Source image 2207 @param dst Destination image 2208 @param center The transformation center; where the output precision is maximal 2209 @param M Magnitude scale parameter. 2210 @param flags A combination of interpolation methods, see cv::InterpolationFlags 2211 */ 2212 CV_EXPORTS_W void logPolar( InputArray src, OutputArray dst, 2213 Point2f center, double M, int flags ); 2214 2215 /** @brief Remaps an image to polar space. 2216 2217 transforms the source image using the following transformation: 2218 \f[dst( \phi , \rho ) = src(x,y)\f] 2219 where 2220 \f[\rho = (src.width/maxRadius) \cdot \sqrt{x^2 + y^2} , \phi =atan(y/x)\f] 2221 2222 The function can not operate in-place. 2223 2224 @param src Source image 2225 @param dst Destination image 2226 @param center The transformation center; 2227 @param maxRadius Inverse magnitude scale parameter 2228 @param flags A combination of interpolation methods, see cv::InterpolationFlags 2229 */ 2230 CV_EXPORTS_W void linearPolar( InputArray src, OutputArray dst, 2231 Point2f center, double maxRadius, int flags ); 2232 2233 //! @} imgproc_transform 2234 2235 //! @addtogroup imgproc_misc 2236 //! @{ 2237 2238 /** @overload */ 2239 CV_EXPORTS_W void integral( InputArray src, OutputArray sum, int sdepth = -1 ); 2240 2241 /** @overload */ 2242 CV_EXPORTS_AS(integral2) void integral( InputArray src, OutputArray sum, 2243 OutputArray sqsum, int sdepth = -1, int sqdepth = -1 ); 2244 2245 /** @brief Calculates the integral of an image. 2246 2247 The functions calculate one or more integral images for the source image as follows: 2248 2249 \f[\texttt{sum} (X,Y) = \sum _{x<X,y<Y} \texttt{image} (x,y)\f] 2250 2251 \f[\texttt{sqsum} (X,Y) = \sum _{x<X,y<Y} \texttt{image} (x,y)^2\f] 2252 2253 \f[\texttt{tilted} (X,Y) = \sum _{y<Y,abs(x-X+1) \leq Y-y-1} \texttt{image} (x,y)\f] 2254 2255 Using these integral images, you can calculate sum, mean, and standard deviation over a specific 2256 up-right or rotated rectangular region of the image in a constant time, for example: 2257 2258 \f[\sum _{x_1 \leq x < x_2, \, y_1 \leq y < y_2} \texttt{image} (x,y) = \texttt{sum} (x_2,y_2)- \texttt{sum} (x_1,y_2)- \texttt{sum} (x_2,y_1)+ \texttt{sum} (x_1,y_1)\f] 2259 2260 It makes possible to do a fast blurring or fast block correlation with a variable window size, for 2261 example. In case of multi-channel images, sums for each channel are accumulated independently. 2262 2263 As a practical example, the next figure shows the calculation of the integral of a straight 2264 rectangle Rect(3,3,3,2) and of a tilted rectangle Rect(5,1,2,3) . The selected pixels in the 2265 original image are shown, as well as the relative pixels in the integral images sum and tilted . 2266 2267 ![integral calculation example](pics/integral.png) 2268 2269 @param src input image as \f$W \times H\f$, 8-bit or floating-point (32f or 64f). 2270 @param sum integral image as \f$(W+1)\times (H+1)\f$ , 32-bit integer or floating-point (32f or 64f). 2271 @param sqsum integral image for squared pixel values; it is \f$(W+1)\times (H+1)\f$, double-precision 2272 floating-point (64f) array. 2273 @param tilted integral for the image rotated by 45 degrees; it is \f$(W+1)\times (H+1)\f$ array with 2274 the same data type as sum. 2275 @param sdepth desired depth of the integral and the tilted integral images, CV_32S, CV_32F, or 2276 CV_64F. 2277 @param sqdepth desired depth of the integral image of squared pixel values, CV_32F or CV_64F. 2278 */ 2279 CV_EXPORTS_AS(integral3) void integral( InputArray src, OutputArray sum, 2280 OutputArray sqsum, OutputArray tilted, 2281 int sdepth = -1, int sqdepth = -1 ); 2282 2283 //! @} imgproc_misc 2284 2285 //! @addtogroup imgproc_motion 2286 //! @{ 2287 2288 /** @brief Adds an image to the accumulator. 2289 2290 The function adds src or some of its elements to dst : 2291 2292 \f[\texttt{dst} (x,y) \leftarrow \texttt{dst} (x,y) + \texttt{src} (x,y) \quad \text{if} \quad \texttt{mask} (x,y) \ne 0\f] 2293 2294 The function supports multi-channel images. Each channel is processed independently. 2295 2296 The functions accumulate\* can be used, for example, to collect statistics of a scene background 2297 viewed by a still camera and for the further foreground-background segmentation. 2298 2299 @param src Input image as 1- or 3-channel, 8-bit or 32-bit floating point. 2300 @param dst %Accumulator image with the same number of channels as input image, 32-bit or 64-bit 2301 floating-point. 2302 @param mask Optional operation mask. 2303 2304 @sa accumulateSquare, accumulateProduct, accumulateWeighted 2305 */ 2306 CV_EXPORTS_W void accumulate( InputArray src, InputOutputArray dst, 2307 InputArray mask = noArray() ); 2308 2309 /** @brief Adds the square of a source image to the accumulator. 2310 2311 The function adds the input image src or its selected region, raised to a power of 2, to the 2312 accumulator dst : 2313 2314 \f[\texttt{dst} (x,y) \leftarrow \texttt{dst} (x,y) + \texttt{src} (x,y)^2 \quad \text{if} \quad \texttt{mask} (x,y) \ne 0\f] 2315 2316 The function supports multi-channel images. Each channel is processed independently. 2317 2318 @param src Input image as 1- or 3-channel, 8-bit or 32-bit floating point. 2319 @param dst %Accumulator image with the same number of channels as input image, 32-bit or 64-bit 2320 floating-point. 2321 @param mask Optional operation mask. 2322 2323 @sa accumulateSquare, accumulateProduct, accumulateWeighted 2324 */ 2325 CV_EXPORTS_W void accumulateSquare( InputArray src, InputOutputArray dst, 2326 InputArray mask = noArray() ); 2327 2328 /** @brief Adds the per-element product of two input images to the accumulator. 2329 2330 The function adds the product of two images or their selected regions to the accumulator dst : 2331 2332 \f[\texttt{dst} (x,y) \leftarrow \texttt{dst} (x,y) + \texttt{src1} (x,y) \cdot \texttt{src2} (x,y) \quad \text{if} \quad \texttt{mask} (x,y) \ne 0\f] 2333 2334 The function supports multi-channel images. Each channel is processed independently. 2335 2336 @param src1 First input image, 1- or 3-channel, 8-bit or 32-bit floating point. 2337 @param src2 Second input image of the same type and the same size as src1 . 2338 @param dst %Accumulator with the same number of channels as input images, 32-bit or 64-bit 2339 floating-point. 2340 @param mask Optional operation mask. 2341 2342 @sa accumulate, accumulateSquare, accumulateWeighted 2343 */ 2344 CV_EXPORTS_W void accumulateProduct( InputArray src1, InputArray src2, 2345 InputOutputArray dst, InputArray mask=noArray() ); 2346 2347 /** @brief Updates a running average. 2348 2349 The function calculates the weighted sum of the input image src and the accumulator dst so that dst 2350 becomes a running average of a frame sequence: 2351 2352 \f[\texttt{dst} (x,y) \leftarrow (1- \texttt{alpha} ) \cdot \texttt{dst} (x,y) + \texttt{alpha} \cdot \texttt{src} (x,y) \quad \text{if} \quad \texttt{mask} (x,y) \ne 0\f] 2353 2354 That is, alpha regulates the update speed (how fast the accumulator "forgets" about earlier images). 2355 The function supports multi-channel images. Each channel is processed independently. 2356 2357 @param src Input image as 1- or 3-channel, 8-bit or 32-bit floating point. 2358 @param dst %Accumulator image with the same number of channels as input image, 32-bit or 64-bit 2359 floating-point. 2360 @param alpha Weight of the input image. 2361 @param mask Optional operation mask. 2362 2363 @sa accumulate, accumulateSquare, accumulateProduct 2364 */ 2365 CV_EXPORTS_W void accumulateWeighted( InputArray src, InputOutputArray dst, 2366 double alpha, InputArray mask = noArray() ); 2367 2368 /** @brief The function is used to detect translational shifts that occur between two images. 2369 2370 The operation takes advantage of the Fourier shift theorem for detecting the translational shift in 2371 the frequency domain. It can be used for fast image registration as well as motion estimation. For 2372 more information please see <http://en.wikipedia.org/wiki/Phase_correlation> 2373 2374 Calculates the cross-power spectrum of two supplied source arrays. The arrays are padded if needed 2375 with getOptimalDFTSize. 2376 2377 The function performs the following equations: 2378 - First it applies a Hanning window (see <http://en.wikipedia.org/wiki/Hann_function>) to each 2379 image to remove possible edge effects. This window is cached until the array size changes to speed 2380 up processing time. 2381 - Next it computes the forward DFTs of each source array: 2382 \f[\mathbf{G}_a = \mathcal{F}\{src_1\}, \; \mathbf{G}_b = \mathcal{F}\{src_2\}\f] 2383 where \f$\mathcal{F}\f$ is the forward DFT. 2384 - It then computes the cross-power spectrum of each frequency domain array: 2385 \f[R = \frac{ \mathbf{G}_a \mathbf{G}_b^*}{|\mathbf{G}_a \mathbf{G}_b^*|}\f] 2386 - Next the cross-correlation is converted back into the time domain via the inverse DFT: 2387 \f[r = \mathcal{F}^{-1}\{R\}\f] 2388 - Finally, it computes the peak location and computes a 5x5 weighted centroid around the peak to 2389 achieve sub-pixel accuracy. 2390 \f[(\Delta x, \Delta y) = \texttt{weightedCentroid} \{\arg \max_{(x, y)}\{r\}\}\f] 2391 - If non-zero, the response parameter is computed as the sum of the elements of r within the 5x5 2392 centroid around the peak location. It is normalized to a maximum of 1 (meaning there is a single 2393 peak) and will be smaller when there are multiple peaks. 2394 2395 @param src1 Source floating point array (CV_32FC1 or CV_64FC1) 2396 @param src2 Source floating point array (CV_32FC1 or CV_64FC1) 2397 @param window Floating point array with windowing coefficients to reduce edge effects (optional). 2398 @param response Signal power within the 5x5 centroid around the peak, between 0 and 1 (optional). 2399 @returns detected phase shift (sub-pixel) between the two arrays. 2400 2401 @sa dft, getOptimalDFTSize, idft, mulSpectrums createHanningWindow 2402 */ 2403 CV_EXPORTS_W Point2d phaseCorrelate(InputArray src1, InputArray src2, 2404 InputArray window = noArray(), CV_OUT double* response = 0); 2405 2406 /** @brief This function computes a Hanning window coefficients in two dimensions. 2407 2408 See (http://en.wikipedia.org/wiki/Hann_function) and (http://en.wikipedia.org/wiki/Window_function) 2409 for more information. 2410 2411 An example is shown below: 2412 @code 2413 // create hanning window of size 100x100 and type CV_32F 2414 Mat hann; 2415 createHanningWindow(hann, Size(100, 100), CV_32F); 2416 @endcode 2417 @param dst Destination array to place Hann coefficients in 2418 @param winSize The window size specifications 2419 @param type Created array type 2420 */ 2421 CV_EXPORTS_W void createHanningWindow(OutputArray dst, Size winSize, int type); 2422 2423 //! @} imgproc_motion 2424 2425 //! @addtogroup imgproc_misc 2426 //! @{ 2427 2428 /** @brief Applies a fixed-level threshold to each array element. 2429 2430 The function applies fixed-level thresholding to a single-channel array. The function is typically 2431 used to get a bi-level (binary) image out of a grayscale image ( cv::compare could be also used for 2432 this purpose) or for removing a noise, that is, filtering out pixels with too small or too large 2433 values. There are several types of thresholding supported by the function. They are determined by 2434 type parameter. 2435 2436 Also, the special values cv::THRESH_OTSU or cv::THRESH_TRIANGLE may be combined with one of the 2437 above values. In these cases, the function determines the optimal threshold value using the Otsu's 2438 or Triangle algorithm and uses it instead of the specified thresh . The function returns the 2439 computed threshold value. Currently, the Otsu's and Triangle methods are implemented only for 8-bit 2440 images. 2441 2442 @param src input array (single-channel, 8-bit or 32-bit floating point). 2443 @param dst output array of the same size and type as src. 2444 @param thresh threshold value. 2445 @param maxval maximum value to use with the THRESH_BINARY and THRESH_BINARY_INV thresholding 2446 types. 2447 @param type thresholding type (see the cv::ThresholdTypes). 2448 2449 @sa adaptiveThreshold, findContours, compare, min, max 2450 */ 2451 CV_EXPORTS_W double threshold( InputArray src, OutputArray dst, 2452 double thresh, double maxval, int type ); 2453 2454 2455 /** @brief Applies an adaptive threshold to an array. 2456 2457 The function transforms a grayscale image to a binary image according to the formulae: 2458 - **THRESH_BINARY** 2459 \f[dst(x,y) = \fork{\texttt{maxValue}}{if \(src(x,y) > T(x,y)\)}{0}{otherwise}\f] 2460 - **THRESH_BINARY_INV** 2461 \f[dst(x,y) = \fork{0}{if \(src(x,y) > T(x,y)\)}{\texttt{maxValue}}{otherwise}\f] 2462 where \f$T(x,y)\f$ is a threshold calculated individually for each pixel (see adaptiveMethod parameter). 2463 2464 The function can process the image in-place. 2465 2466 @param src Source 8-bit single-channel image. 2467 @param dst Destination image of the same size and the same type as src. 2468 @param maxValue Non-zero value assigned to the pixels for which the condition is satisfied 2469 @param adaptiveMethod Adaptive thresholding algorithm to use, see cv::AdaptiveThresholdTypes 2470 @param thresholdType Thresholding type that must be either THRESH_BINARY or THRESH_BINARY_INV, 2471 see cv::ThresholdTypes. 2472 @param blockSize Size of a pixel neighborhood that is used to calculate a threshold value for the 2473 pixel: 3, 5, 7, and so on. 2474 @param C Constant subtracted from the mean or weighted mean (see the details below). Normally, it 2475 is positive but may be zero or negative as well. 2476 2477 @sa threshold, blur, GaussianBlur 2478 */ 2479 CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst, 2480 double maxValue, int adaptiveMethod, 2481 int thresholdType, int blockSize, double C ); 2482 2483 //! @} imgproc_misc 2484 2485 //! @addtogroup imgproc_filter 2486 //! @{ 2487 2488 /** @brief Blurs an image and downsamples it. 2489 2490 By default, size of the output image is computed as `Size((src.cols+1)/2, (src.rows+1)/2)`, but in 2491 any case, the following conditions should be satisfied: 2492 2493 \f[\begin{array}{l} | \texttt{dstsize.width} *2-src.cols| \leq 2 \\ | \texttt{dstsize.height} *2-src.rows| \leq 2 \end{array}\f] 2494 2495 The function performs the downsampling step of the Gaussian pyramid construction. First, it 2496 convolves the source image with the kernel: 2497 2498 \f[\frac{1}{256} \begin{bmatrix} 1 & 4 & 6 & 4 & 1 \\ 4 & 16 & 24 & 16 & 4 \\ 6 & 24 & 36 & 24 & 6 \\ 4 & 16 & 24 & 16 & 4 \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix}\f] 2499 2500 Then, it downsamples the image by rejecting even rows and columns. 2501 2502 @param src input image. 2503 @param dst output image; it has the specified size and the same type as src. 2504 @param dstsize size of the output image. 2505 @param borderType Pixel extrapolation method, see cv::BorderTypes (BORDER_CONSTANT isn't supported) 2506 */ 2507 CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst, 2508 const Size& dstsize = Size(), int borderType = BORDER_DEFAULT ); 2509 2510 /** @brief Upsamples an image and then blurs it. 2511 2512 By default, size of the output image is computed as `Size(src.cols\*2, (src.rows\*2)`, but in any 2513 case, the following conditions should be satisfied: 2514 2515 \f[\begin{array}{l} | \texttt{dstsize.width} -src.cols*2| \leq ( \texttt{dstsize.width} \mod 2) \\ | \texttt{dstsize.height} -src.rows*2| \leq ( \texttt{dstsize.height} \mod 2) \end{array}\f] 2516 2517 The function performs the upsampling step of the Gaussian pyramid construction, though it can 2518 actually be used to construct the Laplacian pyramid. First, it upsamples the source image by 2519 injecting even zero rows and columns and then convolves the result with the same kernel as in 2520 pyrDown multiplied by 4. 2521 2522 @param src input image. 2523 @param dst output image. It has the specified size and the same type as src . 2524 @param dstsize size of the output image. 2525 @param borderType Pixel extrapolation method, see cv::BorderTypes (only BORDER_DEFAULT is supported) 2526 */ 2527 CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst, 2528 const Size& dstsize = Size(), int borderType = BORDER_DEFAULT ); 2529 2530 /** @brief Constructs the Gaussian pyramid for an image. 2531 2532 The function constructs a vector of images and builds the Gaussian pyramid by recursively applying 2533 pyrDown to the previously built pyramid layers, starting from `dst[0]==src`. 2534 2535 @param src Source image. Check pyrDown for the list of supported types. 2536 @param dst Destination vector of maxlevel+1 images of the same type as src. dst[0] will be the 2537 same as src. dst[1] is the next pyramid layer, a smoothed and down-sized src, and so on. 2538 @param maxlevel 0-based index of the last (the smallest) pyramid layer. It must be non-negative. 2539 @param borderType Pixel extrapolation method, see cv::BorderTypes (BORDER_CONSTANT isn't supported) 2540 */ 2541 CV_EXPORTS void buildPyramid( InputArray src, OutputArrayOfArrays dst, 2542 int maxlevel, int borderType = BORDER_DEFAULT ); 2543 2544 //! @} imgproc_filter 2545 2546 //! @addtogroup imgproc_transform 2547 //! @{ 2548 2549 /** @brief Transforms an image to compensate for lens distortion. 2550 2551 The function transforms an image to compensate radial and tangential lens distortion. 2552 2553 The function is simply a combination of cv::initUndistortRectifyMap (with unity R ) and cv::remap 2554 (with bilinear interpolation). See the former function for details of the transformation being 2555 performed. 2556 2557 Those pixels in the destination image, for which there is no correspondent pixels in the source 2558 image, are filled with zeros (black color). 2559 2560 A particular subset of the source image that will be visible in the corrected image can be regulated 2561 by newCameraMatrix. You can use cv::getOptimalNewCameraMatrix to compute the appropriate 2562 newCameraMatrix depending on your requirements. 2563 2564 The camera matrix and the distortion parameters can be determined using cv::calibrateCamera. If 2565 the resolution of images is different from the resolution used at the calibration stage, \f$f_x, 2566 f_y, c_x\f$ and \f$c_y\f$ need to be scaled accordingly, while the distortion coefficients remain 2567 the same. 2568 2569 @param src Input (distorted) image. 2570 @param dst Output (corrected) image that has the same size and type as src . 2571 @param cameraMatrix Input camera matrix \f$A = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . 2572 @param distCoeffs Input vector of distortion coefficients 2573 \f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6]])\f$ of 4, 5, or 8 elements. If the vector is 2574 NULL/empty, the zero distortion coefficients are assumed. 2575 @param newCameraMatrix Camera matrix of the distorted image. By default, it is the same as 2576 cameraMatrix but you may additionally scale and shift the result by using a different matrix. 2577 */ 2578 CV_EXPORTS_W void undistort( InputArray src, OutputArray dst, 2579 InputArray cameraMatrix, 2580 InputArray distCoeffs, 2581 InputArray newCameraMatrix = noArray() ); 2582 2583 /** @brief Computes the undistortion and rectification transformation map. 2584 2585 The function computes the joint undistortion and rectification transformation and represents the 2586 result in the form of maps for remap. The undistorted image looks like original, as if it is 2587 captured with a camera using the camera matrix =newCameraMatrix and zero distortion. In case of a 2588 monocular camera, newCameraMatrix is usually equal to cameraMatrix, or it can be computed by 2589 cv::getOptimalNewCameraMatrix for a better control over scaling. In case of a stereo camera, 2590 newCameraMatrix is normally set to P1 or P2 computed by cv::stereoRectify . 2591 2592 Also, this new camera is oriented differently in the coordinate space, according to R. That, for 2593 example, helps to align two heads of a stereo camera so that the epipolar lines on both images 2594 become horizontal and have the same y- coordinate (in case of a horizontally aligned stereo camera). 2595 2596 The function actually builds the maps for the inverse mapping algorithm that is used by remap. That 2597 is, for each pixel \f$(u, v)\f$ in the destination (corrected and rectified) image, the function 2598 computes the corresponding coordinates in the source image (that is, in the original image from 2599 camera). The following process is applied: 2600 \f[\begin{array}{l} x \leftarrow (u - {c'}_x)/{f'}_x \\ y \leftarrow (v - {c'}_y)/{f'}_y \\{[X\,Y\,W]} ^T \leftarrow R^{-1}*[x \, y \, 1]^T \\ x' \leftarrow X/W \\ y' \leftarrow Y/W \\ x" \leftarrow x' (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2p_1 x' y' + p_2(r^2 + 2 x'^2) \\ y" \leftarrow y' (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1 (r^2 + 2 y'^2) + 2 p_2 x' y' \\ map_x(u,v) \leftarrow x" f_x + c_x \\ map_y(u,v) \leftarrow y" f_y + c_y \end{array}\f] 2601 where \f$(k_1, k_2, p_1, p_2[, k_3])\f$ are the distortion coefficients. 2602 2603 In case of a stereo camera, this function is called twice: once for each camera head, after 2604 stereoRectify, which in its turn is called after cv::stereoCalibrate. But if the stereo camera 2605 was not calibrated, it is still possible to compute the rectification transformations directly from 2606 the fundamental matrix using cv::stereoRectifyUncalibrated. For each camera, the function computes 2607 homography H as the rectification transformation in a pixel domain, not a rotation matrix R in 3D 2608 space. R can be computed from H as 2609 \f[\texttt{R} = \texttt{cameraMatrix} ^{-1} \cdot \texttt{H} \cdot \texttt{cameraMatrix}\f] 2610 where cameraMatrix can be chosen arbitrarily. 2611 2612 @param cameraMatrix Input camera matrix \f$A=\vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . 2613 @param distCoeffs Input vector of distortion coefficients 2614 \f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6]])\f$ of 4, 5, or 8 elements. If the vector is 2615 NULL/empty, the zero distortion coefficients are assumed. 2616 @param R Optional rectification transformation in the object space (3x3 matrix). R1 or R2 , 2617 computed by stereoRectify can be passed here. If the matrix is empty, the identity transformation 2618 is assumed. In cvInitUndistortMap R assumed to be an identity matrix. 2619 @param newCameraMatrix New camera matrix \f$A'=\vecthreethree{f_x'}{0}{c_x'}{0}{f_y'}{c_y'}{0}{0}{1}\f$. 2620 @param size Undistorted image size. 2621 @param m1type Type of the first output map that can be CV_32FC1 or CV_16SC2, see cv::convertMaps 2622 @param map1 The first output map. 2623 @param map2 The second output map. 2624 */ 2625 CV_EXPORTS_W void initUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs, 2626 InputArray R, InputArray newCameraMatrix, 2627 Size size, int m1type, OutputArray map1, OutputArray map2 ); 2628 2629 //! initializes maps for cv::remap() for wide-angle 2630 CV_EXPORTS_W float initWideAngleProjMap( InputArray cameraMatrix, InputArray distCoeffs, 2631 Size imageSize, int destImageWidth, 2632 int m1type, OutputArray map1, OutputArray map2, 2633 int projType = PROJ_SPHERICAL_EQRECT, double alpha = 0); 2634 2635 /** @brief Returns the default new camera matrix. 2636 2637 The function returns the camera matrix that is either an exact copy of the input cameraMatrix (when 2638 centerPrinicipalPoint=false ), or the modified one (when centerPrincipalPoint=true). 2639 2640 In the latter case, the new camera matrix will be: 2641 2642 \f[\begin{bmatrix} f_x && 0 && ( \texttt{imgSize.width} -1)*0.5 \\ 0 && f_y && ( \texttt{imgSize.height} -1)*0.5 \\ 0 && 0 && 1 \end{bmatrix} ,\f] 2643 2644 where \f$f_x\f$ and \f$f_y\f$ are \f$(0,0)\f$ and \f$(1,1)\f$ elements of cameraMatrix, respectively. 2645 2646 By default, the undistortion functions in OpenCV (see initUndistortRectifyMap, undistort) do not 2647 move the principal point. However, when you work with stereo, it is important to move the principal 2648 points in both views to the same y-coordinate (which is required by most of stereo correspondence 2649 algorithms), and may be to the same x-coordinate too. So, you can form the new camera matrix for 2650 each view where the principal points are located at the center. 2651 2652 @param cameraMatrix Input camera matrix. 2653 @param imgsize Camera view image size in pixels. 2654 @param centerPrincipalPoint Location of the principal point in the new camera matrix. The 2655 parameter indicates whether this location should be at the image center or not. 2656 */ 2657 CV_EXPORTS_W Mat getDefaultNewCameraMatrix( InputArray cameraMatrix, Size imgsize = Size(), 2658 bool centerPrincipalPoint = false ); 2659 2660 /** @brief Computes the ideal point coordinates from the observed point coordinates. 2661 2662 The function is similar to cv::undistort and cv::initUndistortRectifyMap but it operates on a 2663 sparse set of points instead of a raster image. Also the function performs a reverse transformation 2664 to projectPoints. In case of a 3D object, it does not reconstruct its 3D coordinates, but for a 2665 planar object, it does, up to a translation vector, if the proper R is specified. 2666 @code 2667 // (u,v) is the input point, (u', v') is the output point 2668 // camera_matrix=[fx 0 cx; 0 fy cy; 0 0 1] 2669 // P=[fx' 0 cx' tx; 0 fy' cy' ty; 0 0 1 tz] 2670 x" = (u - cx)/fx 2671 y" = (v - cy)/fy 2672 (x',y') = undistort(x",y",dist_coeffs) 2673 [X,Y,W]T = R*[x' y' 1]T 2674 x = X/W, y = Y/W 2675 // only performed if P=[fx' 0 cx' [tx]; 0 fy' cy' [ty]; 0 0 1 [tz]] is specified 2676 u' = x*fx' + cx' 2677 v' = y*fy' + cy', 2678 @endcode 2679 where cv::undistort is an approximate iterative algorithm that estimates the normalized original 2680 point coordinates out of the normalized distorted point coordinates ("normalized" means that the 2681 coordinates do not depend on the camera matrix). 2682 2683 The function can be used for both a stereo camera head or a monocular camera (when R is empty). 2684 2685 @param src Observed point coordinates, 1xN or Nx1 2-channel (CV_32FC2 or CV_64FC2). 2686 @param dst Output ideal point coordinates after undistortion and reverse perspective 2687 transformation. If matrix P is identity or omitted, dst will contain normalized point coordinates. 2688 @param cameraMatrix Camera matrix \f$\vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . 2689 @param distCoeffs Input vector of distortion coefficients 2690 \f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6]])\f$ of 4, 5, or 8 elements. If the vector is 2691 NULL/empty, the zero distortion coefficients are assumed. 2692 @param R Rectification transformation in the object space (3x3 matrix). R1 or R2 computed by 2693 cv::stereoRectify can be passed here. If the matrix is empty, the identity transformation is used. 2694 @param P New camera matrix (3x3) or new projection matrix (3x4). P1 or P2 computed by 2695 cv::stereoRectify can be passed here. If the matrix is empty, the identity new camera matrix is used. 2696 */ 2697 CV_EXPORTS_W void undistortPoints( InputArray src, OutputArray dst, 2698 InputArray cameraMatrix, InputArray distCoeffs, 2699 InputArray R = noArray(), InputArray P = noArray()); 2700 2701 //! @} imgproc_transform 2702 2703 //! @addtogroup imgproc_hist 2704 //! @{ 2705 2706 /** @example demhist.cpp 2707 An example for creating histograms of an image 2708 */ 2709 2710 /** @brief Calculates a histogram of a set of arrays. 2711 2712 The functions calcHist calculate the histogram of one or more arrays. The elements of a tuple used 2713 to increment a histogram bin are taken from the corresponding input arrays at the same location. The 2714 sample below shows how to compute a 2D Hue-Saturation histogram for a color image. : 2715 @code 2716 #include <opencv2/imgproc.hpp> 2717 #include <opencv2/highgui.hpp> 2718 2719 using namespace cv; 2720 2721 int main( int argc, char** argv ) 2722 { 2723 Mat src, hsv; 2724 if( argc != 2 || !(src=imread(argv[1], 1)).data ) 2725 return -1; 2726 2727 cvtColor(src, hsv, COLOR_BGR2HSV); 2728 2729 // Quantize the hue to 30 levels 2730 // and the saturation to 32 levels 2731 int hbins = 30, sbins = 32; 2732 int histSize[] = {hbins, sbins}; 2733 // hue varies from 0 to 179, see cvtColor 2734 float hranges[] = { 0, 180 }; 2735 // saturation varies from 0 (black-gray-white) to 2736 // 255 (pure spectrum color) 2737 float sranges[] = { 0, 256 }; 2738 const float* ranges[] = { hranges, sranges }; 2739 MatND hist; 2740 // we compute the histogram from the 0-th and 1-st channels 2741 int channels[] = {0, 1}; 2742 2743 calcHist( &hsv, 1, channels, Mat(), // do not use mask 2744 hist, 2, histSize, ranges, 2745 true, // the histogram is uniform 2746 false ); 2747 double maxVal=0; 2748 minMaxLoc(hist, 0, &maxVal, 0, 0); 2749 2750 int scale = 10; 2751 Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3); 2752 2753 for( int h = 0; h < hbins; h++ ) 2754 for( int s = 0; s < sbins; s++ ) 2755 { 2756 float binVal = hist.at<float>(h, s); 2757 int intensity = cvRound(binVal*255/maxVal); 2758 rectangle( histImg, Point(h*scale, s*scale), 2759 Point( (h+1)*scale - 1, (s+1)*scale - 1), 2760 Scalar::all(intensity), 2761 CV_FILLED ); 2762 } 2763 2764 namedWindow( "Source", 1 ); 2765 imshow( "Source", src ); 2766 2767 namedWindow( "H-S Histogram", 1 ); 2768 imshow( "H-S Histogram", histImg ); 2769 waitKey(); 2770 } 2771 @endcode 2772 2773 @param images Source arrays. They all should have the same depth, CV_8U or CV_32F , and the same 2774 size. Each of them can have an arbitrary number of channels. 2775 @param nimages Number of source images. 2776 @param channels List of the dims channels used to compute the histogram. The first array channels 2777 are numerated from 0 to images[0].channels()-1 , the second array channels are counted from 2778 images[0].channels() to images[0].channels() + images[1].channels()-1, and so on. 2779 @param mask Optional mask. If the matrix is not empty, it must be an 8-bit array of the same size 2780 as images[i] . The non-zero mask elements mark the array elements counted in the histogram. 2781 @param hist Output histogram, which is a dense or sparse dims -dimensional array. 2782 @param dims Histogram dimensionality that must be positive and not greater than CV_MAX_DIMS 2783 (equal to 32 in the current OpenCV version). 2784 @param histSize Array of histogram sizes in each dimension. 2785 @param ranges Array of the dims arrays of the histogram bin boundaries in each dimension. When the 2786 histogram is uniform ( uniform =true), then for each dimension i it is enough to specify the lower 2787 (inclusive) boundary \f$L_0\f$ of the 0-th histogram bin and the upper (exclusive) boundary 2788 \f$U_{\texttt{histSize}[i]-1}\f$ for the last histogram bin histSize[i]-1 . That is, in case of a 2789 uniform histogram each of ranges[i] is an array of 2 elements. When the histogram is not uniform ( 2790 uniform=false ), then each of ranges[i] contains histSize[i]+1 elements: 2791 \f$L_0, U_0=L_1, U_1=L_2, ..., U_{\texttt{histSize[i]}-2}=L_{\texttt{histSize[i]}-1}, U_{\texttt{histSize[i]}-1}\f$ 2792 . The array elements, that are not between \f$L_0\f$ and \f$U_{\texttt{histSize[i]}-1}\f$ , are not 2793 counted in the histogram. 2794 @param uniform Flag indicating whether the histogram is uniform or not (see above). 2795 @param accumulate Accumulation flag. If it is set, the histogram is not cleared in the beginning 2796 when it is allocated. This feature enables you to compute a single histogram from several sets of 2797 arrays, or to update the histogram in time. 2798 */ 2799 CV_EXPORTS void calcHist( const Mat* images, int nimages, 2800 const int* channels, InputArray mask, 2801 OutputArray hist, int dims, const int* histSize, 2802 const float** ranges, bool uniform = true, bool accumulate = false ); 2803 2804 /** @overload 2805 2806 this variant uses cv::SparseMat for output 2807 */ 2808 CV_EXPORTS void calcHist( const Mat* images, int nimages, 2809 const int* channels, InputArray mask, 2810 SparseMat& hist, int dims, 2811 const int* histSize, const float** ranges, 2812 bool uniform = true, bool accumulate = false ); 2813 2814 /** @overload */ 2815 CV_EXPORTS_W void calcHist( InputArrayOfArrays images, 2816 const std::vector<int>& channels, 2817 InputArray mask, OutputArray hist, 2818 const std::vector<int>& histSize, 2819 const std::vector<float>& ranges, 2820 bool accumulate = false ); 2821 2822 /** @brief Calculates the back projection of a histogram. 2823 2824 The functions calcBackProject calculate the back project of the histogram. That is, similarly to 2825 cv::calcHist , at each location (x, y) the function collects the values from the selected channels 2826 in the input images and finds the corresponding histogram bin. But instead of incrementing it, the 2827 function reads the bin value, scales it by scale , and stores in backProject(x,y) . In terms of 2828 statistics, the function computes probability of each element value in respect with the empirical 2829 probability distribution represented by the histogram. See how, for example, you can find and track 2830 a bright-colored object in a scene: 2831 2832 - Before tracking, show the object to the camera so that it covers almost the whole frame. 2833 Calculate a hue histogram. The histogram may have strong maximums, corresponding to the dominant 2834 colors in the object. 2835 2836 - When tracking, calculate a back projection of a hue plane of each input video frame using that 2837 pre-computed histogram. Threshold the back projection to suppress weak colors. It may also make 2838 sense to suppress pixels with non-sufficient color saturation and too dark or too bright pixels. 2839 2840 - Find connected components in the resulting picture and choose, for example, the largest 2841 component. 2842 2843 This is an approximate algorithm of the CamShift color object tracker. 2844 2845 @param images Source arrays. They all should have the same depth, CV_8U or CV_32F , and the same 2846 size. Each of them can have an arbitrary number of channels. 2847 @param nimages Number of source images. 2848 @param channels The list of channels used to compute the back projection. The number of channels 2849 must match the histogram dimensionality. The first array channels are numerated from 0 to 2850 images[0].channels()-1 , the second array channels are counted from images[0].channels() to 2851 images[0].channels() + images[1].channels()-1, and so on. 2852 @param hist Input histogram that can be dense or sparse. 2853 @param backProject Destination back projection array that is a single-channel array of the same 2854 size and depth as images[0] . 2855 @param ranges Array of arrays of the histogram bin boundaries in each dimension. See calcHist . 2856 @param scale Optional scale factor for the output back projection. 2857 @param uniform Flag indicating whether the histogram is uniform or not (see above). 2858 2859 @sa cv::calcHist, cv::compareHist 2860 */ 2861 CV_EXPORTS void calcBackProject( const Mat* images, int nimages, 2862 const int* channels, InputArray hist, 2863 OutputArray backProject, const float** ranges, 2864 double scale = 1, bool uniform = true ); 2865 2866 /** @overload */ 2867 CV_EXPORTS void calcBackProject( const Mat* images, int nimages, 2868 const int* channels, const SparseMat& hist, 2869 OutputArray backProject, const float** ranges, 2870 double scale = 1, bool uniform = true ); 2871 2872 /** @overload */ 2873 CV_EXPORTS_W void calcBackProject( InputArrayOfArrays images, const std::vector<int>& channels, 2874 InputArray hist, OutputArray dst, 2875 const std::vector<float>& ranges, 2876 double scale ); 2877 2878 /** @brief Compares two histograms. 2879 2880 The function compare two dense or two sparse histograms using the specified method. 2881 2882 The function returns \f$d(H_1, H_2)\f$ . 2883 2884 While the function works well with 1-, 2-, 3-dimensional dense histograms, it may not be suitable 2885 for high-dimensional sparse histograms. In such histograms, because of aliasing and sampling 2886 problems, the coordinates of non-zero histogram bins can slightly shift. To compare such histograms 2887 or more general sparse configurations of weighted points, consider using the cv::EMD function. 2888 2889 @param H1 First compared histogram. 2890 @param H2 Second compared histogram of the same size as H1 . 2891 @param method Comparison method, see cv::HistCompMethods 2892 */ 2893 CV_EXPORTS_W double compareHist( InputArray H1, InputArray H2, int method ); 2894 2895 /** @overload */ 2896 CV_EXPORTS double compareHist( const SparseMat& H1, const SparseMat& H2, int method ); 2897 2898 /** @brief Equalizes the histogram of a grayscale image. 2899 2900 The function equalizes the histogram of the input image using the following algorithm: 2901 2902 - Calculate the histogram \f$H\f$ for src . 2903 - Normalize the histogram so that the sum of histogram bins is 255. 2904 - Compute the integral of the histogram: 2905 \f[H'_i = \sum _{0 \le j < i} H(j)\f] 2906 - Transform the image using \f$H'\f$ as a look-up table: \f$\texttt{dst}(x,y) = H'(\texttt{src}(x,y))\f$ 2907 2908 The algorithm normalizes the brightness and increases the contrast of the image. 2909 2910 @param src Source 8-bit single channel image. 2911 @param dst Destination image of the same size and type as src . 2912 */ 2913 CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst ); 2914 2915 /** @brief Computes the "minimal work" distance between two weighted point configurations. 2916 2917 The function computes the earth mover distance and/or a lower boundary of the distance between the 2918 two weighted point configurations. One of the applications described in @cite RubnerSept98, 2919 @cite Rubner2000 is multi-dimensional histogram comparison for image retrieval. EMD is a transportation 2920 problem that is solved using some modification of a simplex algorithm, thus the complexity is 2921 exponential in the worst case, though, on average it is much faster. In the case of a real metric 2922 the lower boundary can be calculated even faster (using linear-time algorithm) and it can be used 2923 to determine roughly whether the two signatures are far enough so that they cannot relate to the 2924 same object. 2925 2926 @param signature1 First signature, a \f$\texttt{size1}\times \texttt{dims}+1\f$ floating-point matrix. 2927 Each row stores the point weight followed by the point coordinates. The matrix is allowed to have 2928 a single column (weights only) if the user-defined cost matrix is used. 2929 @param signature2 Second signature of the same format as signature1 , though the number of rows 2930 may be different. The total weights may be different. In this case an extra "dummy" point is added 2931 to either signature1 or signature2 . 2932 @param distType Used metric. See cv::DistanceTypes. 2933 @param cost User-defined \f$\texttt{size1}\times \texttt{size2}\f$ cost matrix. Also, if a cost matrix 2934 is used, lower boundary lowerBound cannot be calculated because it needs a metric function. 2935 @param lowerBound Optional input/output parameter: lower boundary of a distance between the two 2936 signatures that is a distance between mass centers. The lower boundary may not be calculated if 2937 the user-defined cost matrix is used, the total weights of point configurations are not equal, or 2938 if the signatures consist of weights only (the signature matrices have a single column). You 2939 **must** initialize \*lowerBound . If the calculated distance between mass centers is greater or 2940 equal to \*lowerBound (it means that the signatures are far enough), the function does not 2941 calculate EMD. In any case \*lowerBound is set to the calculated distance between mass centers on 2942 return. Thus, if you want to calculate both distance between mass centers and EMD, \*lowerBound 2943 should be set to 0. 2944 @param flow Resultant \f$\texttt{size1} \times \texttt{size2}\f$ flow matrix: \f$\texttt{flow}_{i,j}\f$ is 2945 a flow from \f$i\f$ -th point of signature1 to \f$j\f$ -th point of signature2 . 2946 */ 2947 CV_EXPORTS float EMD( InputArray signature1, InputArray signature2, 2948 int distType, InputArray cost=noArray(), 2949 float* lowerBound = 0, OutputArray flow = noArray() ); 2950 2951 //! @} imgproc_hist 2952 2953 /** @example watershed.cpp 2954 An example using the watershed algorithm 2955 */ 2956 2957 /** @brief Performs a marker-based image segmentation using the watershed algorithm. 2958 2959 The function implements one of the variants of watershed, non-parametric marker-based segmentation 2960 algorithm, described in @cite Meyer92 . 2961 2962 Before passing the image to the function, you have to roughly outline the desired regions in the 2963 image markers with positive (\>0) indices. So, every region is represented as one or more connected 2964 components with the pixel values 1, 2, 3, and so on. Such markers can be retrieved from a binary 2965 mask using findContours and drawContours (see the watershed.cpp demo). The markers are "seeds" of 2966 the future image regions. All the other pixels in markers , whose relation to the outlined regions 2967 is not known and should be defined by the algorithm, should be set to 0's. In the function output, 2968 each pixel in markers is set to a value of the "seed" components or to -1 at boundaries between the 2969 regions. 2970 2971 @note Any two neighbor connected components are not necessarily separated by a watershed boundary 2972 (-1's pixels); for example, they can touch each other in the initial marker image passed to the 2973 function. 2974 2975 @param image Input 8-bit 3-channel image. 2976 @param markers Input/output 32-bit single-channel image (map) of markers. It should have the same 2977 size as image . 2978 2979 @sa findContours 2980 2981 @ingroup imgproc_misc 2982 */ 2983 CV_EXPORTS_W void watershed( InputArray image, InputOutputArray markers ); 2984 2985 //! @addtogroup imgproc_filter 2986 //! @{ 2987 2988 /** @brief Performs initial step of meanshift segmentation of an image. 2989 2990 The function implements the filtering stage of meanshift segmentation, that is, the output of the 2991 function is the filtered "posterized" image with color gradients and fine-grain texture flattened. 2992 At every pixel (X,Y) of the input image (or down-sized input image, see below) the function executes 2993 meanshift iterations, that is, the pixel (X,Y) neighborhood in the joint space-color hyperspace is 2994 considered: 2995 2996 \f[(x,y): X- \texttt{sp} \le x \le X+ \texttt{sp} , Y- \texttt{sp} \le y \le Y+ \texttt{sp} , ||(R,G,B)-(r,g,b)|| \le \texttt{sr}\f] 2997 2998 where (R,G,B) and (r,g,b) are the vectors of color components at (X,Y) and (x,y), respectively 2999 (though, the algorithm does not depend on the color space used, so any 3-component color space can 3000 be used instead). Over the neighborhood the average spatial value (X',Y') and average color vector 3001 (R',G',B') are found and they act as the neighborhood center on the next iteration: 3002 3003 \f[(X,Y)~(X',Y'), (R,G,B)~(R',G',B').\f] 3004 3005 After the iterations over, the color components of the initial pixel (that is, the pixel from where 3006 the iterations started) are set to the final value (average color at the last iteration): 3007 3008 \f[I(X,Y) <- (R*,G*,B*)\f] 3009 3010 When maxLevel \> 0, the gaussian pyramid of maxLevel+1 levels is built, and the above procedure is 3011 run on the smallest layer first. After that, the results are propagated to the larger layer and the 3012 iterations are run again only on those pixels where the layer colors differ by more than sr from the 3013 lower-resolution layer of the pyramid. That makes boundaries of color regions sharper. Note that the 3014 results will be actually different from the ones obtained by running the meanshift procedure on the 3015 whole original image (i.e. when maxLevel==0). 3016 3017 @param src The source 8-bit, 3-channel image. 3018 @param dst The destination image of the same format and the same size as the source. 3019 @param sp The spatial window radius. 3020 @param sr The color window radius. 3021 @param maxLevel Maximum level of the pyramid for the segmentation. 3022 @param termcrit Termination criteria: when to stop meanshift iterations. 3023 */ 3024 CV_EXPORTS_W void pyrMeanShiftFiltering( InputArray src, OutputArray dst, 3025 double sp, double sr, int maxLevel = 1, 3026 TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) ); 3027 3028 //! @} 3029 3030 //! @addtogroup imgproc_misc 3031 //! @{ 3032 3033 /** @example grabcut.cpp 3034 An example using the GrabCut algorithm 3035 */ 3036 3037 /** @brief Runs the GrabCut algorithm. 3038 3039 The function implements the [GrabCut image segmentation algorithm](http://en.wikipedia.org/wiki/GrabCut). 3040 3041 @param img Input 8-bit 3-channel image. 3042 @param mask Input/output 8-bit single-channel mask. The mask is initialized by the function when 3043 mode is set to GC_INIT_WITH_RECT. Its elements may have one of the cv::GrabCutClasses. 3044 @param rect ROI containing a segmented object. The pixels outside of the ROI are marked as 3045 "obvious background". The parameter is only used when mode==GC_INIT_WITH_RECT . 3046 @param bgdModel Temporary array for the background model. Do not modify it while you are 3047 processing the same image. 3048 @param fgdModel Temporary arrays for the foreground model. Do not modify it while you are 3049 processing the same image. 3050 @param iterCount Number of iterations the algorithm should make before returning the result. Note 3051 that the result can be refined with further calls with mode==GC_INIT_WITH_MASK or 3052 mode==GC_EVAL . 3053 @param mode Operation mode that could be one of the cv::GrabCutModes 3054 */ 3055 CV_EXPORTS_W void grabCut( InputArray img, InputOutputArray mask, Rect rect, 3056 InputOutputArray bgdModel, InputOutputArray fgdModel, 3057 int iterCount, int mode = GC_EVAL ); 3058 3059 /** @example distrans.cpp 3060 An example on using the distance transform\ 3061 */ 3062 3063 3064 /** @brief Calculates the distance to the closest zero pixel for each pixel of the source image. 3065 3066 The functions distanceTransform calculate the approximate or precise distance from every binary 3067 image pixel to the nearest zero pixel. For zero image pixels, the distance will obviously be zero. 3068 3069 When maskSize == DIST_MASK_PRECISE and distanceType == DIST_L2 , the function runs the 3070 algorithm described in @cite Felzenszwalb04 . This algorithm is parallelized with the TBB library. 3071 3072 In other cases, the algorithm @cite Borgefors86 is used. This means that for a pixel the function 3073 finds the shortest path to the nearest zero pixel consisting of basic shifts: horizontal, vertical, 3074 diagonal, or knight's move (the latest is available for a \f$5\times 5\f$ mask). The overall 3075 distance is calculated as a sum of these basic distances. Since the distance function should be 3076 symmetric, all of the horizontal and vertical shifts must have the same cost (denoted as a ), all 3077 the diagonal shifts must have the same cost (denoted as `b`), and all knight's moves must have the 3078 same cost (denoted as `c`). For the cv::DIST_C and cv::DIST_L1 types, the distance is calculated 3079 precisely, whereas for cv::DIST_L2 (Euclidean distance) the distance can be calculated only with a 3080 relative error (a \f$5\times 5\f$ mask gives more accurate results). For `a`,`b`, and `c`, OpenCV 3081 uses the values suggested in the original paper: 3082 - DIST_L1: `a = 1, b = 2` 3083 - DIST_L2: 3084 - `3 x 3`: `a=0.955, b=1.3693` 3085 - `5 x 5`: `a=1, b=1.4, c=2.1969` 3086 - DIST_C: `a = 1, b = 1` 3087 3088 Typically, for a fast, coarse distance estimation DIST_L2, a \f$3\times 3\f$ mask is used. For a 3089 more accurate distance estimation DIST_L2, a \f$5\times 5\f$ mask or the precise algorithm is used. 3090 Note that both the precise and the approximate algorithms are linear on the number of pixels. 3091 3092 This variant of the function does not only compute the minimum distance for each pixel \f$(x, y)\f$ 3093 but also identifies the nearest connected component consisting of zero pixels 3094 (labelType==DIST_LABEL_CCOMP) or the nearest zero pixel (labelType==DIST_LABEL_PIXEL). Index of the 3095 component/pixel is stored in `labels(x, y)`. When labelType==DIST_LABEL_CCOMP, the function 3096 automatically finds connected components of zero pixels in the input image and marks them with 3097 distinct labels. When labelType==DIST_LABEL_CCOMP, the function scans through the input image and 3098 marks all the zero pixels with distinct labels. 3099 3100 In this mode, the complexity is still linear. That is, the function provides a very fast way to 3101 compute the Voronoi diagram for a binary image. Currently, the second variant can use only the 3102 approximate distance transform algorithm, i.e. maskSize=DIST_MASK_PRECISE is not supported 3103 yet. 3104 3105 @param src 8-bit, single-channel (binary) source image. 3106 @param dst Output image with calculated distances. It is a 8-bit or 32-bit floating-point, 3107 single-channel image of the same size as src. 3108 @param labels Output 2D array of labels (the discrete Voronoi diagram). It has the type 3109 CV_32SC1 and the same size as src. 3110 @param distanceType Type of distance, see cv::DistanceTypes 3111 @param maskSize Size of the distance transform mask, see cv::DistanceTransformMasks. 3112 DIST_MASK_PRECISE is not supported by this variant. In case of the DIST_L1 or DIST_C distance type, 3113 the parameter is forced to 3 because a \f$3\times 3\f$ mask gives the same result as \f$5\times 3114 5\f$ or any larger aperture. 3115 @param labelType Type of the label array to build, see cv::DistanceTransformLabelTypes. 3116 */ 3117 CV_EXPORTS_AS(distanceTransformWithLabels) void distanceTransform( InputArray src, OutputArray dst, 3118 OutputArray labels, int distanceType, int maskSize, 3119 int labelType = DIST_LABEL_CCOMP ); 3120 3121 /** @overload 3122 @param src 8-bit, single-channel (binary) source image. 3123 @param dst Output image with calculated distances. It is a 8-bit or 32-bit floating-point, 3124 single-channel image of the same size as src . 3125 @param distanceType Type of distance, see cv::DistanceTypes 3126 @param maskSize Size of the distance transform mask, see cv::DistanceTransformMasks. In case of the 3127 DIST_L1 or DIST_C distance type, the parameter is forced to 3 because a \f$3\times 3\f$ mask gives 3128 the same result as \f$5\times 5\f$ or any larger aperture. 3129 @param dstType Type of output image. It can be CV_8U or CV_32F. Type CV_8U can be used only for 3130 the first variant of the function and distanceType == DIST_L1. 3131 */ 3132 CV_EXPORTS_W void distanceTransform( InputArray src, OutputArray dst, 3133 int distanceType, int maskSize, int dstType=CV_32F); 3134 3135 /** @example ffilldemo.cpp 3136 An example using the FloodFill technique 3137 */ 3138 3139 /** @overload 3140 3141 variant without `mask` parameter 3142 */ 3143 CV_EXPORTS int floodFill( InputOutputArray image, 3144 Point seedPoint, Scalar newVal, CV_OUT Rect* rect = 0, 3145 Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), 3146 int flags = 4 ); 3147 3148 /** @brief Fills a connected component with the given color. 3149 3150 The functions floodFill fill a connected component starting from the seed point with the specified 3151 color. The connectivity is determined by the color/brightness closeness of the neighbor pixels. The 3152 pixel at \f$(x,y)\f$ is considered to belong to the repainted domain if: 3153 3154 - in case of a grayscale image and floating range 3155 \f[\texttt{src} (x',y')- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} (x',y')+ \texttt{upDiff}\f] 3156 3157 3158 - in case of a grayscale image and fixed range 3159 \f[\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)+ \texttt{upDiff}\f] 3160 3161 3162 - in case of a color image and floating range 3163 \f[\texttt{src} (x',y')_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} (x',y')_r+ \texttt{upDiff} _r,\f] 3164 \f[\texttt{src} (x',y')_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} (x',y')_g+ \texttt{upDiff} _g\f] 3165 and 3166 \f[\texttt{src} (x',y')_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} (x',y')_b+ \texttt{upDiff} _b\f] 3167 3168 3169 - in case of a color image and fixed range 3170 \f[\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r+ \texttt{upDiff} _r,\f] 3171 \f[\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g+ \texttt{upDiff} _g\f] 3172 and 3173 \f[\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b+ \texttt{upDiff} _b\f] 3174 3175 3176 where \f$src(x',y')\f$ is the value of one of pixel neighbors that is already known to belong to the 3177 component. That is, to be added to the connected component, a color/brightness of the pixel should 3178 be close enough to: 3179 - Color/brightness of one of its neighbors that already belong to the connected component in case 3180 of a floating range. 3181 - Color/brightness of the seed point in case of a fixed range. 3182 3183 Use these functions to either mark a connected component with the specified color in-place, or build 3184 a mask and then extract the contour, or copy the region to another image, and so on. 3185 3186 @param image Input/output 1- or 3-channel, 8-bit, or floating-point image. It is modified by the 3187 function unless the FLOODFILL_MASK_ONLY flag is set in the second variant of the function. See 3188 the details below. 3189 @param mask Operation mask that should be a single-channel 8-bit image, 2 pixels wider and 2 pixels 3190 taller than image. Since this is both an input and output parameter, you must take responsibility 3191 of initializing it. Flood-filling cannot go across non-zero pixels in the input mask. For example, 3192 an edge detector output can be used as a mask to stop filling at edges. On output, pixels in the 3193 mask corresponding to filled pixels in the image are set to 1 or to the a value specified in flags 3194 as described below. It is therefore possible to use the same mask in multiple calls to the function 3195 to make sure the filled areas do not overlap. 3196 @param seedPoint Starting point. 3197 @param newVal New value of the repainted domain pixels. 3198 @param loDiff Maximal lower brightness/color difference between the currently observed pixel and 3199 one of its neighbors belonging to the component, or a seed pixel being added to the component. 3200 @param upDiff Maximal upper brightness/color difference between the currently observed pixel and 3201 one of its neighbors belonging to the component, or a seed pixel being added to the component. 3202 @param rect Optional output parameter set by the function to the minimum bounding rectangle of the 3203 repainted domain. 3204 @param flags Operation flags. The first 8 bits contain a connectivity value. The default value of 3205 4 means that only the four nearest neighbor pixels (those that share an edge) are considered. A 3206 connectivity value of 8 means that the eight nearest neighbor pixels (those that share a corner) 3207 will be considered. The next 8 bits (8-16) contain a value between 1 and 255 with which to fill 3208 the mask (the default value is 1). For example, 4 | ( 255 \<\< 8 ) will consider 4 nearest 3209 neighbours and fill the mask with a value of 255. The following additional options occupy higher 3210 bits and therefore may be further combined with the connectivity and mask fill values using 3211 bit-wise or (|), see cv::FloodFillFlags. 3212 3213 @note Since the mask is larger than the filled image, a pixel \f$(x, y)\f$ in image corresponds to the 3214 pixel \f$(x+1, y+1)\f$ in the mask . 3215 3216 @sa findContours 3217 */ 3218 CV_EXPORTS_W int floodFill( InputOutputArray image, InputOutputArray mask, 3219 Point seedPoint, Scalar newVal, CV_OUT Rect* rect=0, 3220 Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), 3221 int flags = 4 ); 3222 3223 /** @brief Converts an image from one color space to another. 3224 3225 The function converts an input image from one color space to another. In case of a transformation 3226 to-from RGB color space, the order of the channels should be specified explicitly (RGB or BGR). Note 3227 that the default color format in OpenCV is often referred to as RGB but it is actually BGR (the 3228 bytes are reversed). So the first byte in a standard (24-bit) color image will be an 8-bit Blue 3229 component, the second byte will be Green, and the third byte will be Red. The fourth, fifth, and 3230 sixth bytes would then be the second pixel (Blue, then Green, then Red), and so on. 3231 3232 The conventional ranges for R, G, and B channel values are: 3233 - 0 to 255 for CV_8U images 3234 - 0 to 65535 for CV_16U images 3235 - 0 to 1 for CV_32F images 3236 3237 In case of linear transformations, the range does not matter. But in case of a non-linear 3238 transformation, an input RGB image should be normalized to the proper value range to get the correct 3239 results, for example, for RGB \f$\rightarrow\f$ L\*u\*v\* transformation. For example, if you have a 3240 32-bit floating-point image directly converted from an 8-bit image without any scaling, then it will 3241 have the 0..255 value range instead of 0..1 assumed by the function. So, before calling cvtColor , 3242 you need first to scale the image down: 3243 @code 3244 img *= 1./255; 3245 cvtColor(img, img, COLOR_BGR2Luv); 3246 @endcode 3247 If you use cvtColor with 8-bit images, the conversion will have some information lost. For many 3248 applications, this will not be noticeable but it is recommended to use 32-bit images in applications 3249 that need the full range of colors or that convert an image before an operation and then convert 3250 back. 3251 3252 If conversion adds the alpha channel, its value will set to the maximum of corresponding channel 3253 range: 255 for CV_8U, 65535 for CV_16U, 1 for CV_32F. 3254 3255 @param src input image: 8-bit unsigned, 16-bit unsigned ( CV_16UC... ), or single-precision 3256 floating-point. 3257 @param dst output image of the same size and depth as src. 3258 @param code color space conversion code (see cv::ColorConversionCodes). 3259 @param dstCn number of channels in the destination image; if the parameter is 0, the number of the 3260 channels is derived automatically from src and code. 3261 3262 @see @ref imgproc_color_conversions 3263 */ 3264 CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 ); 3265 3266 //! @} imgproc_misc 3267 3268 // main function for all demosaicing procceses 3269 CV_EXPORTS_W void demosaicing(InputArray _src, OutputArray _dst, int code, int dcn = 0); 3270 3271 //! @addtogroup imgproc_shape 3272 //! @{ 3273 3274 /** @brief Calculates all of the moments up to the third order of a polygon or rasterized shape. 3275 3276 The function computes moments, up to the 3rd order, of a vector shape or a rasterized shape. The 3277 results are returned in the structure cv::Moments. 3278 3279 @param array Raster image (single-channel, 8-bit or floating-point 2D array) or an array ( 3280 \f$1 \times N\f$ or \f$N \times 1\f$ ) of 2D points (Point or Point2f ). 3281 @param binaryImage If it is true, all non-zero image pixels are treated as 1's. The parameter is 3282 used for images only. 3283 @returns moments. 3284 3285 @sa contourArea, arcLength 3286 */ 3287 CV_EXPORTS_W Moments moments( InputArray array, bool binaryImage = false ); 3288 3289 /** @brief Calculates seven Hu invariants. 3290 3291 The function calculates seven Hu invariants (introduced in @cite Hu62; see also 3292 <http://en.wikipedia.org/wiki/Image_moment>) defined as: 3293 3294 \f[\begin{array}{l} hu[0]= \eta _{20}+ \eta _{02} \\ hu[1]=( \eta _{20}- \eta _{02})^{2}+4 \eta _{11}^{2} \\ hu[2]=( \eta _{30}-3 \eta _{12})^{2}+ (3 \eta _{21}- \eta _{03})^{2} \\ hu[3]=( \eta _{30}+ \eta _{12})^{2}+ ( \eta _{21}+ \eta _{03})^{2} \\ hu[4]=( \eta _{30}-3 \eta _{12})( \eta _{30}+ \eta _{12})[( \eta _{30}+ \eta _{12})^{2}-3( \eta _{21}+ \eta _{03})^{2}]+(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ hu[5]=( \eta _{20}- \eta _{02})[( \eta _{30}+ \eta _{12})^{2}- ( \eta _{21}+ \eta _{03})^{2}]+4 \eta _{11}( \eta _{30}+ \eta _{12})( \eta _{21}+ \eta _{03}) \\ hu[6]=(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}]-( \eta _{30}-3 \eta _{12})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ \end{array}\f] 3295 3296 where \f$\eta_{ji}\f$ stands for \f$\texttt{Moments::nu}_{ji}\f$ . 3297 3298 These values are proved to be invariants to the image scale, rotation, and reflection except the 3299 seventh one, whose sign is changed by reflection. This invariance is proved with the assumption of 3300 infinite image resolution. In case of raster images, the computed Hu invariants for the original and 3301 transformed images are a bit different. 3302 3303 @param moments Input moments computed with moments . 3304 @param hu Output Hu invariants. 3305 3306 @sa matchShapes 3307 */ 3308 CV_EXPORTS void HuMoments( const Moments& moments, double hu[7] ); 3309 3310 /** @overload */ 3311 CV_EXPORTS_W void HuMoments( const Moments& m, OutputArray hu ); 3312 3313 //! @} imgproc_shape 3314 3315 //! @addtogroup imgproc_object 3316 //! @{ 3317 3318 //! type of the template matching operation 3319 enum TemplateMatchModes { 3320 TM_SQDIFF = 0, //!< \f[R(x,y)= \sum _{x',y'} (T(x',y')-I(x+x',y+y'))^2\f] 3321 TM_SQDIFF_NORMED = 1, //!< \f[R(x,y)= \frac{\sum_{x',y'} (T(x',y')-I(x+x',y+y'))^2}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}\f] 3322 TM_CCORR = 2, //!< \f[R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y'))\f] 3323 TM_CCORR_NORMED = 3, //!< \f[R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}\f] 3324 TM_CCOEFF = 4, //!< \f[R(x,y)= \sum _{x',y'} (T'(x',y') \cdot I'(x+x',y+y'))\f] 3325 //!< where 3326 //!< \f[\begin{array}{l} T'(x',y')=T(x',y') - 1/(w \cdot h) \cdot \sum _{x'',y''} T(x'',y'') \\ I'(x+x',y+y')=I(x+x',y+y') - 1/(w \cdot h) \cdot \sum _{x'',y''} I(x+x'',y+y'') \end{array}\f] 3327 TM_CCOEFF_NORMED = 5 //!< \f[R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{ \sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2} }\f] 3328 }; 3329 3330 /** @brief Compares a template against overlapped image regions. 3331 3332 The function slides through image , compares the overlapped patches of size \f$w \times h\f$ against 3333 templ using the specified method and stores the comparison results in result . Here are the formulae 3334 for the available comparison methods ( \f$I\f$ denotes image, \f$T\f$ template, \f$R\f$ result ). The summation 3335 is done over template and/or the image patch: \f$x' = 0...w-1, y' = 0...h-1\f$ 3336 3337 After the function finishes the comparison, the best matches can be found as global minimums (when 3338 TM_SQDIFF was used) or maximums (when TM_CCORR or TM_CCOEFF was used) using the 3339 minMaxLoc function. In case of a color image, template summation in the numerator and each sum in 3340 the denominator is done over all of the channels and separate mean values are used for each channel. 3341 That is, the function can take a color template and a color image. The result will still be a 3342 single-channel image, which is easier to analyze. 3343 3344 @param image Image where the search is running. It must be 8-bit or 32-bit floating-point. 3345 @param templ Searched template. It must be not greater than the source image and have the same 3346 data type. 3347 @param result Map of comparison results. It must be single-channel 32-bit floating-point. If image 3348 is \f$W \times H\f$ and templ is \f$w \times h\f$ , then result is \f$(W-w+1) \times (H-h+1)\f$ . 3349 @param method Parameter specifying the comparison method, see cv::TemplateMatchModes 3350 @param mask Mask of searched template. It must have the same datatype and size with templ. It is 3351 not set by default. 3352 */ 3353 CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ, 3354 OutputArray result, int method, InputArray mask = noArray() ); 3355 3356 //! @} 3357 3358 //! @addtogroup imgproc_shape 3359 //! @{ 3360 3361 /** @brief computes the connected components labeled image of boolean image 3362 3363 image with 4 or 8 way connectivity - returns N, the total number of labels [0, N-1] where 0 3364 represents the background label. ltype specifies the output label image type, an important 3365 consideration based on the total number of labels or alternatively the total number of pixels in 3366 the source image. 3367 3368 @param image the image to be labeled 3369 @param labels destination labeled image 3370 @param connectivity 8 or 4 for 8-way or 4-way connectivity respectively 3371 @param ltype output image label type. Currently CV_32S and CV_16U are supported. 3372 */ 3373 CV_EXPORTS_W int connectedComponents(InputArray image, OutputArray labels, 3374 int connectivity = 8, int ltype = CV_32S); 3375 3376 /** @overload 3377 @param image the image to be labeled 3378 @param labels destination labeled image 3379 @param stats statistics output for each label, including the background label, see below for 3380 available statistics. Statistics are accessed via stats(label, COLUMN) where COLUMN is one of 3381 cv::ConnectedComponentsTypes 3382 @param centroids floating point centroid (x,y) output for each label, including the background label 3383 @param connectivity 8 or 4 for 8-way or 4-way connectivity respectively 3384 @param ltype output image label type. Currently CV_32S and CV_16U are supported. 3385 */ 3386 CV_EXPORTS_W int connectedComponentsWithStats(InputArray image, OutputArray labels, 3387 OutputArray stats, OutputArray centroids, 3388 int connectivity = 8, int ltype = CV_32S); 3389 3390 3391 /** @brief Finds contours in a binary image. 3392 3393 The function retrieves contours from the binary image using the algorithm @cite Suzuki85 . The contours 3394 are a useful tool for shape analysis and object detection and recognition. See squares.c in the 3395 OpenCV sample directory. 3396 3397 @note Source image is modified by this function. Also, the function does not take into account 3398 1-pixel border of the image (it's filled with 0's and used for neighbor analysis in the algorithm), 3399 therefore the contours touching the image border will be clipped. 3400 3401 @param image Source, an 8-bit single-channel image. Non-zero pixels are treated as 1's. Zero 3402 pixels remain 0's, so the image is treated as binary . You can use compare , inRange , threshold , 3403 adaptiveThreshold , Canny , and others to create a binary image out of a grayscale or color one. 3404 The function modifies the image while extracting the contours. If mode equals to RETR_CCOMP 3405 or RETR_FLOODFILL, the input can also be a 32-bit integer image of labels (CV_32SC1). 3406 @param contours Detected contours. Each contour is stored as a vector of points. 3407 @param hierarchy Optional output vector, containing information about the image topology. It has 3408 as many elements as the number of contours. For each i-th contour contours[i] , the elements 3409 hierarchy[i][0] , hiearchy[i][1] , hiearchy[i][2] , and hiearchy[i][3] are set to 0-based indices 3410 in contours of the next and previous contours at the same hierarchical level, the first child 3411 contour and the parent contour, respectively. If for the contour i there are no next, previous, 3412 parent, or nested contours, the corresponding elements of hierarchy[i] will be negative. 3413 @param mode Contour retrieval mode, see cv::RetrievalModes 3414 @param method Contour approximation method, see cv::ContourApproximationModes 3415 @param offset Optional offset by which every contour point is shifted. This is useful if the 3416 contours are extracted from the image ROI and then they should be analyzed in the whole image 3417 context. 3418 */ 3419 CV_EXPORTS_W void findContours( InputOutputArray image, OutputArrayOfArrays contours, 3420 OutputArray hierarchy, int mode, 3421 int method, Point offset = Point()); 3422 3423 /** @overload */ 3424 CV_EXPORTS void findContours( InputOutputArray image, OutputArrayOfArrays contours, 3425 int mode, int method, Point offset = Point()); 3426 3427 /** @brief Approximates a polygonal curve(s) with the specified precision. 3428 3429 The functions approxPolyDP approximate a curve or a polygon with another curve/polygon with less 3430 vertices so that the distance between them is less or equal to the specified precision. It uses the 3431 Douglas-Peucker algorithm <http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm> 3432 3433 @param curve Input vector of a 2D point stored in std::vector or Mat 3434 @param approxCurve Result of the approximation. The type should match the type of the input curve. 3435 @param epsilon Parameter specifying the approximation accuracy. This is the maximum distance 3436 between the original curve and its approximation. 3437 @param closed If true, the approximated curve is closed (its first and last vertices are 3438 connected). Otherwise, it is not closed. 3439 */ 3440 CV_EXPORTS_W void approxPolyDP( InputArray curve, 3441 OutputArray approxCurve, 3442 double epsilon, bool closed ); 3443 3444 /** @brief Calculates a contour perimeter or a curve length. 3445 3446 The function computes a curve length or a closed contour perimeter. 3447 3448 @param curve Input vector of 2D points, stored in std::vector or Mat. 3449 @param closed Flag indicating whether the curve is closed or not. 3450 */ 3451 CV_EXPORTS_W double arcLength( InputArray curve, bool closed ); 3452 3453 /** @brief Calculates the up-right bounding rectangle of a point set. 3454 3455 The function calculates and returns the minimal up-right bounding rectangle for the specified point set. 3456 3457 @param points Input 2D point set, stored in std::vector or Mat. 3458 */ 3459 CV_EXPORTS_W Rect boundingRect( InputArray points ); 3460 3461 /** @brief Calculates a contour area. 3462 3463 The function computes a contour area. Similarly to moments , the area is computed using the Green 3464 formula. Thus, the returned area and the number of non-zero pixels, if you draw the contour using 3465 drawContours or fillPoly , can be different. Also, the function will most certainly give a wrong 3466 results for contours with self-intersections. 3467 3468 Example: 3469 @code 3470 vector<Point> contour; 3471 contour.push_back(Point2f(0, 0)); 3472 contour.push_back(Point2f(10, 0)); 3473 contour.push_back(Point2f(10, 10)); 3474 contour.push_back(Point2f(5, 4)); 3475 3476 double area0 = contourArea(contour); 3477 vector<Point> approx; 3478 approxPolyDP(contour, approx, 5, true); 3479 double area1 = contourArea(approx); 3480 3481 cout << "area0 =" << area0 << endl << 3482 "area1 =" << area1 << endl << 3483 "approx poly vertices" << approx.size() << endl; 3484 @endcode 3485 @param contour Input vector of 2D points (contour vertices), stored in std::vector or Mat. 3486 @param oriented Oriented area flag. If it is true, the function returns a signed area value, 3487 depending on the contour orientation (clockwise or counter-clockwise). Using this feature you can 3488 determine orientation of a contour by taking the sign of an area. By default, the parameter is 3489 false, which means that the absolute value is returned. 3490 */ 3491 CV_EXPORTS_W double contourArea( InputArray contour, bool oriented = false ); 3492 3493 /** @brief Finds a rotated rectangle of the minimum area enclosing the input 2D point set. 3494 3495 The function calculates and returns the minimum-area bounding rectangle (possibly rotated) for a 3496 specified point set. See the OpenCV sample minarea.cpp . Developer should keep in mind that the 3497 returned rotatedRect can contain negative indices when data is close to the containing Mat element 3498 boundary. 3499 3500 @param points Input vector of 2D points, stored in std::vector\<\> or Mat 3501 */ 3502 CV_EXPORTS_W RotatedRect minAreaRect( InputArray points ); 3503 3504 /** @brief Finds the four vertices of a rotated rect. Useful to draw the rotated rectangle. 3505 3506 The function finds the four vertices of a rotated rectangle. This function is useful to draw the 3507 rectangle. In C++, instead of using this function, you can directly use box.points() method. Please 3508 visit the [tutorial on bounding 3509 rectangle](http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html#bounding-rects-circles) 3510 for more information. 3511 3512 @param box The input rotated rectangle. It may be the output of 3513 @param points The output array of four vertices of rectangles. 3514 */ 3515 CV_EXPORTS_W void boxPoints(RotatedRect box, OutputArray points); 3516 3517 /** @brief Finds a circle of the minimum area enclosing a 2D point set. 3518 3519 The function finds the minimal enclosing circle of a 2D point set using an iterative algorithm. See 3520 the OpenCV sample minarea.cpp . 3521 3522 @param points Input vector of 2D points, stored in std::vector\<\> or Mat 3523 @param center Output center of the circle. 3524 @param radius Output radius of the circle. 3525 */ 3526 CV_EXPORTS_W void minEnclosingCircle( InputArray points, 3527 CV_OUT Point2f& center, CV_OUT float& radius ); 3528 3529 /** @example minarea.cpp 3530 */ 3531 3532 /** @brief Finds a triangle of minimum area enclosing a 2D point set and returns its area. 3533 3534 The function finds a triangle of minimum area enclosing the given set of 2D points and returns its 3535 area. The output for a given 2D point set is shown in the image below. 2D points are depicted in 3536 *red* and the enclosing triangle in *yellow*. 3537 3538 ![Sample output of the minimum enclosing triangle function](pics/minenclosingtriangle.png) 3539 3540 The implementation of the algorithm is based on O'Rourke's @cite ORourke86 and Klee and Laskowski's 3541 @cite KleeLaskowski85 papers. O'Rourke provides a \f$\theta(n)\f$ algorithm for finding the minimal 3542 enclosing triangle of a 2D convex polygon with n vertices. Since the minEnclosingTriangle function 3543 takes a 2D point set as input an additional preprocessing step of computing the convex hull of the 3544 2D point set is required. The complexity of the convexHull function is \f$O(n log(n))\f$ which is higher 3545 than \f$\theta(n)\f$. Thus the overall complexity of the function is \f$O(n log(n))\f$. 3546 3547 @param points Input vector of 2D points with depth CV_32S or CV_32F, stored in std::vector\<\> or Mat 3548 @param triangle Output vector of three 2D points defining the vertices of the triangle. The depth 3549 of the OutputArray must be CV_32F. 3550 */ 3551 CV_EXPORTS_W double minEnclosingTriangle( InputArray points, CV_OUT OutputArray triangle ); 3552 3553 /** @brief Compares two shapes. 3554 3555 The function compares two shapes. All three implemented methods use the Hu invariants (see cv::HuMoments) 3556 3557 @param contour1 First contour or grayscale image. 3558 @param contour2 Second contour or grayscale image. 3559 @param method Comparison method, see ::ShapeMatchModes 3560 @param parameter Method-specific parameter (not supported now). 3561 */ 3562 CV_EXPORTS_W double matchShapes( InputArray contour1, InputArray contour2, 3563 int method, double parameter ); 3564 3565 /** @example convexhull.cpp 3566 An example using the convexHull functionality 3567 */ 3568 3569 /** @brief Finds the convex hull of a point set. 3570 3571 The functions find the convex hull of a 2D point set using the Sklansky's algorithm @cite Sklansky82 3572 that has *O(N logN)* complexity in the current implementation. See the OpenCV sample convexhull.cpp 3573 that demonstrates the usage of different function variants. 3574 3575 @param points Input 2D point set, stored in std::vector or Mat. 3576 @param hull Output convex hull. It is either an integer vector of indices or vector of points. In 3577 the first case, the hull elements are 0-based indices of the convex hull points in the original 3578 array (since the set of convex hull points is a subset of the original point set). In the second 3579 case, hull elements are the convex hull points themselves. 3580 @param clockwise Orientation flag. If it is true, the output convex hull is oriented clockwise. 3581 Otherwise, it is oriented counter-clockwise. The assumed coordinate system has its X axis pointing 3582 to the right, and its Y axis pointing upwards. 3583 @param returnPoints Operation flag. In case of a matrix, when the flag is true, the function 3584 returns convex hull points. Otherwise, it returns indices of the convex hull points. When the 3585 output array is std::vector, the flag is ignored, and the output depends on the type of the 3586 vector: std::vector\<int\> implies returnPoints=true, std::vector\<Point\> implies 3587 returnPoints=false. 3588 */ 3589 CV_EXPORTS_W void convexHull( InputArray points, OutputArray hull, 3590 bool clockwise = false, bool returnPoints = true ); 3591 3592 /** @brief Finds the convexity defects of a contour. 3593 3594 The figure below displays convexity defects of a hand contour: 3595 3596 ![image](pics/defects.png) 3597 3598 @param contour Input contour. 3599 @param convexhull Convex hull obtained using convexHull that should contain indices of the contour 3600 points that make the hull. 3601 @param convexityDefects The output vector of convexity defects. In C++ and the new Python/Java 3602 interface each convexity defect is represented as 4-element integer vector (a.k.a. cv::Vec4i): 3603 (start_index, end_index, farthest_pt_index, fixpt_depth), where indices are 0-based indices 3604 in the original contour of the convexity defect beginning, end and the farthest point, and 3605 fixpt_depth is fixed-point approximation (with 8 fractional bits) of the distance between the 3606 farthest contour point and the hull. That is, to get the floating-point value of the depth will be 3607 fixpt_depth/256.0. 3608 */ 3609 CV_EXPORTS_W void convexityDefects( InputArray contour, InputArray convexhull, OutputArray convexityDefects ); 3610 3611 /** @brief Tests a contour convexity. 3612 3613 The function tests whether the input contour is convex or not. The contour must be simple, that is, 3614 without self-intersections. Otherwise, the function output is undefined. 3615 3616 @param contour Input vector of 2D points, stored in std::vector\<\> or Mat 3617 */ 3618 CV_EXPORTS_W bool isContourConvex( InputArray contour ); 3619 3620 //! finds intersection of two convex polygons 3621 CV_EXPORTS_W float intersectConvexConvex( InputArray _p1, InputArray _p2, 3622 OutputArray _p12, bool handleNested = true ); 3623 3624 /** @example fitellipse.cpp 3625 An example using the fitEllipse technique 3626 */ 3627 3628 /** @brief Fits an ellipse around a set of 2D points. 3629 3630 The function calculates the ellipse that fits (in a least-squares sense) a set of 2D points best of 3631 all. It returns the rotated rectangle in which the ellipse is inscribed. The first algorithm described by @cite Fitzgibbon95 3632 is used. Developer should keep in mind that it is possible that the returned 3633 ellipse/rotatedRect data contains negative indices, due to the data points being close to the 3634 border of the containing Mat element. 3635 3636 @param points Input 2D point set, stored in std::vector\<\> or Mat 3637 */ 3638 CV_EXPORTS_W RotatedRect fitEllipse( InputArray points ); 3639 3640 /** @brief Fits a line to a 2D or 3D point set. 3641 3642 The function fitLine fits a line to a 2D or 3D point set by minimizing \f$\sum_i \rho(r_i)\f$ where 3643 \f$r_i\f$ is a distance between the \f$i^{th}\f$ point, the line and \f$\rho(r)\f$ is a distance function, one 3644 of the following: 3645 - DIST_L2 3646 \f[\rho (r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)}\f] 3647 - DIST_L1 3648 \f[\rho (r) = r\f] 3649 - DIST_L12 3650 \f[\rho (r) = 2 \cdot ( \sqrt{1 + \frac{r^2}{2}} - 1)\f] 3651 - DIST_FAIR 3652 \f[\rho \left (r \right ) = C^2 \cdot \left ( \frac{r}{C} - \log{\left(1 + \frac{r}{C}\right)} \right ) \quad \text{where} \quad C=1.3998\f] 3653 - DIST_WELSCH 3654 \f[\rho \left (r \right ) = \frac{C^2}{2} \cdot \left ( 1 - \exp{\left(-\left(\frac{r}{C}\right)^2\right)} \right ) \quad \text{where} \quad C=2.9846\f] 3655 - DIST_HUBER 3656 \f[\rho (r) = \fork{r^2/2}{if \(r < C\)}{C \cdot (r-C/2)}{otherwise} \quad \text{where} \quad C=1.345\f] 3657 3658 The algorithm is based on the M-estimator ( <http://en.wikipedia.org/wiki/M-estimator> ) technique 3659 that iteratively fits the line using the weighted least-squares algorithm. After each iteration the 3660 weights \f$w_i\f$ are adjusted to be inversely proportional to \f$\rho(r_i)\f$ . 3661 3662 @param points Input vector of 2D or 3D points, stored in std::vector\<\> or Mat. 3663 @param line Output line parameters. In case of 2D fitting, it should be a vector of 4 elements 3664 (like Vec4f) - (vx, vy, x0, y0), where (vx, vy) is a normalized vector collinear to the line and 3665 (x0, y0) is a point on the line. In case of 3D fitting, it should be a vector of 6 elements (like 3666 Vec6f) - (vx, vy, vz, x0, y0, z0), where (vx, vy, vz) is a normalized vector collinear to the line 3667 and (x0, y0, z0) is a point on the line. 3668 @param distType Distance used by the M-estimator, see cv::DistanceTypes 3669 @param param Numerical parameter ( C ) for some types of distances. If it is 0, an optimal value 3670 is chosen. 3671 @param reps Sufficient accuracy for the radius (distance between the coordinate origin and the line). 3672 @param aeps Sufficient accuracy for the angle. 0.01 would be a good default value for reps and aeps. 3673 */ 3674 CV_EXPORTS_W void fitLine( InputArray points, OutputArray line, int distType, 3675 double param, double reps, double aeps ); 3676 3677 /** @brief Performs a point-in-contour test. 3678 3679 The function determines whether the point is inside a contour, outside, or lies on an edge (or 3680 coincides with a vertex). It returns positive (inside), negative (outside), or zero (on an edge) 3681 value, correspondingly. When measureDist=false , the return value is +1, -1, and 0, respectively. 3682 Otherwise, the return value is a signed distance between the point and the nearest contour edge. 3683 3684 See below a sample output of the function where each image pixel is tested against the contour: 3685 3686 ![sample output](pics/pointpolygon.png) 3687 3688 @param contour Input contour. 3689 @param pt Point tested against the contour. 3690 @param measureDist If true, the function estimates the signed distance from the point to the 3691 nearest contour edge. Otherwise, the function only checks if the point is inside a contour or not. 3692 */ 3693 CV_EXPORTS_W double pointPolygonTest( InputArray contour, Point2f pt, bool measureDist ); 3694 3695 /** @brief Finds out if there is any intersection between two rotated rectangles. 3696 3697 If there is then the vertices of the interesecting region are returned as well. 3698 3699 Below are some examples of intersection configurations. The hatched pattern indicates the 3700 intersecting region and the red vertices are returned by the function. 3701 3702 ![intersection examples](pics/intersection.png) 3703 3704 @param rect1 First rectangle 3705 @param rect2 Second rectangle 3706 @param intersectingRegion The output array of the verticies of the intersecting region. It returns 3707 at most 8 vertices. Stored as std::vector\<cv::Point2f\> or cv::Mat as Mx1 of type CV_32FC2. 3708 @returns One of cv::RectanglesIntersectTypes 3709 */ 3710 CV_EXPORTS_W int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& rect2, OutputArray intersectingRegion ); 3711 3712 //! @} imgproc_shape 3713 3714 CV_EXPORTS_W Ptr<CLAHE> createCLAHE(double clipLimit = 40.0, Size tileGridSize = Size(8, 8)); 3715 3716 //! Ballard, D.H. (1981). Generalizing the Hough transform to detect arbitrary shapes. Pattern Recognition 13 (2): 111-122. 3717 //! Detects position only without traslation and rotation 3718 CV_EXPORTS Ptr<GeneralizedHoughBallard> createGeneralizedHoughBallard(); 3719 3720 //! Guil, N., Gonzlez-Linares, J.M. and Zapata, E.L. (1999). Bidimensional shape detection using an invariant approach. Pattern Recognition 32 (6): 1025-1038. 3721 //! Detects position, traslation and rotation 3722 CV_EXPORTS Ptr<GeneralizedHoughGuil> createGeneralizedHoughGuil(); 3723 3724 //! Performs linear blending of two images 3725 CV_EXPORTS void blendLinear(InputArray src1, InputArray src2, InputArray weights1, InputArray weights2, OutputArray dst); 3726 3727 //! @addtogroup imgproc_colormap 3728 //! @{ 3729 3730 //! GNU Octave/MATLAB equivalent colormaps 3731 enum ColormapTypes 3732 { 3733 COLORMAP_AUTUMN = 0, //!< ![autumn](pics/colormaps/colorscale_autumn.jpg) 3734 COLORMAP_BONE = 1, //!< ![bone](pics/colormaps/colorscale_bone.jpg) 3735 COLORMAP_JET = 2, //!< ![jet](pics/colormaps/colorscale_jet.jpg) 3736 COLORMAP_WINTER = 3, //!< ![winter](pics/colormaps/colorscale_winter.jpg) 3737 COLORMAP_RAINBOW = 4, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg) 3738 COLORMAP_OCEAN = 5, //!< ![ocean](pics/colormaps/colorscale_ocean.jpg) 3739 COLORMAP_SUMMER = 6, //!< ![summer](pics/colormaps/colorscale_summer.jpg) 3740 COLORMAP_SPRING = 7, //!< ![spring](pics/colormaps/colorscale_spring.jpg) 3741 COLORMAP_COOL = 8, //!< ![cool](pics/colormaps/colorscale_cool.jpg) 3742 COLORMAP_HSV = 9, //!< ![HSV](pics/colormaps/colorscale_hsv.jpg) 3743 COLORMAP_PINK = 10, //!< ![pink](pics/colormaps/colorscale_pink.jpg) 3744 COLORMAP_HOT = 11, //!< ![hot](pics/colormaps/colorscale_hot.jpg) 3745 COLORMAP_PARULA = 12 //!< ![hot](pics/colormaps/colorscale_parula.jpg) 3746 }; 3747 3748 /** @brief Applies a GNU Octave/MATLAB equivalent colormap on a given image. 3749 3750 @param src The source image, grayscale or colored does not matter. 3751 @param dst The result is the colormapped source image. Note: Mat::create is called on dst. 3752 @param colormap The colormap to apply, see cv::ColormapTypes 3753 */ 3754 CV_EXPORTS_W void applyColorMap(InputArray src, OutputArray dst, int colormap); 3755 3756 //! @} imgproc_colormap 3757 3758 //! @addtogroup imgproc_draw 3759 //! @{ 3760 3761 /** @brief Draws a line segment connecting two points. 3762 3763 The function line draws the line segment between pt1 and pt2 points in the image. The line is 3764 clipped by the image boundaries. For non-antialiased lines with integer coordinates, the 8-connected 3765 or 4-connected Bresenham algorithm is used. Thick lines are drawn with rounding endings. Antialiased 3766 lines are drawn using Gaussian filtering. 3767 3768 @param img Image. 3769 @param pt1 First point of the line segment. 3770 @param pt2 Second point of the line segment. 3771 @param color Line color. 3772 @param thickness Line thickness. 3773 @param lineType Type of the line, see cv::LineTypes. 3774 @param shift Number of fractional bits in the point coordinates. 3775 */ 3776 CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, 3777 int thickness = 1, int lineType = LINE_8, int shift = 0); 3778 3779 /** @brief Draws a arrow segment pointing from the first point to the second one. 3780 3781 The function arrowedLine draws an arrow between pt1 and pt2 points in the image. See also cv::line. 3782 3783 @param img Image. 3784 @param pt1 The point the arrow starts from. 3785 @param pt2 The point the arrow points to. 3786 @param color Line color. 3787 @param thickness Line thickness. 3788 @param line_type Type of the line, see cv::LineTypes 3789 @param shift Number of fractional bits in the point coordinates. 3790 @param tipLength The length of the arrow tip in relation to the arrow length 3791 */ 3792 CV_EXPORTS_W void arrowedLine(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, 3793 int thickness=1, int line_type=8, int shift=0, double tipLength=0.1); 3794 3795 /** @brief Draws a simple, thick, or filled up-right rectangle. 3796 3797 The function rectangle draws a rectangle outline or a filled rectangle whose two opposite corners 3798 are pt1 and pt2. 3799 3800 @param img Image. 3801 @param pt1 Vertex of the rectangle. 3802 @param pt2 Vertex of the rectangle opposite to pt1 . 3803 @param color Rectangle color or brightness (grayscale image). 3804 @param thickness Thickness of lines that make up the rectangle. Negative values, like CV_FILLED , 3805 mean that the function has to draw a filled rectangle. 3806 @param lineType Type of the line. See the line description. 3807 @param shift Number of fractional bits in the point coordinates. 3808 */ 3809 CV_EXPORTS_W void rectangle(InputOutputArray img, Point pt1, Point pt2, 3810 const Scalar& color, int thickness = 1, 3811 int lineType = LINE_8, int shift = 0); 3812 3813 /** @overload 3814 3815 use `rec` parameter as alternative specification of the drawn rectangle: `r.tl() and 3816 r.br()-Point(1,1)` are opposite corners 3817 */ 3818 CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec, 3819 const Scalar& color, int thickness = 1, 3820 int lineType = LINE_8, int shift = 0); 3821 3822 /** @brief Draws a circle. 3823 3824 The function circle draws a simple or filled circle with a given center and radius. 3825 @param img Image where the circle is drawn. 3826 @param center Center of the circle. 3827 @param radius Radius of the circle. 3828 @param color Circle color. 3829 @param thickness Thickness of the circle outline, if positive. Negative thickness means that a 3830 filled circle is to be drawn. 3831 @param lineType Type of the circle boundary. See the line description. 3832 @param shift Number of fractional bits in the coordinates of the center and in the radius value. 3833 */ 3834 CV_EXPORTS_W void circle(InputOutputArray img, Point center, int radius, 3835 const Scalar& color, int thickness = 1, 3836 int lineType = LINE_8, int shift = 0); 3837 3838 /** @brief Draws a simple or thick elliptic arc or fills an ellipse sector. 3839 3840 The functions ellipse with less parameters draw an ellipse outline, a filled ellipse, an elliptic 3841 arc, or a filled ellipse sector. A piecewise-linear curve is used to approximate the elliptic arc 3842 boundary. If you need more control of the ellipse rendering, you can retrieve the curve using 3843 ellipse2Poly and then render it with polylines or fill it with fillPoly . If you use the first 3844 variant of the function and want to draw the whole ellipse, not an arc, pass startAngle=0 and 3845 endAngle=360 . The figure below explains the meaning of the parameters. 3846 3847 ![Parameters of Elliptic Arc](pics/ellipse.png) 3848 3849 @param img Image. 3850 @param center Center of the ellipse. 3851 @param axes Half of the size of the ellipse main axes. 3852 @param angle Ellipse rotation angle in degrees. 3853 @param startAngle Starting angle of the elliptic arc in degrees. 3854 @param endAngle Ending angle of the elliptic arc in degrees. 3855 @param color Ellipse color. 3856 @param thickness Thickness of the ellipse arc outline, if positive. Otherwise, this indicates that 3857 a filled ellipse sector is to be drawn. 3858 @param lineType Type of the ellipse boundary. See the line description. 3859 @param shift Number of fractional bits in the coordinates of the center and values of axes. 3860 */ 3861 CV_EXPORTS_W void ellipse(InputOutputArray img, Point center, Size axes, 3862 double angle, double startAngle, double endAngle, 3863 const Scalar& color, int thickness = 1, 3864 int lineType = LINE_8, int shift = 0); 3865 3866 /** @overload 3867 @param img Image. 3868 @param box Alternative ellipse representation via RotatedRect. This means that the function draws 3869 an ellipse inscribed in the rotated rectangle. 3870 @param color Ellipse color. 3871 @param thickness Thickness of the ellipse arc outline, if positive. Otherwise, this indicates that 3872 a filled ellipse sector is to be drawn. 3873 @param lineType Type of the ellipse boundary. See the line description. 3874 */ 3875 CV_EXPORTS_W void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color, 3876 int thickness = 1, int lineType = LINE_8); 3877 3878 /** @overload */ 3879 CV_EXPORTS void fillConvexPoly(Mat& img, const Point* pts, int npts, 3880 const Scalar& color, int lineType = LINE_8, 3881 int shift = 0); 3882 3883 /** @brief Fills a convex polygon. 3884 3885 The function fillConvexPoly draws a filled convex polygon. This function is much faster than the 3886 function cv::fillPoly . It can fill not only convex polygons but any monotonic polygon without 3887 self-intersections, that is, a polygon whose contour intersects every horizontal line (scan line) 3888 twice at the most (though, its top-most and/or the bottom edge could be horizontal). 3889 3890 @param img Image. 3891 @param points Polygon vertices. 3892 @param color Polygon color. 3893 @param lineType Type of the polygon boundaries. See the line description. 3894 @param shift Number of fractional bits in the vertex coordinates. 3895 */ 3896 CV_EXPORTS_W void fillConvexPoly(InputOutputArray img, InputArray points, 3897 const Scalar& color, int lineType = LINE_8, 3898 int shift = 0); 3899 3900 /** @overload */ 3901 CV_EXPORTS void fillPoly(Mat& img, const Point** pts, 3902 const int* npts, int ncontours, 3903 const Scalar& color, int lineType = LINE_8, int shift = 0, 3904 Point offset = Point() ); 3905 3906 /** @brief Fills the area bounded by one or more polygons. 3907 3908 The function fillPoly fills an area bounded by several polygonal contours. The function can fill 3909 complex areas, for example, areas with holes, contours with self-intersections (some of their 3910 parts), and so forth. 3911 3912 @param img Image. 3913 @param pts Array of polygons where each polygon is represented as an array of points. 3914 @param color Polygon color. 3915 @param lineType Type of the polygon boundaries. See the line description. 3916 @param shift Number of fractional bits in the vertex coordinates. 3917 @param offset Optional offset of all points of the contours. 3918 */ 3919 CV_EXPORTS_W void fillPoly(InputOutputArray img, InputArrayOfArrays pts, 3920 const Scalar& color, int lineType = LINE_8, int shift = 0, 3921 Point offset = Point() ); 3922 3923 /** @overload */ 3924 CV_EXPORTS void polylines(Mat& img, const Point* const* pts, const int* npts, 3925 int ncontours, bool isClosed, const Scalar& color, 3926 int thickness = 1, int lineType = LINE_8, int shift = 0 ); 3927 3928 /** @brief Draws several polygonal curves. 3929 3930 @param img Image. 3931 @param pts Array of polygonal curves. 3932 @param isClosed Flag indicating whether the drawn polylines are closed or not. If they are closed, 3933 the function draws a line from the last vertex of each curve to its first vertex. 3934 @param color Polyline color. 3935 @param thickness Thickness of the polyline edges. 3936 @param lineType Type of the line segments. See the line description. 3937 @param shift Number of fractional bits in the vertex coordinates. 3938 3939 The function polylines draws one or more polygonal curves. 3940 */ 3941 CV_EXPORTS_W void polylines(InputOutputArray img, InputArrayOfArrays pts, 3942 bool isClosed, const Scalar& color, 3943 int thickness = 1, int lineType = LINE_8, int shift = 0 ); 3944 3945 /** @example contours2.cpp 3946 An example using the drawContour functionality 3947 */ 3948 3949 /** @example segment_objects.cpp 3950 An example using drawContours to clean up a background segmentation result 3951 */ 3952 3953 /** @brief Draws contours outlines or filled contours. 3954 3955 The function draws contour outlines in the image if \f$\texttt{thickness} \ge 0\f$ or fills the area 3956 bounded by the contours if \f$\texttt{thickness}<0\f$ . The example below shows how to retrieve 3957 connected components from the binary image and label them: : 3958 @code 3959 #include "opencv2/imgproc.hpp" 3960 #include "opencv2/highgui.hpp" 3961 3962 using namespace cv; 3963 using namespace std; 3964 3965 int main( int argc, char** argv ) 3966 { 3967 Mat src; 3968 // the first command-line parameter must be a filename of the binary 3969 // (black-n-white) image 3970 if( argc != 2 || !(src=imread(argv[1], 0)).data) 3971 return -1; 3972 3973 Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3); 3974 3975 src = src > 1; 3976 namedWindow( "Source", 1 ); 3977 imshow( "Source", src ); 3978 3979 vector<vector<Point> > contours; 3980 vector<Vec4i> hierarchy; 3981 3982 findContours( src, contours, hierarchy, 3983 RETR_CCOMP, CHAIN_APPROX_SIMPLE ); 3984 3985 // iterate through all the top-level contours, 3986 // draw each connected component with its own random color 3987 int idx = 0; 3988 for( ; idx >= 0; idx = hierarchy[idx][0] ) 3989 { 3990 Scalar color( rand()&255, rand()&255, rand()&255 ); 3991 drawContours( dst, contours, idx, color, FILLED, 8, hierarchy ); 3992 } 3993 3994 namedWindow( "Components", 1 ); 3995 imshow( "Components", dst ); 3996 waitKey(0); 3997 } 3998 @endcode 3999 4000 @param image Destination image. 4001 @param contours All the input contours. Each contour is stored as a point vector. 4002 @param contourIdx Parameter indicating a contour to draw. If it is negative, all the contours are drawn. 4003 @param color Color of the contours. 4004 @param thickness Thickness of lines the contours are drawn with. If it is negative (for example, 4005 thickness=CV_FILLED ), the contour interiors are drawn. 4006 @param lineType Line connectivity. See cv::LineTypes. 4007 @param hierarchy Optional information about hierarchy. It is only needed if you want to draw only 4008 some of the contours (see maxLevel ). 4009 @param maxLevel Maximal level for drawn contours. If it is 0, only the specified contour is drawn. 4010 If it is 1, the function draws the contour(s) and all the nested contours. If it is 2, the function 4011 draws the contours, all the nested contours, all the nested-to-nested contours, and so on. This 4012 parameter is only taken into account when there is hierarchy available. 4013 @param offset Optional contour shift parameter. Shift all the drawn contours by the specified 4014 \f$\texttt{offset}=(dx,dy)\f$ . 4015 */ 4016 CV_EXPORTS_W void drawContours( InputOutputArray image, InputArrayOfArrays contours, 4017 int contourIdx, const Scalar& color, 4018 int thickness = 1, int lineType = LINE_8, 4019 InputArray hierarchy = noArray(), 4020 int maxLevel = INT_MAX, Point offset = Point() ); 4021 4022 /** @brief Clips the line against the image rectangle. 4023 4024 The functions clipLine calculate a part of the line segment that is entirely within the specified 4025 rectangle. They return false if the line segment is completely outside the rectangle. Otherwise, 4026 they return true . 4027 @param imgSize Image size. The image rectangle is Rect(0, 0, imgSize.width, imgSize.height) . 4028 @param pt1 First line point. 4029 @param pt2 Second line point. 4030 */ 4031 CV_EXPORTS bool clipLine(Size imgSize, CV_IN_OUT Point& pt1, CV_IN_OUT Point& pt2); 4032 4033 /** @overload 4034 @param imgRect Image rectangle. 4035 @param pt1 First line point. 4036 @param pt2 Second line point. 4037 */ 4038 CV_EXPORTS_W bool clipLine(Rect imgRect, CV_OUT CV_IN_OUT Point& pt1, CV_OUT CV_IN_OUT Point& pt2); 4039 4040 /** @brief Approximates an elliptic arc with a polyline. 4041 4042 The function ellipse2Poly computes the vertices of a polyline that approximates the specified 4043 elliptic arc. It is used by cv::ellipse. 4044 4045 @param center Center of the arc. 4046 @param axes Half of the size of the ellipse main axes. See the ellipse for details. 4047 @param angle Rotation angle of the ellipse in degrees. See the ellipse for details. 4048 @param arcStart Starting angle of the elliptic arc in degrees. 4049 @param arcEnd Ending angle of the elliptic arc in degrees. 4050 @param delta Angle between the subsequent polyline vertices. It defines the approximation 4051 accuracy. 4052 @param pts Output vector of polyline vertices. 4053 */ 4054 CV_EXPORTS_W void ellipse2Poly( Point center, Size axes, int angle, 4055 int arcStart, int arcEnd, int delta, 4056 CV_OUT std::vector<Point>& pts ); 4057 4058 /** @brief Draws a text string. 4059 4060 The function putText renders the specified text string in the image. Symbols that cannot be rendered 4061 using the specified font are replaced by question marks. See getTextSize for a text rendering code 4062 example. 4063 4064 @param img Image. 4065 @param text Text string to be drawn. 4066 @param org Bottom-left corner of the text string in the image. 4067 @param fontFace Font type, see cv::HersheyFonts. 4068 @param fontScale Font scale factor that is multiplied by the font-specific base size. 4069 @param color Text color. 4070 @param thickness Thickness of the lines used to draw a text. 4071 @param lineType Line type. See the line for details. 4072 @param bottomLeftOrigin When true, the image data origin is at the bottom-left corner. Otherwise, 4073 it is at the top-left corner. 4074 */ 4075 CV_EXPORTS_W void putText( InputOutputArray img, const String& text, Point org, 4076 int fontFace, double fontScale, Scalar color, 4077 int thickness = 1, int lineType = LINE_8, 4078 bool bottomLeftOrigin = false ); 4079 4080 /** @brief Calculates the width and height of a text string. 4081 4082 The function getTextSize calculates and returns the size of a box that contains the specified text. 4083 That is, the following code renders some text, the tight box surrounding it, and the baseline: : 4084 @code 4085 String text = "Funny text inside the box"; 4086 int fontFace = FONT_HERSHEY_SCRIPT_SIMPLEX; 4087 double fontScale = 2; 4088 int thickness = 3; 4089 4090 Mat img(600, 800, CV_8UC3, Scalar::all(0)); 4091 4092 int baseline=0; 4093 Size textSize = getTextSize(text, fontFace, 4094 fontScale, thickness, &baseline); 4095 baseline += thickness; 4096 4097 // center the text 4098 Point textOrg((img.cols - textSize.width)/2, 4099 (img.rows + textSize.height)/2); 4100 4101 // draw the box 4102 rectangle(img, textOrg + Point(0, baseline), 4103 textOrg + Point(textSize.width, -textSize.height), 4104 Scalar(0,0,255)); 4105 // ... and the baseline first 4106 line(img, textOrg + Point(0, thickness), 4107 textOrg + Point(textSize.width, thickness), 4108 Scalar(0, 0, 255)); 4109 4110 // then put the text itself 4111 putText(img, text, textOrg, fontFace, fontScale, 4112 Scalar::all(255), thickness, 8); 4113 @endcode 4114 4115 @param text Input text string. 4116 @param fontFace Font to use, see cv::HersheyFonts. 4117 @param fontScale Font scale factor that is multiplied by the font-specific base size. 4118 @param thickness Thickness of lines used to render the text. See putText for details. 4119 @param[out] baseLine y-coordinate of the baseline relative to the bottom-most text 4120 point. 4121 @return The size of a box that contains the specified text. 4122 4123 @see cv::putText 4124 */ 4125 CV_EXPORTS_W Size getTextSize(const String& text, int fontFace, 4126 double fontScale, int thickness, 4127 CV_OUT int* baseLine); 4128 4129 /** @brief Line iterator 4130 4131 The class is used to iterate over all the pixels on the raster line 4132 segment connecting two specified points. 4133 4134 The class LineIterator is used to get each pixel of a raster line. It 4135 can be treated as versatile implementation of the Bresenham algorithm 4136 where you can stop at each pixel and do some extra processing, for 4137 example, grab pixel values along the line or draw a line with an effect 4138 (for example, with XOR operation). 4139 4140 The number of pixels along the line is stored in LineIterator::count. 4141 The method LineIterator::pos returns the current position in the image: 4142 4143 @code{.cpp} 4144 // grabs pixels along the line (pt1, pt2) 4145 // from 8-bit 3-channel image to the buffer 4146 LineIterator it(img, pt1, pt2, 8); 4147 LineIterator it2 = it; 4148 vector<Vec3b> buf(it.count); 4149 4150 for(int i = 0; i < it.count; i++, ++it) 4151 buf[i] = *(const Vec3b)*it; 4152 4153 // alternative way of iterating through the line 4154 for(int i = 0; i < it2.count; i++, ++it2) 4155 { 4156 Vec3b val = img.at<Vec3b>(it2.pos()); 4157 CV_Assert(buf[i] == val); 4158 } 4159 @endcode 4160 */ 4161 class CV_EXPORTS LineIterator 4162 { 4163 public: 4164 /** @brief intializes the iterator 4165 4166 creates iterators for the line connecting pt1 and pt2 4167 the line will be clipped on the image boundaries 4168 the line is 8-connected or 4-connected 4169 If leftToRight=true, then the iteration is always done 4170 from the left-most point to the right most, 4171 not to depend on the ordering of pt1 and pt2 parameters 4172 */ 4173 LineIterator( const Mat& img, Point pt1, Point pt2, 4174 int connectivity = 8, bool leftToRight = false ); 4175 /** @brief returns pointer to the current pixel 4176 */ 4177 uchar* operator *(); 4178 /** @brief prefix increment operator (++it). shifts iterator to the next pixel 4179 */ 4180 LineIterator& operator ++(); 4181 /** @brief postfix increment operator (it++). shifts iterator to the next pixel 4182 */ 4183 LineIterator operator ++(int); 4184 /** @brief returns coordinates of the current pixel 4185 */ 4186 Point pos() const; 4187 4188 uchar* ptr; 4189 const uchar* ptr0; 4190 int step, elemSize; 4191 int err, count; 4192 int minusDelta, plusDelta; 4193 int minusStep, plusStep; 4194 }; 4195 4196 //! @cond IGNORED 4197 4198 // === LineIterator implementation === 4199 4200 inline 4201 uchar* LineIterator::operator *() 4202 { 4203 return ptr; 4204 } 4205 4206 inline 4207 LineIterator& LineIterator::operator ++() 4208 { 4209 int mask = err < 0 ? -1 : 0; 4210 err += minusDelta + (plusDelta & mask); 4211 ptr += minusStep + (plusStep & mask); 4212 return *this; 4213 } 4214 4215 inline 4216 LineIterator LineIterator::operator ++(int) 4217 { 4218 LineIterator it = *this; 4219 ++(*this); 4220 return it; 4221 } 4222 4223 inline 4224 Point LineIterator::pos() const 4225 { 4226 Point p; 4227 p.y = (int)((ptr - ptr0)/step); 4228 p.x = (int)(((ptr - ptr0) - p.y*step)/elemSize); 4229 return p; 4230 } 4231 4232 //! @endcond 4233 4234 //! @} imgproc_draw 4235 4236 //! @} imgproc 4237 4238 } // cv 4239 4240 #ifndef DISABLE_OPENCV_24_COMPATIBILITY 4241 #include "opencv2/imgproc/imgproc_c.h" 4242 #endif 4243 4244 #endif 4245