12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344 |
- /*M///////////////////////////////////////////////////////////////////////////////////////
- //
- // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
- //
- // By downloading, copying, installing or using the software you agree to this license.
- // If you do not agree to this license, do not download, install,
- // copy or use the software.
- //
- //
- // License Agreement
- // For Open Source Computer Vision Library
- //
- // Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
- // Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
- // Copyright (C) 2015, OpenCV Foundation, all rights reserved.
- // Copyright (C) 2015, Itseez Inc., all rights reserved.
- // Third party copyrights are property of their respective owners.
- //
- // Redistribution and use in source and binary forms, with or without modification,
- // are permitted provided that the following conditions are met:
- //
- // * Redistribution's of source code must retain the above copyright notice,
- // this list of conditions and the following disclaimer.
- //
- // * Redistribution's in binary form must reproduce the above copyright notice,
- // this list of conditions and the following disclaimer in the documentation
- // and/or other materials provided with the distribution.
- //
- // * The name of the copyright holders may not be used to endorse or promote products
- // derived from this software without specific prior written permission.
- //
- // This software is provided by the copyright holders and contributors "as is" and
- // any express or implied warranties, including, but not limited to, the implied
- // warranties of merchantability and fitness for a particular purpose are disclaimed.
- // In no event shall the Intel Corporation or contributors be liable for any direct,
- // indirect, incidental, special, exemplary, or consequential damages
- // (including, but not limited to, procurement of substitute goods or services;
- // loss of use, data, or profits; or business interruption) however caused
- // and on any theory of liability, whether in contract, strict liability,
- // or tort (including negligence or otherwise) arising in any way out of
- // the use of this software, even if advised of the possibility of such damage.
- //
- //M*/
- #ifndef OPENCV_CORE_HPP
- #define OPENCV_CORE_HPP
- #ifndef __cplusplus
- # error core.hpp header must be compiled as C++
- #endif
- #include "opencv2/core/cvdef.h"
- #include "opencv2/core/base.hpp"
- #include "opencv2/core/cvstd.hpp"
- #include "opencv2/core/traits.hpp"
- #include "opencv2/core/matx.hpp"
- #include "opencv2/core/types.hpp"
- #include "opencv2/core/mat.hpp"
- #include "opencv2/core/persistence.hpp"
- /**
- @defgroup core Core functionality
- @{
- @defgroup core_basic Basic structures
- @defgroup core_c C structures and operations
- @{
- @defgroup core_c_glue Connections with C++
- @}
- @defgroup core_array Operations on arrays
- @defgroup core_async Asynchronous API
- @defgroup core_xml XML/YAML Persistence
- @defgroup core_cluster Clustering
- @defgroup core_utils Utility and system functions and macros
- @{
- @defgroup core_logging Logging facilities
- @defgroup core_utils_sse SSE utilities
- @defgroup core_utils_neon NEON utilities
- @defgroup core_utils_vsx VSX utilities
- @defgroup core_utils_softfloat Softfloat support
- @defgroup core_utils_samples Utility functions for OpenCV samples
- @}
- @defgroup core_opengl OpenGL interoperability
- @defgroup core_ipp Intel IPP Asynchronous C/C++ Converters
- @defgroup core_optim Optimization Algorithms
- @defgroup core_directx DirectX interoperability
- @defgroup core_eigen Eigen support
- @defgroup core_opencl OpenCL support
- @defgroup core_va_intel Intel VA-API/OpenCL (CL-VA) interoperability
- @defgroup core_hal Hardware Acceleration Layer
- @{
- @defgroup core_hal_functions Functions
- @defgroup core_hal_interface Interface
- @defgroup core_hal_intrin Universal intrinsics
- @{
- @defgroup core_hal_intrin_impl Private implementation helpers
- @}
- @defgroup core_lowlevel_api Low-level API for external libraries / plugins
- @}
- @defgroup core_parallel Parallel Processing
- @{
- @defgroup core_parallel_backend Parallel backends API
- @}
- @}
- */
- namespace cv {
- //! @addtogroup core_utils
- //! @{
- /*! @brief Class passed to an error.
- This class encapsulates all or almost all necessary
- information about the error happened in the program. The exception is
- usually constructed and thrown implicitly via CV_Error and CV_Error_ macros.
- @see error
- */
- class CV_EXPORTS Exception : public std::exception
- {
- public:
- /*!
- Default constructor
- */
- Exception();
- /*!
- Full constructor. Normally the constructor is not called explicitly.
- Instead, the macros CV_Error(), CV_Error_() and CV_Assert() are used.
- */
- Exception(int _code, const String& _err, const String& _func, const String& _file, int _line);
- virtual ~Exception() throw();
- /*!
- \return the error description and the context as a text string.
- */
- virtual const char *what() const throw() CV_OVERRIDE;
- void formatMessage();
- String msg; ///< the formatted error message
- int code; ///< error code @see CVStatus
- String err; ///< error description
- String func; ///< function name. Available only when the compiler supports getting it
- String file; ///< source file name where the error has occurred
- int line; ///< line number in the source file where the error has occurred
- };
- /*! @brief Signals an error and raises the exception.
- By default the function prints information about the error to stderr,
- then it either stops if cv::setBreakOnError() had been called before or raises the exception.
- It is possible to alternate error processing by using #redirectError().
- @param exc the exception raisen.
- @deprecated drop this version
- */
- CV_EXPORTS CV_NORETURN void error(const Exception& exc);
- enum SortFlags { SORT_EVERY_ROW = 0, //!< each matrix row is sorted independently
- SORT_EVERY_COLUMN = 1, //!< each matrix column is sorted
- //!< independently; this flag and the previous one are
- //!< mutually exclusive.
- SORT_ASCENDING = 0, //!< each matrix row is sorted in the ascending
- //!< order.
- SORT_DESCENDING = 16 //!< each matrix row is sorted in the
- //!< descending order; this flag and the previous one are also
- //!< mutually exclusive.
- };
- //! @} core_utils
- //! @addtogroup core
- //! @{
- //! Covariation flags
- enum CovarFlags {
- /** The output covariance matrix is calculated as:
- \f[\texttt{scale} \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...]^T \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...],\f]
- The covariance matrix will be nsamples x nsamples. Such an unusual covariance matrix is used
- for fast PCA of a set of very large vectors (see, for example, the EigenFaces technique for
- face recognition). Eigenvalues of this "scrambled" matrix match the eigenvalues of the true
- covariance matrix. The "true" eigenvectors can be easily calculated from the eigenvectors of
- the "scrambled" covariance matrix. */
- COVAR_SCRAMBLED = 0,
- /**The output covariance matrix is calculated as:
- \f[\texttt{scale} \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...] \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...]^T,\f]
- covar will be a square matrix of the same size as the total number of elements in each input
- vector. One and only one of #COVAR_SCRAMBLED and #COVAR_NORMAL must be specified.*/
- COVAR_NORMAL = 1,
- /** If the flag is specified, the function does not calculate mean from
- the input vectors but, instead, uses the passed mean vector. This is useful if mean has been
- pre-calculated or known in advance, or if the covariance matrix is calculated by parts. In
- this case, mean is not a mean vector of the input sub-set of vectors but rather the mean
- vector of the whole set.*/
- COVAR_USE_AVG = 2,
- /** If the flag is specified, the covariance matrix is scaled. In the
- "normal" mode, scale is 1./nsamples . In the "scrambled" mode, scale is the reciprocal of the
- total number of elements in each input vector. By default (if the flag is not specified), the
- covariance matrix is not scaled ( scale=1 ).*/
- COVAR_SCALE = 4,
- /** If the flag is
- specified, all the input vectors are stored as rows of the samples matrix. mean should be a
- single-row vector in this case.*/
- COVAR_ROWS = 8,
- /** If the flag is
- specified, all the input vectors are stored as columns of the samples matrix. mean should be a
- single-column vector in this case.*/
- COVAR_COLS = 16
- };
- //! @addtogroup core_cluster
- //! @{
- //! k-Means flags
- enum KmeansFlags {
- /** Select random initial centers in each attempt.*/
- KMEANS_RANDOM_CENTERS = 0,
- /** Use kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007].*/
- KMEANS_PP_CENTERS = 2,
- /** During the first (and possibly the only) attempt, use the
- user-supplied labels instead of computing them from the initial centers. For the second and
- further attempts, use the random or semi-random centers. Use one of KMEANS_\*_CENTERS flag
- to specify the exact method.*/
- KMEANS_USE_INITIAL_LABELS = 1
- };
- //! @} core_cluster
- //! @addtogroup core_array
- //! @{
- enum ReduceTypes { REDUCE_SUM = 0, //!< the output is the sum of all rows/columns of the matrix.
- REDUCE_AVG = 1, //!< the output is the mean vector of all rows/columns of the matrix.
- REDUCE_MAX = 2, //!< the output is the maximum (column/row-wise) of all rows/columns of the matrix.
- REDUCE_MIN = 3 //!< the output is the minimum (column/row-wise) of all rows/columns of the matrix.
- };
- //! @} core_array
- /** @brief Swaps two matrices
- */
- CV_EXPORTS void swap(Mat& a, Mat& b);
- /** @overload */
- CV_EXPORTS void swap( UMat& a, UMat& b );
- //! @} core
- //! @addtogroup core_array
- //! @{
- /** @brief Computes the source location of an extrapolated pixel.
- The function computes and returns the coordinate of a donor pixel corresponding to the specified
- extrapolated pixel when using the specified extrapolation border mode. For example, if you use
- cv::BORDER_WRAP mode in the horizontal direction, cv::BORDER_REFLECT_101 in the vertical direction and
- want to compute value of the "virtual" pixel Point(-5, 100) in a floating-point image img , it
- looks like:
- @code{.cpp}
- float val = img.at<float>(borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101),
- borderInterpolate(-5, img.cols, cv::BORDER_WRAP));
- @endcode
- Normally, the function is not called directly. It is used inside filtering functions and also in
- copyMakeBorder.
- @param p 0-based coordinate of the extrapolated pixel along one of the axes, likely \<0 or \>= len
- @param len Length of the array along the corresponding axis.
- @param borderType Border type, one of the #BorderTypes, except for #BORDER_TRANSPARENT and
- #BORDER_ISOLATED . When borderType==#BORDER_CONSTANT , the function always returns -1, regardless
- of p and len.
- @sa copyMakeBorder
- */
- CV_EXPORTS_W int borderInterpolate(int p, int len, int borderType);
- /** @example samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp
- An example using copyMakeBorder function.
- Check @ref tutorial_copyMakeBorder "the corresponding tutorial" for more details
- */
- /** @brief Forms a border around an image.
- The function copies the source image into the middle of the destination image. The areas to the
- left, to the right, above and below the copied source image will be filled with extrapolated
- pixels. This is not what filtering functions based on it do (they extrapolate pixels on-fly), but
- what other more complex functions, including your own, may do to simplify image boundary handling.
- The function supports the mode when src is already in the middle of dst . In this case, the
- function does not copy src itself but simply constructs the border, for example:
- @code{.cpp}
- // let border be the same in all directions
- int border=2;
- // constructs a larger image to fit both the image and the border
- Mat gray_buf(rgb.rows + border*2, rgb.cols + border*2, rgb.depth());
- // select the middle part of it w/o copying data
- Mat gray(gray_canvas, Rect(border, border, rgb.cols, rgb.rows));
- // convert image from RGB to grayscale
- cvtColor(rgb, gray, COLOR_RGB2GRAY);
- // form a border in-place
- copyMakeBorder(gray, gray_buf, border, border,
- border, border, BORDER_REPLICATE);
- // now do some custom filtering ...
- ...
- @endcode
- @note When the source image is a part (ROI) of a bigger image, the function will try to use the
- pixels outside of the ROI to form a border. To disable this feature and always do extrapolation, as
- if src was not a ROI, use borderType | #BORDER_ISOLATED.
- @param src Source image.
- @param dst Destination image of the same type as src and the size Size(src.cols+left+right,
- src.rows+top+bottom) .
- @param top the top pixels
- @param bottom the bottom pixels
- @param left the left pixels
- @param right Parameter specifying how many pixels in each direction from the source image rectangle
- to extrapolate. For example, top=1, bottom=1, left=1, right=1 mean that 1 pixel-wide border needs
- to be built.
- @param borderType Border type. See borderInterpolate for details.
- @param value Border value if borderType==BORDER_CONSTANT .
- @sa borderInterpolate
- */
- CV_EXPORTS_W void copyMakeBorder(InputArray src, OutputArray dst,
- int top, int bottom, int left, int right,
- int borderType, const Scalar& value = Scalar() );
- /** @brief Calculates the per-element sum of two arrays or an array and a scalar.
- The function add calculates:
- - Sum of two arrays when both input arrays have the same size and the same number of channels:
- \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) + \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0\f]
- - Sum of an array and a scalar when src2 is constructed from Scalar or has the same number of
- elements as `src1.channels()`:
- \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) + \texttt{src2} ) \quad \texttt{if mask}(I) \ne0\f]
- - Sum of a scalar and an array when src1 is constructed from Scalar or has the same number of
- elements as `src2.channels()`:
- \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1} + \texttt{src2}(I) ) \quad \texttt{if mask}(I) \ne0\f]
- where `I` is a multi-dimensional index of array elements. In case of multi-channel arrays, each
- channel is processed independently.
- The first function in the list above can be replaced with matrix expressions:
- @code{.cpp}
- dst = src1 + src2;
- dst += src1; // equivalent to add(dst, src1, dst);
- @endcode
- The input arrays and the output array can all have the same or different depths. For example, you
- can add a 16-bit unsigned array to a 8-bit signed array and store the sum as a 32-bit
- floating-point array. Depth of the output array is determined by the dtype parameter. In the second
- and third cases above, as well as in the first case, when src1.depth() == src2.depth(), dtype can
- be set to the default -1. In this case, the output array will have the same depth as the input
- array, be it src1, src2 or both.
- @note Saturation is not applied when the output array has the depth CV_32S. You may even get
- result of an incorrect sign in the case of overflow.
- @param src1 first input array or a scalar.
- @param src2 second input array or a scalar.
- @param dst output array that has the same size and number of channels as the input array(s); the
- depth is defined by dtype or src1/src2.
- @param mask optional operation mask - 8-bit single channel array, that specifies elements of the
- output array to be changed.
- @param dtype optional depth of the output array (see the discussion below).
- @sa subtract, addWeighted, scaleAdd, Mat::convertTo
- */
- CV_EXPORTS_W void add(InputArray src1, InputArray src2, OutputArray dst,
- InputArray mask = noArray(), int dtype = -1);
- /** @brief Calculates the per-element difference between two arrays or array and a scalar.
- The function subtract calculates:
- - Difference between two arrays, when both input arrays have the same size and the same number of
- channels:
- \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) - \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0\f]
- - Difference between an array and a scalar, when src2 is constructed from Scalar or has the same
- number of elements as `src1.channels()`:
- \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) - \texttt{src2} ) \quad \texttt{if mask}(I) \ne0\f]
- - Difference between a scalar and an array, when src1 is constructed from Scalar or has the same
- number of elements as `src2.channels()`:
- \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1} - \texttt{src2}(I) ) \quad \texttt{if mask}(I) \ne0\f]
- - The reverse difference between a scalar and an array in the case of `SubRS`:
- \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src2} - \texttt{src1}(I) ) \quad \texttt{if mask}(I) \ne0\f]
- where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each
- channel is processed independently.
- The first function in the list above can be replaced with matrix expressions:
- @code{.cpp}
- dst = src1 - src2;
- dst -= src1; // equivalent to subtract(dst, src1, dst);
- @endcode
- The input arrays and the output array can all have the same or different depths. For example, you
- can subtract to 8-bit unsigned arrays and store the difference in a 16-bit signed array. Depth of
- the output array is determined by dtype parameter. In the second and third cases above, as well as
- in the first case, when src1.depth() == src2.depth(), dtype can be set to the default -1. In this
- case the output array will have the same depth as the input array, be it src1, src2 or both.
- @note Saturation is not applied when the output array has the depth CV_32S. You may even get
- result of an incorrect sign in the case of overflow.
- @param src1 first input array or a scalar.
- @param src2 second input array or a scalar.
- @param dst output array of the same size and the same number of channels as the input array.
- @param mask optional operation mask; this is an 8-bit single channel array that specifies elements
- of the output array to be changed.
- @param dtype optional depth of the output array
- @sa add, addWeighted, scaleAdd, Mat::convertTo
- */
- CV_EXPORTS_W void subtract(InputArray src1, InputArray src2, OutputArray dst,
- InputArray mask = noArray(), int dtype = -1);
- /** @brief Calculates the per-element scaled product of two arrays.
- The function multiply calculates the per-element product of two arrays:
- \f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{scale} \cdot \texttt{src1} (I) \cdot \texttt{src2} (I))\f]
- There is also a @ref MatrixExpressions -friendly variant of the first function. See Mat::mul .
- For a not-per-element matrix product, see gemm .
- @note Saturation is not applied when the output array has the depth
- CV_32S. You may even get result of an incorrect sign in the case of
- overflow.
- @param src1 first input array.
- @param src2 second input array of the same size and the same type as src1.
- @param dst output array of the same size and type as src1.
- @param scale optional scale factor.
- @param dtype optional depth of the output array
- @sa add, subtract, divide, scaleAdd, addWeighted, accumulate, accumulateProduct, accumulateSquare,
- Mat::convertTo
- */
- CV_EXPORTS_W void multiply(InputArray src1, InputArray src2,
- OutputArray dst, double scale = 1, int dtype = -1);
- /** @brief Performs per-element division of two arrays or a scalar by an array.
- The function cv::divide divides one array by another:
- \f[\texttt{dst(I) = saturate(src1(I)*scale/src2(I))}\f]
- or a scalar by an array when there is no src1 :
- \f[\texttt{dst(I) = saturate(scale/src2(I))}\f]
- Different channels of multi-channel arrays are processed independently.
- For integer types when src2(I) is zero, dst(I) will also be zero.
- @note In case of floating point data there is no special defined behavior for zero src2(I) values.
- Regular floating-point division is used.
- Expect correct IEEE-754 behaviour for floating-point data (with NaN, Inf result values).
- @note Saturation is not applied when the output array has the depth CV_32S. You may even get
- result of an incorrect sign in the case of overflow.
- @param src1 first input array.
- @param src2 second input array of the same size and type as src1.
- @param scale scalar factor.
- @param dst output array of the same size and type as src2.
- @param dtype optional depth of the output array; if -1, dst will have depth src2.depth(), but in
- case of an array-by-array division, you can only pass -1 when src1.depth()==src2.depth().
- @sa multiply, add, subtract
- */
- CV_EXPORTS_W void divide(InputArray src1, InputArray src2, OutputArray dst,
- double scale = 1, int dtype = -1);
- /** @overload */
- CV_EXPORTS_W void divide(double scale, InputArray src2,
- OutputArray dst, int dtype = -1);
- /** @brief Calculates the sum of a scaled array and another array.
- The function scaleAdd is one of the classical primitive linear algebra operations, known as DAXPY
- or SAXPY in [BLAS](http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms). It calculates
- the sum of a scaled array and another array:
- \f[\texttt{dst} (I)= \texttt{scale} \cdot \texttt{src1} (I) + \texttt{src2} (I)\f]
- The function can also be emulated with a matrix expression, for example:
- @code{.cpp}
- Mat A(3, 3, CV_64F);
- ...
- A.row(0) = A.row(1)*2 + A.row(2);
- @endcode
- @param src1 first input array.
- @param alpha scale factor for the first array.
- @param src2 second input array of the same size and type as src1.
- @param dst output array of the same size and type as src1.
- @sa add, addWeighted, subtract, Mat::dot, Mat::convertTo
- */
- CV_EXPORTS_W void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);
- /** @example samples/cpp/tutorial_code/HighGUI/AddingImagesTrackbar.cpp
- Check @ref tutorial_trackbar "the corresponding tutorial" for more details
- */
- /** @brief Calculates the weighted sum of two arrays.
- The function addWeighted calculates the weighted sum of two arrays as follows:
- \f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I)* \texttt{alpha} + \texttt{src2} (I)* \texttt{beta} + \texttt{gamma} )\f]
- where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each
- channel is processed independently.
- The function can be replaced with a matrix expression:
- @code{.cpp}
- dst = src1*alpha + src2*beta + gamma;
- @endcode
- @note Saturation is not applied when the output array has the depth CV_32S. You may even get
- result of an incorrect sign in the case of overflow.
- @param src1 first input array.
- @param alpha weight of the first array elements.
- @param src2 second input array of the same size and channel number as src1.
- @param beta weight of the second array elements.
- @param gamma scalar added to each sum.
- @param dst output array that has the same size and number of channels as the input arrays.
- @param dtype optional depth of the output array; when both input arrays have the same depth, dtype
- can be set to -1, which will be equivalent to src1.depth().
- @sa add, subtract, scaleAdd, Mat::convertTo
- */
- CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,
- double beta, double gamma, OutputArray dst, int dtype = -1);
- /** @brief Scales, calculates absolute values, and converts the result to 8-bit.
- On each element of the input array, the function convertScaleAbs
- performs three operations sequentially: scaling, taking an absolute
- value, conversion to an unsigned 8-bit type:
- \f[\texttt{dst} (I)= \texttt{saturate\_cast<uchar>} (| \texttt{src} (I)* \texttt{alpha} + \texttt{beta} |)\f]
- In case of multi-channel arrays, the function processes each channel
- independently. When the output is not 8-bit, the operation can be
- emulated by calling the Mat::convertTo method (or by using matrix
- expressions) and then by calculating an absolute value of the result.
- For example:
- @code{.cpp}
- Mat_<float> A(30,30);
- randu(A, Scalar(-100), Scalar(100));
- Mat_<float> B = A*5 + 3;
- B = abs(B);
- // Mat_<float> B = abs(A*5+3) will also do the job,
- // but it will allocate a temporary matrix
- @endcode
- @param src input array.
- @param dst output array.
- @param alpha optional scale factor.
- @param beta optional delta added to the scaled values.
- @sa Mat::convertTo, cv::abs(const Mat&)
- */
- CV_EXPORTS_W void convertScaleAbs(InputArray src, OutputArray dst,
- double alpha = 1, double beta = 0);
- /** @brief Converts an array to half precision floating number.
- This function converts FP32 (single precision floating point) from/to FP16 (half precision floating point). CV_16S format is used to represent FP16 data.
- There are two use modes (src -> dst): CV_32F -> CV_16S and CV_16S -> CV_32F. The input array has to have type of CV_32F or
- CV_16S to represent the bit depth. If the input array is neither of them, the function will raise an error.
- The format of half precision floating point is defined in IEEE 754-2008.
- @param src input array.
- @param dst output array.
- */
- CV_EXPORTS_W void convertFp16(InputArray src, OutputArray dst);
- /** @brief Performs a look-up table transform of an array.
- The function LUT fills the output array with values from the look-up table. Indices of the entries
- are taken from the input array. That is, the function processes each element of src as follows:
- \f[\texttt{dst} (I) \leftarrow \texttt{lut(src(I) + d)}\f]
- where
- \f[d = \fork{0}{if \(\texttt{src}\) has depth \(\texttt{CV_8U}\)}{128}{if \(\texttt{src}\) has depth \(\texttt{CV_8S}\)}\f]
- @param src input array of 8-bit elements.
- @param lut look-up table of 256 elements; in case of multi-channel input array, the table should
- either have a single channel (in this case the same table is used for all channels) or the same
- number of channels as in the input array.
- @param dst output array of the same size and number of channels as src, and the same depth as lut.
- @sa convertScaleAbs, Mat::convertTo
- */
- CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst);
- /** @brief Calculates the sum of array elements.
- The function cv::sum calculates and returns the sum of array elements,
- independently for each channel.
- @param src input array that must have from 1 to 4 channels.
- @sa countNonZero, mean, meanStdDev, norm, minMaxLoc, reduce
- */
- CV_EXPORTS_AS(sumElems) Scalar sum(InputArray src);
- /** @brief Counts non-zero array elements.
- The function returns the number of non-zero elements in src :
- \f[\sum _{I: \; \texttt{src} (I) \ne0 } 1\f]
- @param src single-channel array.
- @sa mean, meanStdDev, norm, minMaxLoc, calcCovarMatrix
- */
- CV_EXPORTS_W int countNonZero( InputArray src );
- /** @brief Returns the list of locations of non-zero pixels
- Given a binary matrix (likely returned from an operation such
- as threshold(), compare(), >, ==, etc, return all of
- the non-zero indices as a cv::Mat or std::vector<cv::Point> (x,y)
- For example:
- @code{.cpp}
- cv::Mat binaryImage; // input, binary image
- cv::Mat locations; // output, locations of non-zero pixels
- cv::findNonZero(binaryImage, locations);
- // access pixel coordinates
- Point pnt = locations.at<Point>(i);
- @endcode
- or
- @code{.cpp}
- cv::Mat binaryImage; // input, binary image
- vector<Point> locations; // output, locations of non-zero pixels
- cv::findNonZero(binaryImage, locations);
- // access pixel coordinates
- Point pnt = locations[i];
- @endcode
- @param src single-channel array
- @param idx the output array, type of cv::Mat or std::vector<Point>, corresponding to non-zero indices in the input
- */
- CV_EXPORTS_W void findNonZero( InputArray src, OutputArray idx );
- /** @brief Calculates an average (mean) of array elements.
- The function cv::mean calculates the mean value M of array elements,
- independently for each channel, and return it:
- \f[\begin{array}{l} N = \sum _{I: \; \texttt{mask} (I) \ne 0} 1 \\ M_c = \left ( \sum _{I: \; \texttt{mask} (I) \ne 0}{ \texttt{mtx} (I)_c} \right )/N \end{array}\f]
- When all the mask elements are 0's, the function returns Scalar::all(0)
- @param src input array that should have from 1 to 4 channels so that the result can be stored in
- Scalar_ .
- @param mask optional operation mask.
- @sa countNonZero, meanStdDev, norm, minMaxLoc
- */
- CV_EXPORTS_W Scalar mean(InputArray src, InputArray mask = noArray());
- /** Calculates a mean and standard deviation of array elements.
- The function cv::meanStdDev calculates the mean and the standard deviation M
- of array elements independently for each channel and returns it via the
- output parameters:
- \f[\begin{array}{l} N = \sum _{I, \texttt{mask} (I) \ne 0} 1 \\ \texttt{mean} _c = \frac{\sum_{ I: \; \texttt{mask}(I) \ne 0} \texttt{src} (I)_c}{N} \\ \texttt{stddev} _c = \sqrt{\frac{\sum_{ I: \; \texttt{mask}(I) \ne 0} \left ( \texttt{src} (I)_c - \texttt{mean} _c \right )^2}{N}} \end{array}\f]
- When all the mask elements are 0's, the function returns
- mean=stddev=Scalar::all(0).
- @note The calculated standard deviation is only the diagonal of the
- complete normalized covariance matrix. If the full matrix is needed, you
- can reshape the multi-channel array M x N to the single-channel array
- M\*N x mtx.channels() (only possible when the matrix is continuous) and
- then pass the matrix to calcCovarMatrix .
- @param src input array that should have from 1 to 4 channels so that the results can be stored in
- Scalar_ 's.
- @param mean output parameter: calculated mean value.
- @param stddev output parameter: calculated standard deviation.
- @param mask optional operation mask.
- @sa countNonZero, mean, norm, minMaxLoc, calcCovarMatrix
- */
- CV_EXPORTS_W void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev,
- InputArray mask=noArray());
- /** @brief Calculates the absolute norm of an array.
- This version of #norm calculates the absolute norm of src1. The type of norm to calculate is specified using #NormTypes.
- As example for one array consider the function \f$r(x)= \begin{pmatrix} x \\ 1-x \end{pmatrix}, x \in [-1;1]\f$.
- The \f$ L_{1}, L_{2} \f$ and \f$ L_{\infty} \f$ norm for the sample value \f$r(-1) = \begin{pmatrix} -1 \\ 2 \end{pmatrix}\f$
- is calculated as follows
- \f{align*}
- \| r(-1) \|_{L_1} &= |-1| + |2| = 3 \\
- \| r(-1) \|_{L_2} &= \sqrt{(-1)^{2} + (2)^{2}} = \sqrt{5} \\
- \| r(-1) \|_{L_\infty} &= \max(|-1|,|2|) = 2
- \f}
- and for \f$r(0.5) = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix}\f$ the calculation is
- \f{align*}
- \| r(0.5) \|_{L_1} &= |0.5| + |0.5| = 1 \\
- \| r(0.5) \|_{L_2} &= \sqrt{(0.5)^{2} + (0.5)^{2}} = \sqrt{0.5} \\
- \| r(0.5) \|_{L_\infty} &= \max(|0.5|,|0.5|) = 0.5.
- \f}
- The following graphic shows all values for the three norm functions \f$\| r(x) \|_{L_1}, \| r(x) \|_{L_2}\f$ and \f$\| r(x) \|_{L_\infty}\f$.
- It is notable that the \f$ L_{1} \f$ norm forms the upper and the \f$ L_{\infty} \f$ norm forms the lower border for the example function \f$ r(x) \f$.
- ![Graphs for the different norm functions from the above example](pics/NormTypes_OneArray_1-2-INF.png)
- When the mask parameter is specified and it is not empty, the norm is
- If normType is not specified, #NORM_L2 is used.
- calculated only over the region specified by the mask.
- Multi-channel input arrays are treated as single-channel arrays, that is,
- the results for all channels are combined.
- Hamming norms can only be calculated with CV_8U depth arrays.
- @param src1 first input array.
- @param normType type of the norm (see #NormTypes).
- @param mask optional operation mask; it must have the same size as src1 and CV_8UC1 type.
- */
- CV_EXPORTS_W double norm(InputArray src1, int normType = NORM_L2, InputArray mask = noArray());
- /** @brief Calculates an absolute difference norm or a relative difference norm.
- This version of cv::norm calculates the absolute difference norm
- or the relative difference norm of arrays src1 and src2.
- The type of norm to calculate is specified using #NormTypes.
- @param src1 first input array.
- @param src2 second input array of the same size and the same type as src1.
- @param normType type of the norm (see #NormTypes).
- @param mask optional operation mask; it must have the same size as src1 and CV_8UC1 type.
- */
- CV_EXPORTS_W double norm(InputArray src1, InputArray src2,
- int normType = NORM_L2, InputArray mask = noArray());
- /** @overload
- @param src first input array.
- @param normType type of the norm (see #NormTypes).
- */
- CV_EXPORTS double norm( const SparseMat& src, int normType );
- /** @brief Computes the Peak Signal-to-Noise Ratio (PSNR) image quality metric.
- This function calculates the Peak Signal-to-Noise Ratio (PSNR) image quality metric in decibels (dB),
- between two input arrays src1 and src2. The arrays must have the same type.
- The PSNR is calculated as follows:
- \f[
- \texttt{PSNR} = 10 \cdot \log_{10}{\left( \frac{R^2}{MSE} \right) }
- \f]
- where R is the maximum integer value of depth (e.g. 255 in the case of CV_8U data)
- and MSE is the mean squared error between the two arrays.
- @param src1 first input array.
- @param src2 second input array of the same size as src1.
- @param R the maximum pixel value (255 by default)
- */
- CV_EXPORTS_W double PSNR(InputArray src1, InputArray src2, double R=255.);
- /** @brief naive nearest neighbor finder
- see http://en.wikipedia.org/wiki/Nearest_neighbor_search
- @todo document
- */
- CV_EXPORTS_W void batchDistance(InputArray src1, InputArray src2,
- OutputArray dist, int dtype, OutputArray nidx,
- int normType = NORM_L2, int K = 0,
- InputArray mask = noArray(), int update = 0,
- bool crosscheck = false);
- /** @brief Normalizes the norm or value range of an array.
- The function cv::normalize normalizes scale and shift the input array elements so that
- \f[\| \texttt{dst} \| _{L_p}= \texttt{alpha}\f]
- (where p=Inf, 1 or 2) when normType=NORM_INF, NORM_L1, or NORM_L2, respectively; or so that
- \f[\min _I \texttt{dst} (I)= \texttt{alpha} , \, \, \max _I \texttt{dst} (I)= \texttt{beta}\f]
- when normType=NORM_MINMAX (for dense arrays only). The optional mask specifies a sub-array to be
- normalized. This means that the norm or min-n-max are calculated over the sub-array, and then this
- sub-array is modified to be normalized. If you want to only use the mask to calculate the norm or
- min-max but modify the whole array, you can use norm and Mat::convertTo.
- In case of sparse matrices, only the non-zero values are analyzed and transformed. Because of this,
- the range transformation for sparse matrices is not allowed since it can shift the zero level.
- Possible usage with some positive example data:
- @code{.cpp}
- vector<double> positiveData = { 2.0, 8.0, 10.0 };
- vector<double> normalizedData_l1, normalizedData_l2, normalizedData_inf, normalizedData_minmax;
- // Norm to probability (total count)
- // sum(numbers) = 20.0
- // 2.0 0.1 (2.0/20.0)
- // 8.0 0.4 (8.0/20.0)
- // 10.0 0.5 (10.0/20.0)
- normalize(positiveData, normalizedData_l1, 1.0, 0.0, NORM_L1);
- // Norm to unit vector: ||positiveData|| = 1.0
- // 2.0 0.15
- // 8.0 0.62
- // 10.0 0.77
- normalize(positiveData, normalizedData_l2, 1.0, 0.0, NORM_L2);
- // Norm to max element
- // 2.0 0.2 (2.0/10.0)
- // 8.0 0.8 (8.0/10.0)
- // 10.0 1.0 (10.0/10.0)
- normalize(positiveData, normalizedData_inf, 1.0, 0.0, NORM_INF);
- // Norm to range [0.0;1.0]
- // 2.0 0.0 (shift to left border)
- // 8.0 0.75 (6.0/8.0)
- // 10.0 1.0 (shift to right border)
- normalize(positiveData, normalizedData_minmax, 1.0, 0.0, NORM_MINMAX);
- @endcode
- @param src input array.
- @param dst output array of the same size as src .
- @param alpha norm value to normalize to or the lower range boundary in case of the range
- normalization.
- @param beta upper range boundary in case of the range normalization; it is not used for the norm
- normalization.
- @param norm_type normalization type (see cv::NormTypes).
- @param dtype when negative, the output array has the same type as src; otherwise, it has the same
- number of channels as src and the depth =CV_MAT_DEPTH(dtype).
- @param mask optional operation mask.
- @sa norm, Mat::convertTo, SparseMat::convertTo
- */
- CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
- int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
- /** @overload
- @param src input array.
- @param dst output array of the same size as src .
- @param alpha norm value to normalize to or the lower range boundary in case of the range
- normalization.
- @param normType normalization type (see cv::NormTypes).
- */
- CV_EXPORTS void normalize( const SparseMat& src, SparseMat& dst, double alpha, int normType );
- /** @brief Finds the global minimum and maximum in an array.
- The function cv::minMaxLoc finds the minimum and maximum element values and their positions. The
- extremums are searched across the whole array or, if mask is not an empty array, in the specified
- array region.
- The function do not work with multi-channel arrays. If you need to find minimum or maximum
- elements across all the channels, use Mat::reshape first to reinterpret the array as
- single-channel. Or you may extract the particular channel using either extractImageCOI , or
- mixChannels , or split .
- @param src input single-channel array.
- @param minVal pointer to the returned minimum value; NULL is used if not required.
- @param maxVal pointer to the returned maximum value; NULL is used if not required.
- @param minLoc pointer to the returned minimum location (in 2D case); NULL is used if not required.
- @param maxLoc pointer to the returned maximum location (in 2D case); NULL is used if not required.
- @param mask optional mask used to select a sub-array.
- @sa max, min, reduceArgMin, reduceArgMax, compare, inRange, extractImageCOI, mixChannels, split, Mat::reshape
- */
- CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal,
- CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0,
- CV_OUT Point* maxLoc = 0, InputArray mask = noArray());
- /**
- * @brief Finds indices of min elements along provided axis
- *
- * @note
- * - If input or output array is not continuous, this function will create an internal copy.
- * - NaN handling is left unspecified, see patchNaNs().
- * - The returned index is always in bounds of input matrix.
- *
- * @param src input single-channel array.
- * @param dst output array of type CV_32SC1 with the same dimensionality as src,
- * except for axis being reduced - it should be set to 1.
- * @param lastIndex whether to get the index of first or last occurrence of min.
- * @param axis axis to reduce along.
- * @sa reduceArgMax, minMaxLoc, min, max, compare, reduce
- */
- CV_EXPORTS_W void reduceArgMin(InputArray src, OutputArray dst, int axis, bool lastIndex = false);
- /**
- * @brief Finds indices of max elements along provided axis
- *
- * @note
- * - If input or output array is not continuous, this function will create an internal copy.
- * - NaN handling is left unspecified, see patchNaNs().
- * - The returned index is always in bounds of input matrix.
- *
- * @param src input single-channel array.
- * @param dst output array of type CV_32SC1 with the same dimensionality as src,
- * except for axis being reduced - it should be set to 1.
- * @param lastIndex whether to get the index of first or last occurrence of max.
- * @param axis axis to reduce along.
- * @sa reduceArgMin, minMaxLoc, min, max, compare, reduce
- */
- CV_EXPORTS_W void reduceArgMax(InputArray src, OutputArray dst, int axis, bool lastIndex = false);
- /** @brief Finds the global minimum and maximum in an array
- The function cv::minMaxIdx finds the minimum and maximum element values and their positions. The
- extremums are searched across the whole array or, if mask is not an empty array, in the specified
- array region. The function does not work with multi-channel arrays. If you need to find minimum or
- maximum elements across all the channels, use Mat::reshape first to reinterpret the array as
- single-channel. Or you may extract the particular channel using either extractImageCOI , or
- mixChannels , or split . In case of a sparse matrix, the minimum is found among non-zero elements
- only.
- @note When minIdx is not NULL, it must have at least 2 elements (as well as maxIdx), even if src is
- a single-row or single-column matrix. In OpenCV (following MATLAB) each array has at least 2
- dimensions, i.e. single-column matrix is Mx1 matrix (and therefore minIdx/maxIdx will be
- (i1,0)/(i2,0)) and single-row matrix is 1xN matrix (and therefore minIdx/maxIdx will be
- (0,j1)/(0,j2)).
- @param src input single-channel array.
- @param minVal pointer to the returned minimum value; NULL is used if not required.
- @param maxVal pointer to the returned maximum value; NULL is used if not required.
- @param minIdx pointer to the returned minimum location (in nD case); NULL is used if not required;
- Otherwise, it must point to an array of src.dims elements, the coordinates of the minimum element
- in each dimension are stored there sequentially.
- @param maxIdx pointer to the returned maximum location (in nD case). NULL is used if not required.
- @param mask specified array region
- */
- CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal = 0,
- int* minIdx = 0, int* maxIdx = 0, InputArray mask = noArray());
- /** @overload
- @param a input single-channel array.
- @param minVal pointer to the returned minimum value; NULL is used if not required.
- @param maxVal pointer to the returned maximum value; NULL is used if not required.
- @param minIdx pointer to the returned minimum location (in nD case); NULL is used if not required;
- Otherwise, it must point to an array of src.dims elements, the coordinates of the minimum element
- in each dimension are stored there sequentially.
- @param maxIdx pointer to the returned maximum location (in nD case). NULL is used if not required.
- */
- CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal,
- double* maxVal, int* minIdx = 0, int* maxIdx = 0);
- /** @brief Reduces a matrix to a vector.
- The function #reduce reduces the matrix to a vector by treating the matrix rows/columns as a set of
- 1D vectors and performing the specified operation on the vectors until a single row/column is
- obtained. For example, the function can be used to compute horizontal and vertical projections of a
- raster image. In case of #REDUCE_MAX and #REDUCE_MIN , the output image should have the same type as the source one.
- In case of #REDUCE_SUM and #REDUCE_AVG , the output may have a larger element bit-depth to preserve accuracy.
- And multi-channel arrays are also supported in these two reduction modes.
- The following code demonstrates its usage for a single channel matrix.
- @snippet snippets/core_reduce.cpp example
- And the following code demonstrates its usage for a two-channel matrix.
- @snippet snippets/core_reduce.cpp example2
- @param src input 2D matrix.
- @param dst output vector. Its size and type is defined by dim and dtype parameters.
- @param dim dimension index along which the matrix is reduced. 0 means that the matrix is reduced to
- a single row. 1 means that the matrix is reduced to a single column.
- @param rtype reduction operation that could be one of #ReduceTypes
- @param dtype when negative, the output vector will have the same type as the input matrix,
- otherwise, its type will be CV_MAKE_TYPE(CV_MAT_DEPTH(dtype), src.channels()).
- @sa repeat, reduceArgMin, reduceArgMax
- */
- CV_EXPORTS_W void reduce(InputArray src, OutputArray dst, int dim, int rtype, int dtype = -1);
- /** @brief Creates one multi-channel array out of several single-channel ones.
- The function cv::merge merges several arrays to make a single multi-channel array. That is, each
- element of the output array will be a concatenation of the elements of the input arrays, where
- elements of i-th input array are treated as mv[i].channels()-element vectors.
- The function cv::split does the reverse operation. If you need to shuffle channels in some other
- advanced way, use cv::mixChannels.
- The following example shows how to merge 3 single channel matrices into a single 3-channel matrix.
- @snippet snippets/core_merge.cpp example
- @param mv input array of matrices to be merged; all the matrices in mv must have the same
- size and the same depth.
- @param count number of input matrices when mv is a plain C array; it must be greater than zero.
- @param dst output array of the same size and the same depth as mv[0]; The number of channels will
- be equal to the parameter count.
- @sa mixChannels, split, Mat::reshape
- */
- CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);
- /** @overload
- @param mv input vector of matrices to be merged; all the matrices in mv must have the same
- size and the same depth.
- @param dst output array of the same size and the same depth as mv[0]; The number of channels will
- be the total number of channels in the matrix array.
- */
- CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst);
- /** @brief Divides a multi-channel array into several single-channel arrays.
- The function cv::split splits a multi-channel array into separate single-channel arrays:
- \f[\texttt{mv} [c](I) = \texttt{src} (I)_c\f]
- If you need to extract a single channel or do some other sophisticated channel permutation, use
- mixChannels .
- The following example demonstrates how to split a 3-channel matrix into 3 single channel matrices.
- @snippet snippets/core_split.cpp example
- @param src input multi-channel array.
- @param mvbegin output array; the number of arrays must match src.channels(); the arrays themselves are
- reallocated, if needed.
- @sa merge, mixChannels, cvtColor
- */
- CV_EXPORTS void split(const Mat& src, Mat* mvbegin);
- /** @overload
- @param m input multi-channel array.
- @param mv output vector of arrays; the arrays themselves are reallocated, if needed.
- */
- CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv);
- /** @brief Copies specified channels from input arrays to the specified channels of
- output arrays.
- The function cv::mixChannels provides an advanced mechanism for shuffling image channels.
- cv::split,cv::merge,cv::extractChannel,cv::insertChannel and some forms of cv::cvtColor are partial cases of cv::mixChannels.
- In the example below, the code splits a 4-channel BGRA image into a 3-channel BGR (with B and R
- channels swapped) and a separate alpha-channel image:
- @code{.cpp}
- Mat bgra( 100, 100, CV_8UC4, Scalar(255,0,0,255) );
- Mat bgr( bgra.rows, bgra.cols, CV_8UC3 );
- Mat alpha( bgra.rows, bgra.cols, CV_8UC1 );
- // forming an array of matrices is a quite efficient operation,
- // because the matrix data is not copied, only the headers
- Mat out[] = { bgr, alpha };
- // bgra[0] -> bgr[2], bgra[1] -> bgr[1],
- // bgra[2] -> bgr[0], bgra[3] -> alpha[0]
- int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
- mixChannels( &bgra, 1, out, 2, from_to, 4 );
- @endcode
- @note Unlike many other new-style C++ functions in OpenCV (see the introduction section and
- Mat::create ), cv::mixChannels requires the output arrays to be pre-allocated before calling the
- function.
- @param src input array or vector of matrices; all of the matrices must have the same size and the
- same depth.
- @param nsrcs number of matrices in `src`.
- @param dst output array or vector of matrices; all the matrices **must be allocated**; their size and
- depth must be the same as in `src[0]`.
- @param ndsts number of matrices in `dst`.
- @param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is
- a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in
- dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to
- src[0].channels()-1, the second input image channels are indexed from src[0].channels() to
- src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image
- channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is
- filled with zero .
- @param npairs number of index pairs in `fromTo`.
- @sa split, merge, extractChannel, insertChannel, cvtColor
- */
- CV_EXPORTS void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts,
- const int* fromTo, size_t npairs);
- /** @overload
- @param src input array or vector of matrices; all of the matrices must have the same size and the
- same depth.
- @param dst output array or vector of matrices; all the matrices **must be allocated**; their size and
- depth must be the same as in src[0].
- @param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is
- a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in
- dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to
- src[0].channels()-1, the second input image channels are indexed from src[0].channels() to
- src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image
- channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is
- filled with zero .
- @param npairs number of index pairs in fromTo.
- */
- CV_EXPORTS void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst,
- const int* fromTo, size_t npairs);
- /** @overload
- @param src input array or vector of matrices; all of the matrices must have the same size and the
- same depth.
- @param dst output array or vector of matrices; all the matrices **must be allocated**; their size and
- depth must be the same as in src[0].
- @param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is
- a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in
- dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to
- src[0].channels()-1, the second input image channels are indexed from src[0].channels() to
- src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image
- channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is
- filled with zero .
- */
- CV_EXPORTS_W void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst,
- const std::vector<int>& fromTo);
- /** @brief Extracts a single channel from src (coi is 0-based index)
- @param src input array
- @param dst output array
- @param coi index of channel to extract
- @sa mixChannels, split
- */
- CV_EXPORTS_W void extractChannel(InputArray src, OutputArray dst, int coi);
- /** @brief Inserts a single channel to dst (coi is 0-based index)
- @param src input array
- @param dst output array
- @param coi index of channel for insertion
- @sa mixChannels, merge
- */
- CV_EXPORTS_W void insertChannel(InputArray src, InputOutputArray dst, int coi);
- /** @brief Flips a 2D array around vertical, horizontal, or both axes.
- The function cv::flip flips the array in one of three different ways (row
- and column indices are 0-based):
- \f[\texttt{dst} _{ij} =
- \left\{
- \begin{array}{l l}
- \texttt{src} _{\texttt{src.rows}-i-1,j} & if\; \texttt{flipCode} = 0 \\
- \texttt{src} _{i, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} > 0 \\
- \texttt{src} _{ \texttt{src.rows} -i-1, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} < 0 \\
- \end{array}
- \right.\f]
- The example scenarios of using the function are the following:
- * Vertical flipping of the image (flipCode == 0) to switch between
- top-left and bottom-left image origin. This is a typical operation
- in video processing on Microsoft Windows\* OS.
- * Horizontal flipping of the image with the subsequent horizontal
- shift and absolute difference calculation to check for a
- vertical-axis symmetry (flipCode \> 0).
- * Simultaneous horizontal and vertical flipping of the image with
- the subsequent shift and absolute difference calculation to check
- for a central symmetry (flipCode \< 0).
- * Reversing the order of point arrays (flipCode \> 0 or
- flipCode == 0).
- @param src input array.
- @param dst output array of the same size and type as src.
- @param flipCode a flag to specify how to flip the array; 0 means
- flipping around the x-axis and positive value (for example, 1) means
- flipping around y-axis. Negative value (for example, -1) means flipping
- around both axes.
- @sa transpose , repeat , completeSymm
- */
- CV_EXPORTS_W void flip(InputArray src, OutputArray dst, int flipCode);
- enum RotateFlags {
- ROTATE_90_CLOCKWISE = 0, //!<Rotate 90 degrees clockwise
- ROTATE_180 = 1, //!<Rotate 180 degrees clockwise
- ROTATE_90_COUNTERCLOCKWISE = 2, //!<Rotate 270 degrees clockwise
- };
- /** @brief Rotates a 2D array in multiples of 90 degrees.
- The function cv::rotate rotates the array in one of three different ways:
- * Rotate by 90 degrees clockwise (rotateCode = ROTATE_90_CLOCKWISE).
- * Rotate by 180 degrees clockwise (rotateCode = ROTATE_180).
- * Rotate by 270 degrees clockwise (rotateCode = ROTATE_90_COUNTERCLOCKWISE).
- @param src input array.
- @param dst output array of the same type as src. The size is the same with ROTATE_180,
- and the rows and cols are switched for ROTATE_90_CLOCKWISE and ROTATE_90_COUNTERCLOCKWISE.
- @param rotateCode an enum to specify how to rotate the array; see the enum #RotateFlags
- @sa transpose , repeat , completeSymm, flip, RotateFlags
- */
- CV_EXPORTS_W void rotate(InputArray src, OutputArray dst, int rotateCode);
- /** @brief Fills the output array with repeated copies of the input array.
- The function cv::repeat duplicates the input array one or more times along each of the two axes:
- \f[\texttt{dst} _{ij}= \texttt{src} _{i\mod src.rows, \; j\mod src.cols }\f]
- The second variant of the function is more convenient to use with @ref MatrixExpressions.
- @param src input array to replicate.
- @param ny Flag to specify how many times the `src` is repeated along the
- vertical axis.
- @param nx Flag to specify how many times the `src` is repeated along the
- horizontal axis.
- @param dst output array of the same type as `src`.
- @sa cv::reduce
- */
- CV_EXPORTS_W void repeat(InputArray src, int ny, int nx, OutputArray dst);
- /** @overload
- @param src input array to replicate.
- @param ny Flag to specify how many times the `src` is repeated along the
- vertical axis.
- @param nx Flag to specify how many times the `src` is repeated along the
- horizontal axis.
- */
- CV_EXPORTS Mat repeat(const Mat& src, int ny, int nx);
- /** @brief Applies horizontal concatenation to given matrices.
- The function horizontally concatenates two or more cv::Mat matrices (with the same number of rows).
- @code{.cpp}
- cv::Mat matArray[] = { cv::Mat(4, 1, CV_8UC1, cv::Scalar(1)),
- cv::Mat(4, 1, CV_8UC1, cv::Scalar(2)),
- cv::Mat(4, 1, CV_8UC1, cv::Scalar(3)),};
- cv::Mat out;
- cv::hconcat( matArray, 3, out );
- //out:
- //[1, 2, 3;
- // 1, 2, 3;
- // 1, 2, 3;
- // 1, 2, 3]
- @endcode
- @param src input array or vector of matrices. all of the matrices must have the same number of rows and the same depth.
- @param nsrc number of matrices in src.
- @param dst output array. It has the same number of rows and depth as the src, and the sum of cols of the src.
- @sa cv::vconcat(const Mat*, size_t, OutputArray), @sa cv::vconcat(InputArrayOfArrays, OutputArray) and @sa cv::vconcat(InputArray, InputArray, OutputArray)
- */
- CV_EXPORTS void hconcat(const Mat* src, size_t nsrc, OutputArray dst);
- /** @overload
- @code{.cpp}
- cv::Mat_<float> A = (cv::Mat_<float>(3, 2) << 1, 4,
- 2, 5,
- 3, 6);
- cv::Mat_<float> B = (cv::Mat_<float>(3, 2) << 7, 10,
- 8, 11,
- 9, 12);
- cv::Mat C;
- cv::hconcat(A, B, C);
- //C:
- //[1, 4, 7, 10;
- // 2, 5, 8, 11;
- // 3, 6, 9, 12]
- @endcode
- @param src1 first input array to be considered for horizontal concatenation.
- @param src2 second input array to be considered for horizontal concatenation.
- @param dst output array. It has the same number of rows and depth as the src1 and src2, and the sum of cols of the src1 and src2.
- */
- CV_EXPORTS void hconcat(InputArray src1, InputArray src2, OutputArray dst);
- /** @overload
- @code{.cpp}
- std::vector<cv::Mat> matrices = { cv::Mat(4, 1, CV_8UC1, cv::Scalar(1)),
- cv::Mat(4, 1, CV_8UC1, cv::Scalar(2)),
- cv::Mat(4, 1, CV_8UC1, cv::Scalar(3)),};
- cv::Mat out;
- cv::hconcat( matrices, out );
- //out:
- //[1, 2, 3;
- // 1, 2, 3;
- // 1, 2, 3;
- // 1, 2, 3]
- @endcode
- @param src input array or vector of matrices. all of the matrices must have the same number of rows and the same depth.
- @param dst output array. It has the same number of rows and depth as the src, and the sum of cols of the src.
- same depth.
- */
- CV_EXPORTS_W void hconcat(InputArrayOfArrays src, OutputArray dst);
- /** @brief Applies vertical concatenation to given matrices.
- The function vertically concatenates two or more cv::Mat matrices (with the same number of cols).
- @code{.cpp}
- cv::Mat matArray[] = { cv::Mat(1, 4, CV_8UC1, cv::Scalar(1)),
- cv::Mat(1, 4, CV_8UC1, cv::Scalar(2)),
- cv::Mat(1, 4, CV_8UC1, cv::Scalar(3)),};
- cv::Mat out;
- cv::vconcat( matArray, 3, out );
- //out:
- //[1, 1, 1, 1;
- // 2, 2, 2, 2;
- // 3, 3, 3, 3]
- @endcode
- @param src input array or vector of matrices. all of the matrices must have the same number of cols and the same depth.
- @param nsrc number of matrices in src.
- @param dst output array. It has the same number of cols and depth as the src, and the sum of rows of the src.
- @sa cv::hconcat(const Mat*, size_t, OutputArray), @sa cv::hconcat(InputArrayOfArrays, OutputArray) and @sa cv::hconcat(InputArray, InputArray, OutputArray)
- */
- CV_EXPORTS void vconcat(const Mat* src, size_t nsrc, OutputArray dst);
- /** @overload
- @code{.cpp}
- cv::Mat_<float> A = (cv::Mat_<float>(3, 2) << 1, 7,
- 2, 8,
- 3, 9);
- cv::Mat_<float> B = (cv::Mat_<float>(3, 2) << 4, 10,
- 5, 11,
- 6, 12);
- cv::Mat C;
- cv::vconcat(A, B, C);
- //C:
- //[1, 7;
- // 2, 8;
- // 3, 9;
- // 4, 10;
- // 5, 11;
- // 6, 12]
- @endcode
- @param src1 first input array to be considered for vertical concatenation.
- @param src2 second input array to be considered for vertical concatenation.
- @param dst output array. It has the same number of cols and depth as the src1 and src2, and the sum of rows of the src1 and src2.
- */
- CV_EXPORTS void vconcat(InputArray src1, InputArray src2, OutputArray dst);
- /** @overload
- @code{.cpp}
- std::vector<cv::Mat> matrices = { cv::Mat(1, 4, CV_8UC1, cv::Scalar(1)),
- cv::Mat(1, 4, CV_8UC1, cv::Scalar(2)),
- cv::Mat(1, 4, CV_8UC1, cv::Scalar(3)),};
- cv::Mat out;
- cv::vconcat( matrices, out );
- //out:
- //[1, 1, 1, 1;
- // 2, 2, 2, 2;
- // 3, 3, 3, 3]
- @endcode
- @param src input array or vector of matrices. all of the matrices must have the same number of cols and the same depth
- @param dst output array. It has the same number of cols and depth as the src, and the sum of rows of the src.
- same depth.
- */
- CV_EXPORTS_W void vconcat(InputArrayOfArrays src, OutputArray dst);
- /** @brief computes bitwise conjunction of the two arrays (dst = src1 & src2)
- Calculates the per-element bit-wise conjunction of two arrays or an
- array and a scalar.
- The function cv::bitwise_and calculates the per-element bit-wise logical conjunction for:
- * Two arrays when src1 and src2 have the same size:
- \f[\texttt{dst} (I) = \texttt{src1} (I) \wedge \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
- * An array and a scalar when src2 is constructed from Scalar or has
- the same number of elements as `src1.channels()`:
- \f[\texttt{dst} (I) = \texttt{src1} (I) \wedge \texttt{src2} \quad \texttt{if mask} (I) \ne0\f]
- * A scalar and an array when src1 is constructed from Scalar or has
- the same number of elements as `src2.channels()`:
- \f[\texttt{dst} (I) = \texttt{src1} \wedge \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
- In case of floating-point arrays, their machine-specific bit
- representations (usually IEEE754-compliant) are used for the operation.
- In case of multi-channel arrays, each channel is processed
- independently. In the second and third cases above, the scalar is first
- converted to the array type.
- @param src1 first input array or a scalar.
- @param src2 second input array or a scalar.
- @param dst output array that has the same size and type as the input
- arrays.
- @param mask optional operation mask, 8-bit single channel array, that
- specifies elements of the output array to be changed.
- */
- CV_EXPORTS_W void bitwise_and(InputArray src1, InputArray src2,
- OutputArray dst, InputArray mask = noArray());
- /** @brief Calculates the per-element bit-wise disjunction of two arrays or an
- array and a scalar.
- The function cv::bitwise_or calculates the per-element bit-wise logical disjunction for:
- * Two arrays when src1 and src2 have the same size:
- \f[\texttt{dst} (I) = \texttt{src1} (I) \vee \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
- * An array and a scalar when src2 is constructed from Scalar or has
- the same number of elements as `src1.channels()`:
- \f[\texttt{dst} (I) = \texttt{src1} (I) \vee \texttt{src2} \quad \texttt{if mask} (I) \ne0\f]
- * A scalar and an array when src1 is constructed from Scalar or has
- the same number of elements as `src2.channels()`:
- \f[\texttt{dst} (I) = \texttt{src1} \vee \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
- In case of floating-point arrays, their machine-specific bit
- representations (usually IEEE754-compliant) are used for the operation.
- In case of multi-channel arrays, each channel is processed
- independently. In the second and third cases above, the scalar is first
- converted to the array type.
- @param src1 first input array or a scalar.
- @param src2 second input array or a scalar.
- @param dst output array that has the same size and type as the input
- arrays.
- @param mask optional operation mask, 8-bit single channel array, that
- specifies elements of the output array to be changed.
- */
- CV_EXPORTS_W void bitwise_or(InputArray src1, InputArray src2,
- OutputArray dst, InputArray mask = noArray());
- /** @brief Calculates the per-element bit-wise "exclusive or" operation on two
- arrays or an array and a scalar.
- The function cv::bitwise_xor calculates the per-element bit-wise logical "exclusive-or"
- operation for:
- * Two arrays when src1 and src2 have the same size:
- \f[\texttt{dst} (I) = \texttt{src1} (I) \oplus \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
- * An array and a scalar when src2 is constructed from Scalar or has
- the same number of elements as `src1.channels()`:
- \f[\texttt{dst} (I) = \texttt{src1} (I) \oplus \texttt{src2} \quad \texttt{if mask} (I) \ne0\f]
- * A scalar and an array when src1 is constructed from Scalar or has
- the same number of elements as `src2.channels()`:
- \f[\texttt{dst} (I) = \texttt{src1} \oplus \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f]
- In case of floating-point arrays, their machine-specific bit
- representations (usually IEEE754-compliant) are used for the operation.
- In case of multi-channel arrays, each channel is processed
- independently. In the 2nd and 3rd cases above, the scalar is first
- converted to the array type.
- @param src1 first input array or a scalar.
- @param src2 second input array or a scalar.
- @param dst output array that has the same size and type as the input
- arrays.
- @param mask optional operation mask, 8-bit single channel array, that
- specifies elements of the output array to be changed.
- */
- CV_EXPORTS_W void bitwise_xor(InputArray src1, InputArray src2,
- OutputArray dst, InputArray mask = noArray());
- /** @brief Inverts every bit of an array.
- The function cv::bitwise_not calculates per-element bit-wise inversion of the input
- array:
- \f[\texttt{dst} (I) = \neg \texttt{src} (I)\f]
- In case of a floating-point input array, its machine-specific bit
- representation (usually IEEE754-compliant) is used for the operation. In
- case of multi-channel arrays, each channel is processed independently.
- @param src input array.
- @param dst output array that has the same size and type as the input
- array.
- @param mask optional operation mask, 8-bit single channel array, that
- specifies elements of the output array to be changed.
- */
- CV_EXPORTS_W void bitwise_not(InputArray src, OutputArray dst,
- InputArray mask = noArray());
- /** @brief Calculates the per-element absolute difference between two arrays or between an array and a scalar.
- The function cv::absdiff calculates:
- * Absolute difference between two arrays when they have the same
- size and type:
- \f[\texttt{dst}(I) = \texttt{saturate} (| \texttt{src1}(I) - \texttt{src2}(I)|)\f]
- * Absolute difference between an array and a scalar when the second
- array is constructed from Scalar or has as many elements as the
- number of channels in `src1`:
- \f[\texttt{dst}(I) = \texttt{saturate} (| \texttt{src1}(I) - \texttt{src2} |)\f]
- * Absolute difference between a scalar and an array when the first
- array is constructed from Scalar or has as many elements as the
- number of channels in `src2`:
- \f[\texttt{dst}(I) = \texttt{saturate} (| \texttt{src1} - \texttt{src2}(I) |)\f]
- where I is a multi-dimensional index of array elements. In case of
- multi-channel arrays, each channel is processed independently.
- @note Saturation is not applied when the arrays have the depth CV_32S.
- You may even get a negative value in the case of overflow.
- @param src1 first input array or a scalar.
- @param src2 second input array or a scalar.
- @param dst output array that has the same size and type as input arrays.
- @sa cv::abs(const Mat&)
- */
- CV_EXPORTS_W void absdiff(InputArray src1, InputArray src2, OutputArray dst);
- /** @brief This is an overloaded member function, provided for convenience (python)
- Copies the matrix to another one.
- When the operation mask is specified, if the Mat::create call shown above reallocates the matrix, the newly allocated matrix is initialized with all zeros before copying the data.
- @param src source matrix.
- @param dst Destination matrix. If it does not have a proper size or type before the operation, it is
- reallocated.
- @param mask Operation mask of the same size as \*this. Its non-zero elements indicate which matrix
- elements need to be copied. The mask has to be of type CV_8U and can have 1 or multiple channels.
- */
- void CV_EXPORTS_W copyTo(InputArray src, OutputArray dst, InputArray mask);
- /** @brief Checks if array elements lie between the elements of two other arrays.
- The function checks the range as follows:
- - For every element of a single-channel input array:
- \f[\texttt{dst} (I)= \texttt{lowerb} (I)_0 \leq \texttt{src} (I)_0 \leq \texttt{upperb} (I)_0\f]
- - For two-channel arrays:
- \f[\texttt{dst} (I)= \texttt{lowerb} (I)_0 \leq \texttt{src} (I)_0 \leq \texttt{upperb} (I)_0 \land \texttt{lowerb} (I)_1 \leq \texttt{src} (I)_1 \leq \texttt{upperb} (I)_1\f]
- - and so forth.
- That is, dst (I) is set to 255 (all 1 -bits) if src (I) is within the
- specified 1D, 2D, 3D, ... box and 0 otherwise.
- When the lower and/or upper boundary parameters are scalars, the indexes
- (I) at lowerb and upperb in the above formulas should be omitted.
- @param src first input array.
- @param lowerb inclusive lower boundary array or a scalar.
- @param upperb inclusive upper boundary array or a scalar.
- @param dst output array of the same size as src and CV_8U type.
- */
- CV_EXPORTS_W void inRange(InputArray src, InputArray lowerb,
- InputArray upperb, OutputArray dst);
- /** @brief Performs the per-element comparison of two arrays or an array and scalar value.
- The function compares:
- * Elements of two arrays when src1 and src2 have the same size:
- \f[\texttt{dst} (I) = \texttt{src1} (I) \,\texttt{cmpop}\, \texttt{src2} (I)\f]
- * Elements of src1 with a scalar src2 when src2 is constructed from
- Scalar or has a single element:
- \f[\texttt{dst} (I) = \texttt{src1}(I) \,\texttt{cmpop}\, \texttt{src2}\f]
- * src1 with elements of src2 when src1 is constructed from Scalar or
- has a single element:
- \f[\texttt{dst} (I) = \texttt{src1} \,\texttt{cmpop}\, \texttt{src2} (I)\f]
- When the comparison result is true, the corresponding element of output
- array is set to 255. The comparison operations can be replaced with the
- equivalent matrix expressions:
- @code{.cpp}
- Mat dst1 = src1 >= src2;
- Mat dst2 = src1 < 8;
- ...
- @endcode
- @param src1 first input array or a scalar; when it is an array, it must have a single channel.
- @param src2 second input array or a scalar; when it is an array, it must have a single channel.
- @param dst output array of type ref CV_8U that has the same size and the same number of channels as
- the input arrays.
- @param cmpop a flag, that specifies correspondence between the arrays (cv::CmpTypes)
- @sa checkRange, min, max, threshold
- */
- CV_EXPORTS_W void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop);
- /** @brief Calculates per-element minimum of two arrays or an array and a scalar.
- The function cv::min calculates the per-element minimum of two arrays:
- \f[\texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{src2} (I))\f]
- or array and a scalar:
- \f[\texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{value} )\f]
- @param src1 first input array.
- @param src2 second input array of the same size and type as src1.
- @param dst output array of the same size and type as src1.
- @sa max, compare, inRange, minMaxLoc
- */
- CV_EXPORTS_W void min(InputArray src1, InputArray src2, OutputArray dst);
- /** @overload
- needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
- */
- CV_EXPORTS void min(const Mat& src1, const Mat& src2, Mat& dst);
- /** @overload
- needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
- */
- CV_EXPORTS void min(const UMat& src1, const UMat& src2, UMat& dst);
- /** @brief Calculates per-element maximum of two arrays or an array and a scalar.
- The function cv::max calculates the per-element maximum of two arrays:
- \f[\texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{src2} (I))\f]
- or array and a scalar:
- \f[\texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{value} )\f]
- @param src1 first input array.
- @param src2 second input array of the same size and type as src1 .
- @param dst output array of the same size and type as src1.
- @sa min, compare, inRange, minMaxLoc, @ref MatrixExpressions
- */
- CV_EXPORTS_W void max(InputArray src1, InputArray src2, OutputArray dst);
- /** @overload
- needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
- */
- CV_EXPORTS void max(const Mat& src1, const Mat& src2, Mat& dst);
- /** @overload
- needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
- */
- CV_EXPORTS void max(const UMat& src1, const UMat& src2, UMat& dst);
- /** @brief Calculates a square root of array elements.
- The function cv::sqrt calculates a square root of each input array element.
- In case of multi-channel arrays, each channel is processed
- independently. The accuracy is approximately the same as of the built-in
- std::sqrt .
- @param src input floating-point array.
- @param dst output array of the same size and type as src.
- */
- CV_EXPORTS_W void sqrt(InputArray src, OutputArray dst);
- /** @brief Raises every array element to a power.
- The function cv::pow raises every element of the input array to power :
- \f[\texttt{dst} (I) = \fork{\texttt{src}(I)^{power}}{if \(\texttt{power}\) is integer}{|\texttt{src}(I)|^{power}}{otherwise}\f]
- So, for a non-integer power exponent, the absolute values of input array
- elements are used. However, it is possible to get true values for
- negative values using some extra operations. In the example below,
- computing the 5th root of array src shows:
- @code{.cpp}
- Mat mask = src < 0;
- pow(src, 1./5, dst);
- subtract(Scalar::all(0), dst, dst, mask);
- @endcode
- For some values of power, such as integer values, 0.5 and -0.5,
- specialized faster algorithms are used.
- Special values (NaN, Inf) are not handled.
- @param src input array.
- @param power exponent of power.
- @param dst output array of the same size and type as src.
- @sa sqrt, exp, log, cartToPolar, polarToCart
- */
- CV_EXPORTS_W void pow(InputArray src, double power, OutputArray dst);
- /** @brief Calculates the exponent of every array element.
- The function cv::exp calculates the exponent of every element of the input
- array:
- \f[\texttt{dst} [I] = e^{ src(I) }\f]
- The maximum relative error is about 7e-6 for single-precision input and
- less than 1e-10 for double-precision input. Currently, the function
- converts denormalized values to zeros on output. Special values (NaN,
- Inf) are not handled.
- @param src input array.
- @param dst output array of the same size and type as src.
- @sa log , cartToPolar , polarToCart , phase , pow , sqrt , magnitude
- */
- CV_EXPORTS_W void exp(InputArray src, OutputArray dst);
- /** @brief Calculates the natural logarithm of every array element.
- The function cv::log calculates the natural logarithm of every element of the input array:
- \f[\texttt{dst} (I) = \log (\texttt{src}(I)) \f]
- Output on zero, negative and special (NaN, Inf) values is undefined.
- @param src input array.
- @param dst output array of the same size and type as src .
- @sa exp, cartToPolar, polarToCart, phase, pow, sqrt, magnitude
- */
- CV_EXPORTS_W void log(InputArray src, OutputArray dst);
- /** @brief Calculates x and y coordinates of 2D vectors from their magnitude and angle.
- The function cv::polarToCart calculates the Cartesian coordinates of each 2D
- vector represented by the corresponding elements of magnitude and angle:
- \f[\begin{array}{l} \texttt{x} (I) = \texttt{magnitude} (I) \cos ( \texttt{angle} (I)) \\ \texttt{y} (I) = \texttt{magnitude} (I) \sin ( \texttt{angle} (I)) \\ \end{array}\f]
- The relative accuracy of the estimated coordinates is about 1e-6.
- @param magnitude input floating-point array of magnitudes of 2D vectors;
- it can be an empty matrix (=Mat()), in this case, the function assumes
- that all the magnitudes are =1; if it is not empty, it must have the
- same size and type as angle.
- @param angle input floating-point array of angles of 2D vectors.
- @param x output array of x-coordinates of 2D vectors; it has the same
- size and type as angle.
- @param y output array of y-coordinates of 2D vectors; it has the same
- size and type as angle.
- @param angleInDegrees when true, the input angles are measured in
- degrees, otherwise, they are measured in radians.
- @sa cartToPolar, magnitude, phase, exp, log, pow, sqrt
- */
- CV_EXPORTS_W void polarToCart(InputArray magnitude, InputArray angle,
- OutputArray x, OutputArray y, bool angleInDegrees = false);
- /** @brief Calculates the magnitude and angle of 2D vectors.
- The function cv::cartToPolar calculates either the magnitude, angle, or both
- for every 2D vector (x(I),y(I)):
- \f[\begin{array}{l} \texttt{magnitude} (I)= \sqrt{\texttt{x}(I)^2+\texttt{y}(I)^2} , \\ \texttt{angle} (I)= \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))[ \cdot180 / \pi ] \end{array}\f]
- The angles are calculated with accuracy about 0.3 degrees. For the point
- (0,0), the angle is set to 0.
- @param x array of x-coordinates; this must be a single-precision or
- double-precision floating-point array.
- @param y array of y-coordinates, that must have the same size and same type as x.
- @param magnitude output array of magnitudes of the same size and type as x.
- @param angle output array of angles that has the same size and type as
- x; the angles are measured in radians (from 0 to 2\*Pi) or in degrees (0 to 360 degrees).
- @param angleInDegrees a flag, indicating whether the angles are measured
- in radians (which is by default), or in degrees.
- @sa Sobel, Scharr
- */
- CV_EXPORTS_W void cartToPolar(InputArray x, InputArray y,
- OutputArray magnitude, OutputArray angle,
- bool angleInDegrees = false);
- /** @brief Calculates the rotation angle of 2D vectors.
- The function cv::phase calculates the rotation angle of each 2D vector that
- is formed from the corresponding elements of x and y :
- \f[\texttt{angle} (I) = \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))\f]
- The angle estimation accuracy is about 0.3 degrees. When x(I)=y(I)=0 ,
- the corresponding angle(I) is set to 0.
- @param x input floating-point array of x-coordinates of 2D vectors.
- @param y input array of y-coordinates of 2D vectors; it must have the
- same size and the same type as x.
- @param angle output array of vector angles; it has the same size and
- same type as x .
- @param angleInDegrees when true, the function calculates the angle in
- degrees, otherwise, they are measured in radians.
- */
- CV_EXPORTS_W void phase(InputArray x, InputArray y, OutputArray angle,
- bool angleInDegrees = false);
- /** @brief Calculates the magnitude of 2D vectors.
- The function cv::magnitude calculates the magnitude of 2D vectors formed
- from the corresponding elements of x and y arrays:
- \f[\texttt{dst} (I) = \sqrt{\texttt{x}(I)^2 + \texttt{y}(I)^2}\f]
- @param x floating-point array of x-coordinates of the vectors.
- @param y floating-point array of y-coordinates of the vectors; it must
- have the same size as x.
- @param magnitude output array of the same size and type as x.
- @sa cartToPolar, polarToCart, phase, sqrt
- */
- CV_EXPORTS_W void magnitude(InputArray x, InputArray y, OutputArray magnitude);
- /** @brief Checks every element of an input array for invalid values.
- The function cv::checkRange checks that every array element is neither NaN nor infinite. When minVal \>
- -DBL_MAX and maxVal \< DBL_MAX, the function also checks that each value is between minVal and
- maxVal. In case of multi-channel arrays, each channel is processed independently. If some values
- are out of range, position of the first outlier is stored in pos (when pos != NULL). Then, the
- function either returns false (when quiet=true) or throws an exception.
- @param a input array.
- @param quiet a flag, indicating whether the functions quietly return false when the array elements
- are out of range or they throw an exception.
- @param pos optional output parameter, when not NULL, must be a pointer to array of src.dims
- elements.
- @param minVal inclusive lower boundary of valid values range.
- @param maxVal exclusive upper boundary of valid values range.
- */
- CV_EXPORTS_W bool checkRange(InputArray a, bool quiet = true, CV_OUT Point* pos = 0,
- double minVal = -DBL_MAX, double maxVal = DBL_MAX);
- /** @brief converts NaNs to the given number
- @param a input/output matrix (CV_32F type).
- @param val value to convert the NaNs
- */
- CV_EXPORTS_W void patchNaNs(InputOutputArray a, double val = 0);
- /** @brief Performs generalized matrix multiplication.
- The function cv::gemm performs generalized matrix multiplication similar to the
- gemm functions in BLAS level 3. For example,
- `gemm(src1, src2, alpha, src3, beta, dst, GEMM_1_T + GEMM_3_T)`
- corresponds to
- \f[\texttt{dst} = \texttt{alpha} \cdot \texttt{src1} ^T \cdot \texttt{src2} + \texttt{beta} \cdot \texttt{src3} ^T\f]
- In case of complex (two-channel) data, performed a complex matrix
- multiplication.
- The function can be replaced with a matrix expression. For example, the
- above call can be replaced with:
- @code{.cpp}
- dst = alpha*src1.t()*src2 + beta*src3.t();
- @endcode
- @param src1 first multiplied input matrix that could be real(CV_32FC1,
- CV_64FC1) or complex(CV_32FC2, CV_64FC2).
- @param src2 second multiplied input matrix of the same type as src1.
- @param alpha weight of the matrix product.
- @param src3 third optional delta matrix added to the matrix product; it
- should have the same type as src1 and src2.
- @param beta weight of src3.
- @param dst output matrix; it has the proper size and the same type as
- input matrices.
- @param flags operation flags (cv::GemmFlags)
- @sa mulTransposed , transform
- */
- CV_EXPORTS_W void gemm(InputArray src1, InputArray src2, double alpha,
- InputArray src3, double beta, OutputArray dst, int flags = 0);
- /** @brief Calculates the product of a matrix and its transposition.
- The function cv::mulTransposed calculates the product of src and its
- transposition:
- \f[\texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} )^T ( \texttt{src} - \texttt{delta} )\f]
- if aTa=true , and
- \f[\texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} ) ( \texttt{src} - \texttt{delta} )^T\f]
- otherwise. The function is used to calculate the covariance matrix. With
- zero delta, it can be used as a faster substitute for general matrix
- product A\*B when B=A'
- @param src input single-channel matrix. Note that unlike gemm, the
- function can multiply not only floating-point matrices.
- @param dst output square matrix.
- @param aTa Flag specifying the multiplication ordering. See the
- description below.
- @param delta Optional delta matrix subtracted from src before the
- multiplication. When the matrix is empty ( delta=noArray() ), it is
- assumed to be zero, that is, nothing is subtracted. If it has the same
- size as src , it is simply subtracted. Otherwise, it is "repeated" (see
- repeat ) to cover the full src and then subtracted. Type of the delta
- matrix, when it is not empty, must be the same as the type of created
- output matrix. See the dtype parameter description below.
- @param scale Optional scale factor for the matrix product.
- @param dtype Optional type of the output matrix. When it is negative,
- the output matrix will have the same type as src . Otherwise, it will be
- type=CV_MAT_DEPTH(dtype) that should be either CV_32F or CV_64F .
- @sa calcCovarMatrix, gemm, repeat, reduce
- */
- CV_EXPORTS_W void mulTransposed( InputArray src, OutputArray dst, bool aTa,
- InputArray delta = noArray(),
- double scale = 1, int dtype = -1 );
- /** @brief Transposes a matrix.
- The function cv::transpose transposes the matrix src :
- \f[\texttt{dst} (i,j) = \texttt{src} (j,i)\f]
- @note No complex conjugation is done in case of a complex matrix. It
- should be done separately if needed.
- @param src input array.
- @param dst output array of the same type as src.
- */
- CV_EXPORTS_W void transpose(InputArray src, OutputArray dst);
- /** @brief Performs the matrix transformation of every array element.
- The function cv::transform performs the matrix transformation of every
- element of the array src and stores the results in dst :
- \f[\texttt{dst} (I) = \texttt{m} \cdot \texttt{src} (I)\f]
- (when m.cols=src.channels() ), or
- \f[\texttt{dst} (I) = \texttt{m} \cdot [ \texttt{src} (I); 1]\f]
- (when m.cols=src.channels()+1 )
- Every element of the N -channel array src is interpreted as N -element
- vector that is transformed using the M x N or M x (N+1) matrix m to
- M-element vector - the corresponding element of the output array dst .
- The function may be used for geometrical transformation of
- N -dimensional points, arbitrary linear color space transformation (such
- as various kinds of RGB to YUV transforms), shuffling the image
- channels, and so forth.
- @param src input array that must have as many channels (1 to 4) as
- m.cols or m.cols-1.
- @param dst output array of the same size and depth as src; it has as
- many channels as m.rows.
- @param m transformation 2x2 or 2x3 floating-point matrix.
- @sa perspectiveTransform, getAffineTransform, estimateAffine2D, warpAffine, warpPerspective
- */
- CV_EXPORTS_W void transform(InputArray src, OutputArray dst, InputArray m );
- /** @brief Performs the perspective matrix transformation of vectors.
- The function cv::perspectiveTransform transforms every element of src by
- treating it as a 2D or 3D vector, in the following way:
- \f[(x, y, z) \rightarrow (x'/w, y'/w, z'/w)\f]
- where
- \f[(x', y', z', w') = \texttt{mat} \cdot \begin{bmatrix} x & y & z & 1 \end{bmatrix}\f]
- and
- \f[w = \fork{w'}{if \(w' \ne 0\)}{\infty}{otherwise}\f]
- Here a 3D vector transformation is shown. In case of a 2D vector
- transformation, the z component is omitted.
- @note The function transforms a sparse set of 2D or 3D vectors. If you
- want to transform an image using perspective transformation, use
- warpPerspective . If you have an inverse problem, that is, you want to
- compute the most probable perspective transformation out of several
- pairs of corresponding points, you can use getPerspectiveTransform or
- findHomography .
- @param src input two-channel or three-channel floating-point array; each
- element is a 2D/3D vector to be transformed.
- @param dst output array of the same size and type as src.
- @param m 3x3 or 4x4 floating-point transformation matrix.
- @sa transform, warpPerspective, getPerspectiveTransform, findHomography
- */
- CV_EXPORTS_W void perspectiveTransform(InputArray src, OutputArray dst, InputArray m );
- /** @brief Copies the lower or the upper half of a square matrix to its another half.
- The function cv::completeSymm copies the lower or the upper half of a square matrix to
- its another half. The matrix diagonal remains unchanged:
- - \f$\texttt{m}_{ij}=\texttt{m}_{ji}\f$ for \f$i > j\f$ if
- lowerToUpper=false
- - \f$\texttt{m}_{ij}=\texttt{m}_{ji}\f$ for \f$i < j\f$ if
- lowerToUpper=true
- @param m input-output floating-point square matrix.
- @param lowerToUpper operation flag; if true, the lower half is copied to
- the upper half. Otherwise, the upper half is copied to the lower half.
- @sa flip, transpose
- */
- CV_EXPORTS_W void completeSymm(InputOutputArray m, bool lowerToUpper = false);
- /** @brief Initializes a scaled identity matrix.
- The function cv::setIdentity initializes a scaled identity matrix:
- \f[\texttt{mtx} (i,j)= \fork{\texttt{value}}{ if \(i=j\)}{0}{otherwise}\f]
- The function can also be emulated using the matrix initializers and the
- matrix expressions:
- @code
- Mat A = Mat::eye(4, 3, CV_32F)*5;
- // A will be set to [[5, 0, 0], [0, 5, 0], [0, 0, 5], [0, 0, 0]]
- @endcode
- @param mtx matrix to initialize (not necessarily square).
- @param s value to assign to diagonal elements.
- @sa Mat::zeros, Mat::ones, Mat::setTo, Mat::operator=
- */
- CV_EXPORTS_W void setIdentity(InputOutputArray mtx, const Scalar& s = Scalar(1));
- /** @brief Returns the determinant of a square floating-point matrix.
- The function cv::determinant calculates and returns the determinant of the
- specified matrix. For small matrices ( mtx.cols=mtx.rows\<=3 ), the
- direct method is used. For larger matrices, the function uses LU
- factorization with partial pivoting.
- For symmetric positively-determined matrices, it is also possible to use
- eigen decomposition to calculate the determinant.
- @param mtx input matrix that must have CV_32FC1 or CV_64FC1 type and
- square size.
- @sa trace, invert, solve, eigen, @ref MatrixExpressions
- */
- CV_EXPORTS_W double determinant(InputArray mtx);
- /** @brief Returns the trace of a matrix.
- The function cv::trace returns the sum of the diagonal elements of the
- matrix mtx .
- \f[\mathrm{tr} ( \texttt{mtx} ) = \sum _i \texttt{mtx} (i,i)\f]
- @param mtx input matrix.
- */
- CV_EXPORTS_W Scalar trace(InputArray mtx);
- /** @brief Finds the inverse or pseudo-inverse of a matrix.
- The function cv::invert inverts the matrix src and stores the result in dst
- . When the matrix src is singular or non-square, the function calculates
- the pseudo-inverse matrix (the dst matrix) so that norm(src\*dst - I) is
- minimal, where I is an identity matrix.
- In case of the #DECOMP_LU method, the function returns non-zero value if
- the inverse has been successfully calculated and 0 if src is singular.
- In case of the #DECOMP_SVD method, the function returns the inverse
- condition number of src (the ratio of the smallest singular value to the
- largest singular value) and 0 if src is singular. The SVD method
- calculates a pseudo-inverse matrix if src is singular.
- Similarly to #DECOMP_LU, the method #DECOMP_CHOLESKY works only with
- non-singular square matrices that should also be symmetrical and
- positively defined. In this case, the function stores the inverted
- matrix in dst and returns non-zero. Otherwise, it returns 0.
- @param src input floating-point M x N matrix.
- @param dst output matrix of N x M size and the same type as src.
- @param flags inversion method (cv::DecompTypes)
- @sa solve, SVD
- */
- CV_EXPORTS_W double invert(InputArray src, OutputArray dst, int flags = DECOMP_LU);
- /** @brief Solves one or more linear systems or least-squares problems.
- The function cv::solve solves a linear system or least-squares problem (the
- latter is possible with SVD or QR methods, or by specifying the flag
- #DECOMP_NORMAL ):
- \f[\texttt{dst} = \arg \min _X \| \texttt{src1} \cdot \texttt{X} - \texttt{src2} \|\f]
- If #DECOMP_LU or #DECOMP_CHOLESKY method is used, the function returns 1
- if src1 (or \f$\texttt{src1}^T\texttt{src1}\f$ ) is non-singular. Otherwise,
- it returns 0. In the latter case, dst is not valid. Other methods find a
- pseudo-solution in case of a singular left-hand side part.
- @note If you want to find a unity-norm solution of an under-defined
- singular system \f$\texttt{src1}\cdot\texttt{dst}=0\f$ , the function solve
- will not do the work. Use SVD::solveZ instead.
- @param src1 input matrix on the left-hand side of the system.
- @param src2 input matrix on the right-hand side of the system.
- @param dst output solution.
- @param flags solution (matrix inversion) method (#DecompTypes)
- @sa invert, SVD, eigen
- */
- CV_EXPORTS_W bool solve(InputArray src1, InputArray src2,
- OutputArray dst, int flags = DECOMP_LU);
- /** @brief Sorts each row or each column of a matrix.
- The function cv::sort sorts each matrix row or each matrix column in
- ascending or descending order. So you should pass two operation flags to
- get desired behaviour. If you want to sort matrix rows or columns
- lexicographically, you can use STL std::sort generic function with the
- proper comparison predicate.
- @param src input single-channel array.
- @param dst output array of the same size and type as src.
- @param flags operation flags, a combination of #SortFlags
- @sa sortIdx, randShuffle
- */
- CV_EXPORTS_W void sort(InputArray src, OutputArray dst, int flags);
- /** @brief Sorts each row or each column of a matrix.
- The function cv::sortIdx sorts each matrix row or each matrix column in the
- ascending or descending order. So you should pass two operation flags to
- get desired behaviour. Instead of reordering the elements themselves, it
- stores the indices of sorted elements in the output array. For example:
- @code
- Mat A = Mat::eye(3,3,CV_32F), B;
- sortIdx(A, B, SORT_EVERY_ROW + SORT_ASCENDING);
- // B will probably contain
- // (because of equal elements in A some permutations are possible):
- // [[1, 2, 0], [0, 2, 1], [0, 1, 2]]
- @endcode
- @param src input single-channel array.
- @param dst output integer array of the same size as src.
- @param flags operation flags that could be a combination of cv::SortFlags
- @sa sort, randShuffle
- */
- CV_EXPORTS_W void sortIdx(InputArray src, OutputArray dst, int flags);
- /** @brief Finds the real roots of a cubic equation.
- The function solveCubic finds the real roots of a cubic equation:
- - if coeffs is a 4-element vector:
- \f[\texttt{coeffs} [0] x^3 + \texttt{coeffs} [1] x^2 + \texttt{coeffs} [2] x + \texttt{coeffs} [3] = 0\f]
- - if coeffs is a 3-element vector:
- \f[x^3 + \texttt{coeffs} [0] x^2 + \texttt{coeffs} [1] x + \texttt{coeffs} [2] = 0\f]
- The roots are stored in the roots array.
- @param coeffs equation coefficients, an array of 3 or 4 elements.
- @param roots output array of real roots that has 1 or 3 elements.
- @return number of real roots. It can be 0, 1 or 2.
- */
- CV_EXPORTS_W int solveCubic(InputArray coeffs, OutputArray roots);
- /** @brief Finds the real or complex roots of a polynomial equation.
- The function cv::solvePoly finds real and complex roots of a polynomial equation:
- \f[\texttt{coeffs} [n] x^{n} + \texttt{coeffs} [n-1] x^{n-1} + ... + \texttt{coeffs} [1] x + \texttt{coeffs} [0] = 0\f]
- @param coeffs array of polynomial coefficients.
- @param roots output (complex) array of roots.
- @param maxIters maximum number of iterations the algorithm does.
- */
- CV_EXPORTS_W double solvePoly(InputArray coeffs, OutputArray roots, int maxIters = 300);
- /** @brief Calculates eigenvalues and eigenvectors of a symmetric matrix.
- The function cv::eigen calculates just eigenvalues, or eigenvalues and eigenvectors of the symmetric
- matrix src:
- @code
- src*eigenvectors.row(i).t() = eigenvalues.at<srcType>(i)*eigenvectors.row(i).t()
- @endcode
- @note Use cv::eigenNonSymmetric for calculation of real eigenvalues and eigenvectors of non-symmetric matrix.
- @param src input matrix that must have CV_32FC1 or CV_64FC1 type, square size and be symmetrical
- (src ^T^ == src).
- @param eigenvalues output vector of eigenvalues of the same type as src; the eigenvalues are stored
- in the descending order.
- @param eigenvectors output matrix of eigenvectors; it has the same size and type as src; the
- eigenvectors are stored as subsequent matrix rows, in the same order as the corresponding
- eigenvalues.
- @sa eigenNonSymmetric, completeSymm , PCA
- */
- CV_EXPORTS_W bool eigen(InputArray src, OutputArray eigenvalues,
- OutputArray eigenvectors = noArray());
- /** @brief Calculates eigenvalues and eigenvectors of a non-symmetric matrix (real eigenvalues only).
- @note Assumes real eigenvalues.
- The function calculates eigenvalues and eigenvectors (optional) of the square matrix src:
- @code
- src*eigenvectors.row(i).t() = eigenvalues.at<srcType>(i)*eigenvectors.row(i).t()
- @endcode
- @param src input matrix (CV_32FC1 or CV_64FC1 type).
- @param eigenvalues output vector of eigenvalues (type is the same type as src).
- @param eigenvectors output matrix of eigenvectors (type is the same type as src). The eigenvectors are stored as subsequent matrix rows, in the same order as the corresponding eigenvalues.
- @sa eigen
- */
- CV_EXPORTS_W void eigenNonSymmetric(InputArray src, OutputArray eigenvalues,
- OutputArray eigenvectors);
- /** @brief Calculates the covariance matrix of a set of vectors.
- The function cv::calcCovarMatrix calculates the covariance matrix and, optionally, the mean vector of
- the set of input vectors.
- @param samples samples stored as separate matrices
- @param nsamples number of samples
- @param covar output covariance matrix of the type ctype and square size.
- @param mean input or output (depending on the flags) array as the average value of the input vectors.
- @param flags operation flags as a combination of #CovarFlags
- @param ctype type of the matrixl; it equals 'CV_64F' by default.
- @sa PCA, mulTransposed, Mahalanobis
- @todo InputArrayOfArrays
- */
- CV_EXPORTS void calcCovarMatrix( const Mat* samples, int nsamples, Mat& covar, Mat& mean,
- int flags, int ctype = CV_64F);
- /** @overload
- @note use #COVAR_ROWS or #COVAR_COLS flag
- @param samples samples stored as rows/columns of a single matrix.
- @param covar output covariance matrix of the type ctype and square size.
- @param mean input or output (depending on the flags) array as the average value of the input vectors.
- @param flags operation flags as a combination of #CovarFlags
- @param ctype type of the matrixl; it equals 'CV_64F' by default.
- */
- CV_EXPORTS_W void calcCovarMatrix( InputArray samples, OutputArray covar,
- InputOutputArray mean, int flags, int ctype = CV_64F);
- /** wrap PCA::operator() */
- CV_EXPORTS_W void PCACompute(InputArray data, InputOutputArray mean,
- OutputArray eigenvectors, int maxComponents = 0);
- /** wrap PCA::operator() and add eigenvalues output parameter */
- CV_EXPORTS_AS(PCACompute2) void PCACompute(InputArray data, InputOutputArray mean,
- OutputArray eigenvectors, OutputArray eigenvalues,
- int maxComponents = 0);
- /** wrap PCA::operator() */
- CV_EXPORTS_W void PCACompute(InputArray data, InputOutputArray mean,
- OutputArray eigenvectors, double retainedVariance);
- /** wrap PCA::operator() and add eigenvalues output parameter */
- CV_EXPORTS_AS(PCACompute2) void PCACompute(InputArray data, InputOutputArray mean,
- OutputArray eigenvectors, OutputArray eigenvalues,
- double retainedVariance);
- /** wrap PCA::project */
- CV_EXPORTS_W void PCAProject(InputArray data, InputArray mean,
- InputArray eigenvectors, OutputArray result);
- /** wrap PCA::backProject */
- CV_EXPORTS_W void PCABackProject(InputArray data, InputArray mean,
- InputArray eigenvectors, OutputArray result);
- /** wrap SVD::compute */
- CV_EXPORTS_W void SVDecomp( InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags = 0 );
- /** wrap SVD::backSubst */
- CV_EXPORTS_W void SVBackSubst( InputArray w, InputArray u, InputArray vt,
- InputArray rhs, OutputArray dst );
- /** @brief Calculates the Mahalanobis distance between two vectors.
- The function cv::Mahalanobis calculates and returns the weighted distance between two vectors:
- \f[d( \texttt{vec1} , \texttt{vec2} )= \sqrt{\sum_{i,j}{\texttt{icovar(i,j)}\cdot(\texttt{vec1}(I)-\texttt{vec2}(I))\cdot(\texttt{vec1(j)}-\texttt{vec2(j)})} }\f]
- The covariance matrix may be calculated using the #calcCovarMatrix function and then inverted using
- the invert function (preferably using the #DECOMP_SVD method, as the most accurate).
- @param v1 first 1D input vector.
- @param v2 second 1D input vector.
- @param icovar inverse covariance matrix.
- */
- CV_EXPORTS_W double Mahalanobis(InputArray v1, InputArray v2, InputArray icovar);
- /** @brief Performs a forward or inverse Discrete Fourier transform of a 1D or 2D floating-point array.
- The function cv::dft performs one of the following:
- - Forward the Fourier transform of a 1D vector of N elements:
- \f[Y = F^{(N)} \cdot X,\f]
- where \f$F^{(N)}_{jk}=\exp(-2\pi i j k/N)\f$ and \f$i=\sqrt{-1}\f$
- - Inverse the Fourier transform of a 1D vector of N elements:
- \f[\begin{array}{l} X'= \left (F^{(N)} \right )^{-1} \cdot Y = \left (F^{(N)} \right )^* \cdot y \\ X = (1/N) \cdot X, \end{array}\f]
- where \f$F^*=\left(\textrm{Re}(F^{(N)})-\textrm{Im}(F^{(N)})\right)^T\f$
- - Forward the 2D Fourier transform of a M x N matrix:
- \f[Y = F^{(M)} \cdot X \cdot F^{(N)}\f]
- - Inverse the 2D Fourier transform of a M x N matrix:
- \f[\begin{array}{l} X'= \left (F^{(M)} \right )^* \cdot Y \cdot \left (F^{(N)} \right )^* \\ X = \frac{1}{M \cdot N} \cdot X' \end{array}\f]
- In case of real (single-channel) data, the output spectrum of the forward Fourier transform or input
- spectrum of the inverse Fourier transform can be represented in a packed format called *CCS*
- (complex-conjugate-symmetrical). It was borrowed from IPL (Intel\* Image Processing Library). Here
- is how 2D *CCS* spectrum looks:
- \f[\begin{bmatrix} Re Y_{0,0} & Re Y_{0,1} & Im Y_{0,1} & Re Y_{0,2} & Im Y_{0,2} & \cdots & Re Y_{0,N/2-1} & Im Y_{0,N/2-1} & Re Y_{0,N/2} \\ Re Y_{1,0} & Re Y_{1,1} & Im Y_{1,1} & Re Y_{1,2} & Im Y_{1,2} & \cdots & Re Y_{1,N/2-1} & Im Y_{1,N/2-1} & Re Y_{1,N/2} \\ Im Y_{1,0} & Re Y_{2,1} & Im Y_{2,1} & Re Y_{2,2} & Im Y_{2,2} & \cdots & Re Y_{2,N/2-1} & Im Y_{2,N/2-1} & Im Y_{1,N/2} \\ \hdotsfor{9} \\ Re Y_{M/2-1,0} & Re Y_{M-3,1} & Im Y_{M-3,1} & \hdotsfor{3} & Re Y_{M-3,N/2-1} & Im Y_{M-3,N/2-1}& Re Y_{M/2-1,N/2} \\ Im Y_{M/2-1,0} & Re Y_{M-2,1} & Im Y_{M-2,1} & \hdotsfor{3} & Re Y_{M-2,N/2-1} & Im Y_{M-2,N/2-1}& Im Y_{M/2-1,N/2} \\ Re Y_{M/2,0} & Re Y_{M-1,1} & Im Y_{M-1,1} & \hdotsfor{3} & Re Y_{M-1,N/2-1} & Im Y_{M-1,N/2-1}& Re Y_{M/2,N/2} \end{bmatrix}\f]
- In case of 1D transform of a real vector, the output looks like the first row of the matrix above.
- So, the function chooses an operation mode depending on the flags and size of the input array:
- - If #DFT_ROWS is set or the input array has a single row or single column, the function
- performs a 1D forward or inverse transform of each row of a matrix when #DFT_ROWS is set.
- Otherwise, it performs a 2D transform.
- - If the input array is real and #DFT_INVERSE is not set, the function performs a forward 1D or
- 2D transform:
- - When #DFT_COMPLEX_OUTPUT is set, the output is a complex matrix of the same size as
- input.
- - When #DFT_COMPLEX_OUTPUT is not set, the output is a real matrix of the same size as
- input. In case of 2D transform, it uses the packed format as shown above. In case of a
- single 1D transform, it looks like the first row of the matrix above. In case of
- multiple 1D transforms (when using the #DFT_ROWS flag), each row of the output matrix
- looks like the first row of the matrix above.
- - If the input array is complex and either #DFT_INVERSE or #DFT_REAL_OUTPUT are not set, the
- output is a complex array of the same size as input. The function performs a forward or
- inverse 1D or 2D transform of the whole input array or each row of the input array
- independently, depending on the flags DFT_INVERSE and DFT_ROWS.
- - When #DFT_INVERSE is set and the input array is real, or it is complex but #DFT_REAL_OUTPUT
- is set, the output is a real array of the same size as input. The function performs a 1D or 2D
- inverse transformation of the whole input array or each individual row, depending on the flags
- #DFT_INVERSE and #DFT_ROWS.
- If #DFT_SCALE is set, the scaling is done after the transformation.
- Unlike dct , the function supports arrays of arbitrary size. But only those arrays are processed
- efficiently, whose sizes can be factorized in a product of small prime numbers (2, 3, and 5 in the
- current implementation). Such an efficient DFT size can be calculated using the getOptimalDFTSize
- method.
- The sample below illustrates how to calculate a DFT-based convolution of two 2D real arrays:
- @code
- void convolveDFT(InputArray A, InputArray B, OutputArray C)
- {
- // reallocate the output array if needed
- C.create(abs(A.rows - B.rows)+1, abs(A.cols - B.cols)+1, A.type());
- Size dftSize;
- // calculate the size of DFT transform
- dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1);
- dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1);
- // allocate temporary buffers and initialize them with 0's
- Mat tempA(dftSize, A.type(), Scalar::all(0));
- Mat tempB(dftSize, B.type(), Scalar::all(0));
- // copy A and B to the top-left corners of tempA and tempB, respectively
- Mat roiA(tempA, Rect(0,0,A.cols,A.rows));
- A.copyTo(roiA);
- Mat roiB(tempB, Rect(0,0,B.cols,B.rows));
- B.copyTo(roiB);
- // now transform the padded A & B in-place;
- // use "nonzeroRows" hint for faster processing
- dft(tempA, tempA, 0, A.rows);
- dft(tempB, tempB, 0, B.rows);
- // multiply the spectrums;
- // the function handles packed spectrum representations well
- mulSpectrums(tempA, tempB, tempA);
- // transform the product back from the frequency domain.
- // Even though all the result rows will be non-zero,
- // you need only the first C.rows of them, and thus you
- // pass nonzeroRows == C.rows
- dft(tempA, tempA, DFT_INVERSE + DFT_SCALE, C.rows);
- // now copy the result back to C.
- tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C);
- // all the temporary buffers will be deallocated automatically
- }
- @endcode
- To optimize this sample, consider the following approaches:
- - Since nonzeroRows != 0 is passed to the forward transform calls and since A and B are copied to
- the top-left corners of tempA and tempB, respectively, it is not necessary to clear the whole
- tempA and tempB. It is only necessary to clear the tempA.cols - A.cols ( tempB.cols - B.cols)
- rightmost columns of the matrices.
- - This DFT-based convolution does not have to be applied to the whole big arrays, especially if B
- is significantly smaller than A or vice versa. Instead, you can calculate convolution by parts.
- To do this, you need to split the output array C into multiple tiles. For each tile, estimate
- which parts of A and B are required to calculate convolution in this tile. If the tiles in C are
- too small, the speed will decrease a lot because of repeated work. In the ultimate case, when
- each tile in C is a single pixel, the algorithm becomes equivalent to the naive convolution
- algorithm. If the tiles are too big, the temporary arrays tempA and tempB become too big and
- there is also a slowdown because of bad cache locality. So, there is an optimal tile size
- somewhere in the middle.
- - If different tiles in C can be calculated in parallel and, thus, the convolution is done by
- parts, the loop can be threaded.
- All of the above improvements have been implemented in #matchTemplate and #filter2D . Therefore, by
- using them, you can get the performance even better than with the above theoretically optimal
- implementation. Though, those two functions actually calculate cross-correlation, not convolution,
- so you need to "flip" the second convolution operand B vertically and horizontally using flip .
- @note
- - An example using the discrete fourier transform can be found at
- opencv_source_code/samples/cpp/dft.cpp
- - (Python) An example using the dft functionality to perform Wiener deconvolution can be found
- at opencv_source/samples/python/deconvolution.py
- - (Python) An example rearranging the quadrants of a Fourier image can be found at
- opencv_source/samples/python/dft.py
- @param src input array that could be real or complex.
- @param dst output array whose size and type depends on the flags .
- @param flags transformation flags, representing a combination of the #DftFlags
- @param nonzeroRows when the parameter is not zero, the function assumes that only the first
- nonzeroRows rows of the input array (#DFT_INVERSE is not set) or only the first nonzeroRows of the
- output array (#DFT_INVERSE is set) contain non-zeros, thus, the function can handle the rest of the
- rows more efficiently and save some time; this technique is very useful for calculating array
- cross-correlation or convolution using DFT.
- @sa dct , getOptimalDFTSize , mulSpectrums, filter2D , matchTemplate , flip , cartToPolar ,
- magnitude , phase
- */
- CV_EXPORTS_W void dft(InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0);
- /** @brief Calculates the inverse Discrete Fourier Transform of a 1D or 2D array.
- idft(src, dst, flags) is equivalent to dft(src, dst, flags | #DFT_INVERSE) .
- @note None of dft and idft scales the result by default. So, you should pass #DFT_SCALE to one of
- dft or idft explicitly to make these transforms mutually inverse.
- @sa dft, dct, idct, mulSpectrums, getOptimalDFTSize
- @param src input floating-point real or complex array.
- @param dst output array whose size and type depend on the flags.
- @param flags operation flags (see dft and #DftFlags).
- @param nonzeroRows number of dst rows to process; the rest of the rows have undefined content (see
- the convolution sample in dft description.
- */
- CV_EXPORTS_W void idft(InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0);
- /** @brief Performs a forward or inverse discrete Cosine transform of 1D or 2D array.
- The function cv::dct performs a forward or inverse discrete Cosine transform (DCT) of a 1D or 2D
- floating-point array:
- - Forward Cosine transform of a 1D vector of N elements:
- \f[Y = C^{(N)} \cdot X\f]
- where
- \f[C^{(N)}_{jk}= \sqrt{\alpha_j/N} \cos \left ( \frac{\pi(2k+1)j}{2N} \right )\f]
- and
- \f$\alpha_0=1\f$, \f$\alpha_j=2\f$ for *j \> 0*.
- - Inverse Cosine transform of a 1D vector of N elements:
- \f[X = \left (C^{(N)} \right )^{-1} \cdot Y = \left (C^{(N)} \right )^T \cdot Y\f]
- (since \f$C^{(N)}\f$ is an orthogonal matrix, \f$C^{(N)} \cdot \left(C^{(N)}\right)^T = I\f$ )
- - Forward 2D Cosine transform of M x N matrix:
- \f[Y = C^{(N)} \cdot X \cdot \left (C^{(N)} \right )^T\f]
- - Inverse 2D Cosine transform of M x N matrix:
- \f[X = \left (C^{(N)} \right )^T \cdot X \cdot C^{(N)}\f]
- The function chooses the mode of operation by looking at the flags and size of the input array:
- - If (flags & #DCT_INVERSE) == 0 , the function does a forward 1D or 2D transform. Otherwise, it
- is an inverse 1D or 2D transform.
- - If (flags & #DCT_ROWS) != 0 , the function performs a 1D transform of each row.
- - If the array is a single column or a single row, the function performs a 1D transform.
- - If none of the above is true, the function performs a 2D transform.
- @note Currently dct supports even-size arrays (2, 4, 6 ...). For data analysis and approximation, you
- can pad the array when necessary.
- Also, the function performance depends very much, and not monotonically, on the array size (see
- getOptimalDFTSize ). In the current implementation DCT of a vector of size N is calculated via DFT
- of a vector of size N/2 . Thus, the optimal DCT size N1 \>= N can be calculated as:
- @code
- size_t getOptimalDCTSize(size_t N) { return 2*getOptimalDFTSize((N+1)/2); }
- N1 = getOptimalDCTSize(N);
- @endcode
- @param src input floating-point array.
- @param dst output array of the same size and type as src .
- @param flags transformation flags as a combination of cv::DftFlags (DCT_*)
- @sa dft , getOptimalDFTSize , idct
- */
- CV_EXPORTS_W void dct(InputArray src, OutputArray dst, int flags = 0);
- /** @brief Calculates the inverse Discrete Cosine Transform of a 1D or 2D array.
- idct(src, dst, flags) is equivalent to dct(src, dst, flags | DCT_INVERSE).
- @param src input floating-point single-channel array.
- @param dst output array of the same size and type as src.
- @param flags operation flags.
- @sa dct, dft, idft, getOptimalDFTSize
- */
- CV_EXPORTS_W void idct(InputArray src, OutputArray dst, int flags = 0);
- /** @brief Performs the per-element multiplication of two Fourier spectrums.
- The function cv::mulSpectrums performs the per-element multiplication of the two CCS-packed or complex
- matrices that are results of a real or complex Fourier transform.
- The function, together with dft and idft , may be used to calculate convolution (pass conjB=false )
- or correlation (pass conjB=true ) of two arrays rapidly. When the arrays are complex, they are
- simply multiplied (per element) with an optional conjugation of the second-array elements. When the
- arrays are real, they are assumed to be CCS-packed (see dft for details).
- @param a first input array.
- @param b second input array of the same size and type as src1 .
- @param c output array of the same size and type as src1 .
- @param flags operation flags; currently, the only supported flag is cv::DFT_ROWS, which indicates that
- each row of src1 and src2 is an independent 1D Fourier spectrum. If you do not want to use this flag, then simply add a `0` as value.
- @param conjB optional flag that conjugates the second input array before the multiplication (true)
- or not (false).
- */
- CV_EXPORTS_W void mulSpectrums(InputArray a, InputArray b, OutputArray c,
- int flags, bool conjB = false);
- /** @brief Returns the optimal DFT size for a given vector size.
- DFT performance is not a monotonic function of a vector size. Therefore, when you calculate
- convolution of two arrays or perform the spectral analysis of an array, it usually makes sense to
- pad the input data with zeros to get a bit larger array that can be transformed much faster than the
- original one. Arrays whose size is a power-of-two (2, 4, 8, 16, 32, ...) are the fastest to process.
- Though, the arrays whose size is a product of 2's, 3's, and 5's (for example, 300 = 5\*5\*3\*2\*2)
- are also processed quite efficiently.
- The function cv::getOptimalDFTSize returns the minimum number N that is greater than or equal to vecsize
- so that the DFT of a vector of size N can be processed efficiently. In the current implementation N
- = 2 ^p^ \* 3 ^q^ \* 5 ^r^ for some integer p, q, r.
- The function returns a negative number if vecsize is too large (very close to INT_MAX ).
- While the function cannot be used directly to estimate the optimal vector size for DCT transform
- (since the current DCT implementation supports only even-size vectors), it can be easily processed
- as getOptimalDFTSize((vecsize+1)/2)\*2.
- @param vecsize vector size.
- @sa dft , dct , idft , idct , mulSpectrums
- */
- CV_EXPORTS_W int getOptimalDFTSize(int vecsize);
- /** @brief Returns the default random number generator.
- The function cv::theRNG returns the default random number generator. For each thread, there is a
- separate random number generator, so you can use the function safely in multi-thread environments.
- If you just need to get a single random number using this generator or initialize an array, you can
- use randu or randn instead. But if you are going to generate many random numbers inside a loop, it
- is much faster to use this function to retrieve the generator and then use RNG::operator _Tp() .
- @sa RNG, randu, randn
- */
- CV_EXPORTS RNG& theRNG();
- /** @brief Sets state of default random number generator.
- The function cv::setRNGSeed sets state of default random number generator to custom value.
- @param seed new state for default random number generator
- @sa RNG, randu, randn
- */
- CV_EXPORTS_W void setRNGSeed(int seed);
- /** @brief Generates a single uniformly-distributed random number or an array of random numbers.
- Non-template variant of the function fills the matrix dst with uniformly-distributed
- random numbers from the specified range:
- \f[\texttt{low} _c \leq \texttt{dst} (I)_c < \texttt{high} _c\f]
- @param dst output array of random numbers; the array must be pre-allocated.
- @param low inclusive lower boundary of the generated random numbers.
- @param high exclusive upper boundary of the generated random numbers.
- @sa RNG, randn, theRNG
- */
- CV_EXPORTS_W void randu(InputOutputArray dst, InputArray low, InputArray high);
- /** @brief Fills the array with normally distributed random numbers.
- The function cv::randn fills the matrix dst with normally distributed random numbers with the specified
- mean vector and the standard deviation matrix. The generated random numbers are clipped to fit the
- value range of the output array data type.
- @param dst output array of random numbers; the array must be pre-allocated and have 1 to 4 channels.
- @param mean mean value (expectation) of the generated random numbers.
- @param stddev standard deviation of the generated random numbers; it can be either a vector (in
- which case a diagonal standard deviation matrix is assumed) or a square matrix.
- @sa RNG, randu
- */
- CV_EXPORTS_W void randn(InputOutputArray dst, InputArray mean, InputArray stddev);
- /** @brief Shuffles the array elements randomly.
- The function cv::randShuffle shuffles the specified 1D array by randomly choosing pairs of elements and
- swapping them. The number of such swap operations will be dst.rows\*dst.cols\*iterFactor .
- @param dst input/output numerical 1D array.
- @param iterFactor scale factor that determines the number of random swap operations (see the details
- below).
- @param rng optional random number generator used for shuffling; if it is zero, theRNG () is used
- instead.
- @sa RNG, sort
- */
- CV_EXPORTS_W void randShuffle(InputOutputArray dst, double iterFactor = 1., RNG* rng = 0);
- /** @brief Principal Component Analysis
- The class is used to calculate a special basis for a set of vectors. The
- basis will consist of eigenvectors of the covariance matrix calculated
- from the input set of vectors. The class %PCA can also transform
- vectors to/from the new coordinate space defined by the basis. Usually,
- in this new coordinate system, each vector from the original set (and
- any linear combination of such vectors) can be quite accurately
- approximated by taking its first few components, corresponding to the
- eigenvectors of the largest eigenvalues of the covariance matrix.
- Geometrically it means that you calculate a projection of the vector to
- a subspace formed by a few eigenvectors corresponding to the dominant
- eigenvalues of the covariance matrix. And usually such a projection is
- very close to the original vector. So, you can represent the original
- vector from a high-dimensional space with a much shorter vector
- consisting of the projected vector's coordinates in the subspace. Such a
- transformation is also known as Karhunen-Loeve Transform, or KLT.
- See http://en.wikipedia.org/wiki/Principal_component_analysis
- The sample below is the function that takes two matrices. The first
- function stores a set of vectors (a row per vector) that is used to
- calculate PCA. The second function stores another "test" set of vectors
- (a row per vector). First, these vectors are compressed with PCA, then
- reconstructed back, and then the reconstruction error norm is computed
- and printed for each vector. :
- @code{.cpp}
- using namespace cv;
- PCA compressPCA(const Mat& pcaset, int maxComponents,
- const Mat& testset, Mat& compressed)
- {
- PCA pca(pcaset, // pass the data
- Mat(), // we do not have a pre-computed mean vector,
- // so let the PCA engine to compute it
- PCA::DATA_AS_ROW, // indicate that the vectors
- // are stored as matrix rows
- // (use PCA::DATA_AS_COL if the vectors are
- // the matrix columns)
- maxComponents // specify, how many principal components to retain
- );
- // if there is no test data, just return the computed basis, ready-to-use
- if( !testset.data )
- return pca;
- CV_Assert( testset.cols == pcaset.cols );
- compressed.create(testset.rows, maxComponents, testset.type());
- Mat reconstructed;
- for( int i = 0; i < testset.rows; i++ )
- {
- Mat vec = testset.row(i), coeffs = compressed.row(i), reconstructed;
- // compress the vector, the result will be stored
- // in the i-th row of the output matrix
- pca.project(vec, coeffs);
- // and then reconstruct it
- pca.backProject(coeffs, reconstructed);
- // and measure the error
- printf("%d. diff = %g\n", i, norm(vec, reconstructed, NORM_L2));
- }
- return pca;
- }
- @endcode
- @sa calcCovarMatrix, mulTransposed, SVD, dft, dct
- */
- class CV_EXPORTS PCA
- {
- public:
- enum Flags { DATA_AS_ROW = 0, //!< indicates that the input samples are stored as matrix rows
- DATA_AS_COL = 1, //!< indicates that the input samples are stored as matrix columns
- USE_AVG = 2 //!
- };
- /** @brief default constructor
- The default constructor initializes an empty %PCA structure. The other
- constructors initialize the structure and call PCA::operator()().
- */
- PCA();
- /** @overload
- @param data input samples stored as matrix rows or matrix columns.
- @param mean optional mean value; if the matrix is empty (@c noArray()),
- the mean is computed from the data.
- @param flags operation flags; currently the parameter is only used to
- specify the data layout (PCA::Flags)
- @param maxComponents maximum number of components that %PCA should
- retain; by default, all the components are retained.
- */
- PCA(InputArray data, InputArray mean, int flags, int maxComponents = 0);
- /** @overload
- @param data input samples stored as matrix rows or matrix columns.
- @param mean optional mean value; if the matrix is empty (noArray()),
- the mean is computed from the data.
- @param flags operation flags; currently the parameter is only used to
- specify the data layout (PCA::Flags)
- @param retainedVariance Percentage of variance that PCA should retain.
- Using this parameter will let the PCA decided how many components to
- retain but it will always keep at least 2.
- */
- PCA(InputArray data, InputArray mean, int flags, double retainedVariance);
- /** @brief performs %PCA
- The operator performs %PCA of the supplied dataset. It is safe to reuse
- the same PCA structure for multiple datasets. That is, if the structure
- has been previously used with another dataset, the existing internal
- data is reclaimed and the new @ref eigenvalues, @ref eigenvectors and @ref
- mean are allocated and computed.
- The computed @ref eigenvalues are sorted from the largest to the smallest and
- the corresponding @ref eigenvectors are stored as eigenvectors rows.
- @param data input samples stored as the matrix rows or as the matrix
- columns.
- @param mean optional mean value; if the matrix is empty (noArray()),
- the mean is computed from the data.
- @param flags operation flags; currently the parameter is only used to
- specify the data layout. (Flags)
- @param maxComponents maximum number of components that PCA should
- retain; by default, all the components are retained.
- */
- PCA& operator()(InputArray data, InputArray mean, int flags, int maxComponents = 0);
- /** @overload
- @param data input samples stored as the matrix rows or as the matrix
- columns.
- @param mean optional mean value; if the matrix is empty (noArray()),
- the mean is computed from the data.
- @param flags operation flags; currently the parameter is only used to
- specify the data layout. (PCA::Flags)
- @param retainedVariance Percentage of variance that %PCA should retain.
- Using this parameter will let the %PCA decided how many components to
- retain but it will always keep at least 2.
- */
- PCA& operator()(InputArray data, InputArray mean, int flags, double retainedVariance);
- /** @brief Projects vector(s) to the principal component subspace.
- The methods project one or more vectors to the principal component
- subspace, where each vector projection is represented by coefficients in
- the principal component basis. The first form of the method returns the
- matrix that the second form writes to the result. So the first form can
- be used as a part of expression while the second form can be more
- efficient in a processing loop.
- @param vec input vector(s); must have the same dimensionality and the
- same layout as the input data used at %PCA phase, that is, if
- DATA_AS_ROW are specified, then `vec.cols==data.cols`
- (vector dimensionality) and `vec.rows` is the number of vectors to
- project, and the same is true for the PCA::DATA_AS_COL case.
- */
- Mat project(InputArray vec) const;
- /** @overload
- @param vec input vector(s); must have the same dimensionality and the
- same layout as the input data used at PCA phase, that is, if
- DATA_AS_ROW are specified, then `vec.cols==data.cols`
- (vector dimensionality) and `vec.rows` is the number of vectors to
- project, and the same is true for the PCA::DATA_AS_COL case.
- @param result output vectors; in case of PCA::DATA_AS_COL, the
- output matrix has as many columns as the number of input vectors, this
- means that `result.cols==vec.cols` and the number of rows match the
- number of principal components (for example, `maxComponents` parameter
- passed to the constructor).
- */
- void project(InputArray vec, OutputArray result) const;
- /** @brief Reconstructs vectors from their PC projections.
- The methods are inverse operations to PCA::project. They take PC
- coordinates of projected vectors and reconstruct the original vectors.
- Unless all the principal components have been retained, the
- reconstructed vectors are different from the originals. But typically,
- the difference is small if the number of components is large enough (but
- still much smaller than the original vector dimensionality). As a
- result, PCA is used.
- @param vec coordinates of the vectors in the principal component
- subspace, the layout and size are the same as of PCA::project output
- vectors.
- */
- Mat backProject(InputArray vec) const;
- /** @overload
- @param vec coordinates of the vectors in the principal component
- subspace, the layout and size are the same as of PCA::project output
- vectors.
- @param result reconstructed vectors; the layout and size are the same as
- of PCA::project input vectors.
- */
- void backProject(InputArray vec, OutputArray result) const;
- /** @brief write PCA objects
- Writes @ref eigenvalues @ref eigenvectors and @ref mean to specified FileStorage
- */
- void write(FileStorage& fs) const;
- /** @brief load PCA objects
- Loads @ref eigenvalues @ref eigenvectors and @ref mean from specified FileNode
- */
- void read(const FileNode& fn);
- Mat eigenvectors; //!< eigenvectors of the covariation matrix
- Mat eigenvalues; //!< eigenvalues of the covariation matrix
- Mat mean; //!< mean value subtracted before the projection and added after the back projection
- };
- /** @example samples/cpp/pca.cpp
- An example using %PCA for dimensionality reduction while maintaining an amount of variance
- */
- /** @example samples/cpp/tutorial_code/ml/introduction_to_pca/introduction_to_pca.cpp
- Check @ref tutorial_introduction_to_pca "the corresponding tutorial" for more details
- */
- /**
- @brief Linear Discriminant Analysis
- @todo document this class
- */
- class CV_EXPORTS LDA
- {
- public:
- /** @brief constructor
- Initializes a LDA with num_components (default 0).
- */
- explicit LDA(int num_components = 0);
- /** Initializes and performs a Discriminant Analysis with Fisher's
- Optimization Criterion on given data in src and corresponding labels
- in labels. If 0 (or less) number of components are given, they are
- automatically determined for given data in computation.
- */
- LDA(InputArrayOfArrays src, InputArray labels, int num_components = 0);
- /** Serializes this object to a given filename.
- */
- void save(const String& filename) const;
- /** Deserializes this object from a given filename.
- */
- void load(const String& filename);
- /** Serializes this object to a given cv::FileStorage.
- */
- void save(FileStorage& fs) const;
- /** Deserializes this object from a given cv::FileStorage.
- */
- void load(const FileStorage& node);
- /** destructor
- */
- ~LDA();
- /** Compute the discriminants for data in src (row aligned) and labels.
- */
- void compute(InputArrayOfArrays src, InputArray labels);
- /** Projects samples into the LDA subspace.
- src may be one or more row aligned samples.
- */
- Mat project(InputArray src);
- /** Reconstructs projections from the LDA subspace.
- src may be one or more row aligned projections.
- */
- Mat reconstruct(InputArray src);
- /** Returns the eigenvectors of this LDA.
- */
- Mat eigenvectors() const { return _eigenvectors; }
- /** Returns the eigenvalues of this LDA.
- */
- Mat eigenvalues() const { return _eigenvalues; }
- static Mat subspaceProject(InputArray W, InputArray mean, InputArray src);
- static Mat subspaceReconstruct(InputArray W, InputArray mean, InputArray src);
- protected:
- int _num_components;
- Mat _eigenvectors;
- Mat _eigenvalues;
- void lda(InputArrayOfArrays src, InputArray labels);
- };
- /** @brief Singular Value Decomposition
- Class for computing Singular Value Decomposition of a floating-point
- matrix. The Singular Value Decomposition is used to solve least-square
- problems, under-determined linear systems, invert matrices, compute
- condition numbers, and so on.
- If you want to compute a condition number of a matrix or an absolute value of
- its determinant, you do not need `u` and `vt`. You can pass
- flags=SVD::NO_UV|... . Another flag SVD::FULL_UV indicates that full-size u
- and vt must be computed, which is not necessary most of the time.
- @sa invert, solve, eigen, determinant
- */
- class CV_EXPORTS SVD
- {
- public:
- enum Flags {
- /** allow the algorithm to modify the decomposed matrix; it can save space and speed up
- processing. currently ignored. */
- MODIFY_A = 1,
- /** indicates that only a vector of singular values `w` is to be processed, while u and vt
- will be set to empty matrices */
- NO_UV = 2,
- /** when the matrix is not square, by default the algorithm produces u and vt matrices of
- sufficiently large size for the further A reconstruction; if, however, FULL_UV flag is
- specified, u and vt will be full-size square orthogonal matrices.*/
- FULL_UV = 4
- };
- /** @brief the default constructor
- initializes an empty SVD structure
- */
- SVD();
- /** @overload
- initializes an empty SVD structure and then calls SVD::operator()
- @param src decomposed matrix. The depth has to be CV_32F or CV_64F.
- @param flags operation flags (SVD::Flags)
- */
- SVD( InputArray src, int flags = 0 );
- /** @brief the operator that performs SVD. The previously allocated u, w and vt are released.
- The operator performs the singular value decomposition of the supplied
- matrix. The u,`vt` , and the vector of singular values w are stored in
- the structure. The same SVD structure can be reused many times with
- different matrices. Each time, if needed, the previous u,`vt` , and w
- are reclaimed and the new matrices are created, which is all handled by
- Mat::create.
- @param src decomposed matrix. The depth has to be CV_32F or CV_64F.
- @param flags operation flags (SVD::Flags)
- */
- SVD& operator ()( InputArray src, int flags = 0 );
- /** @brief decomposes matrix and stores the results to user-provided matrices
- The methods/functions perform SVD of matrix. Unlike SVD::SVD constructor
- and SVD::operator(), they store the results to the user-provided
- matrices:
- @code{.cpp}
- Mat A, w, u, vt;
- SVD::compute(A, w, u, vt);
- @endcode
- @param src decomposed matrix. The depth has to be CV_32F or CV_64F.
- @param w calculated singular values
- @param u calculated left singular vectors
- @param vt transposed matrix of right singular vectors
- @param flags operation flags - see SVD::Flags.
- */
- static void compute( InputArray src, OutputArray w,
- OutputArray u, OutputArray vt, int flags = 0 );
- /** @overload
- computes singular values of a matrix
- @param src decomposed matrix. The depth has to be CV_32F or CV_64F.
- @param w calculated singular values
- @param flags operation flags - see SVD::Flags.
- */
- static void compute( InputArray src, OutputArray w, int flags = 0 );
- /** @brief performs back substitution
- */
- static void backSubst( InputArray w, InputArray u,
- InputArray vt, InputArray rhs,
- OutputArray dst );
- /** @brief solves an under-determined singular linear system
- The method finds a unit-length solution x of a singular linear system
- A\*x = 0. Depending on the rank of A, there can be no solutions, a
- single solution or an infinite number of solutions. In general, the
- algorithm solves the following problem:
- \f[dst = \arg \min _{x: \| x \| =1} \| src \cdot x \|\f]
- @param src left-hand-side matrix.
- @param dst found solution.
- */
- static void solveZ( InputArray src, OutputArray dst );
- /** @brief performs a singular value back substitution.
- The method calculates a back substitution for the specified right-hand
- side:
- \f[\texttt{x} = \texttt{vt} ^T \cdot diag( \texttt{w} )^{-1} \cdot \texttt{u} ^T \cdot \texttt{rhs} \sim \texttt{A} ^{-1} \cdot \texttt{rhs}\f]
- Using this technique you can either get a very accurate solution of the
- convenient linear system, or the best (in the least-squares terms)
- pseudo-solution of an overdetermined linear system.
- @param rhs right-hand side of a linear system (u\*w\*v')\*dst = rhs to
- be solved, where A has been previously decomposed.
- @param dst found solution of the system.
- @note Explicit SVD with the further back substitution only makes sense
- if you need to solve many linear systems with the same left-hand side
- (for example, src ). If all you need is to solve a single system
- (possibly with multiple rhs immediately available), simply call solve
- add pass #DECOMP_SVD there. It does absolutely the same thing.
- */
- void backSubst( InputArray rhs, OutputArray dst ) const;
- /** @todo document */
- template<typename _Tp, int m, int n, int nm> static
- void compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w, Matx<_Tp, m, nm>& u, Matx<_Tp, n, nm>& vt );
- /** @todo document */
- template<typename _Tp, int m, int n, int nm> static
- void compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w );
- /** @todo document */
- template<typename _Tp, int m, int n, int nm, int nb> static
- void backSubst( const Matx<_Tp, nm, 1>& w, const Matx<_Tp, m, nm>& u, const Matx<_Tp, n, nm>& vt, const Matx<_Tp, m, nb>& rhs, Matx<_Tp, n, nb>& dst );
- Mat u, w, vt;
- };
- /** @brief Random Number Generator
- Random number generator. It encapsulates the state (currently, a 64-bit
- integer) and has methods to return scalar random values and to fill
- arrays with random values. Currently it supports uniform and Gaussian
- (normal) distributions. The generator uses Multiply-With-Carry
- algorithm, introduced by G. Marsaglia (
- <http://en.wikipedia.org/wiki/Multiply-with-carry> ).
- Gaussian-distribution random numbers are generated using the Ziggurat
- algorithm ( <http://en.wikipedia.org/wiki/Ziggurat_algorithm> ),
- introduced by G. Marsaglia and W. W. Tsang.
- */
- class CV_EXPORTS RNG
- {
- public:
- enum { UNIFORM = 0,
- NORMAL = 1
- };
- /** @brief constructor
- These are the RNG constructors. The first form sets the state to some
- pre-defined value, equal to 2\*\*32-1 in the current implementation. The
- second form sets the state to the specified value. If you passed state=0
- , the constructor uses the above default value instead to avoid the
- singular random number sequence, consisting of all zeros.
- */
- RNG();
- /** @overload
- @param state 64-bit value used to initialize the RNG.
- */
- RNG(uint64 state);
- /**The method updates the state using the MWC algorithm and returns the
- next 32-bit random number.*/
- unsigned next();
- /**Each of the methods updates the state using the MWC algorithm and
- returns the next random number of the specified type. In case of integer
- types, the returned number is from the available value range for the
- specified type. In case of floating-point types, the returned value is
- from [0,1) range.
- */
- operator uchar();
- /** @overload */
- operator schar();
- /** @overload */
- operator ushort();
- /** @overload */
- operator short();
- /** @overload */
- operator unsigned();
- /** @overload */
- operator int();
- /** @overload */
- operator float();
- /** @overload */
- operator double();
- /** @brief returns a random integer sampled uniformly from [0, N).
- The methods transform the state using the MWC algorithm and return the
- next random number. The first form is equivalent to RNG::next . The
- second form returns the random number modulo N , which means that the
- result is in the range [0, N) .
- */
- unsigned operator ()();
- /** @overload
- @param N upper non-inclusive boundary of the returned random number.
- */
- unsigned operator ()(unsigned N);
- /** @brief returns uniformly distributed integer random number from [a,b) range
- The methods transform the state using the MWC algorithm and return the
- next uniformly-distributed random number of the specified type, deduced
- from the input parameter type, from the range [a, b) . There is a nuance
- illustrated by the following sample:
- @code{.cpp}
- RNG rng;
- // always produces 0
- double a = rng.uniform(0, 1);
- // produces double from [0, 1)
- double a1 = rng.uniform((double)0, (double)1);
- // produces float from [0, 1)
- float b = rng.uniform(0.f, 1.f);
- // produces double from [0, 1)
- double c = rng.uniform(0., 1.);
- // may cause compiler error because of ambiguity:
- // RNG::uniform(0, (int)0.999999)? or RNG::uniform((double)0, 0.99999)?
- double d = rng.uniform(0, 0.999999);
- @endcode
- The compiler does not take into account the type of the variable to
- which you assign the result of RNG::uniform . The only thing that
- matters to the compiler is the type of a and b parameters. So, if you
- want a floating-point random number, but the range boundaries are
- integer numbers, either put dots in the end, if they are constants, or
- use explicit type cast operators, as in the a1 initialization above.
- @param a lower inclusive boundary of the returned random number.
- @param b upper non-inclusive boundary of the returned random number.
- */
- int uniform(int a, int b);
- /** @overload */
- float uniform(float a, float b);
- /** @overload */
- double uniform(double a, double b);
- /** @brief Fills arrays with random numbers.
- @param mat 2D or N-dimensional matrix; currently matrices with more than
- 4 channels are not supported by the methods, use Mat::reshape as a
- possible workaround.
- @param distType distribution type, RNG::UNIFORM or RNG::NORMAL.
- @param a first distribution parameter; in case of the uniform
- distribution, this is an inclusive lower boundary, in case of the normal
- distribution, this is a mean value.
- @param b second distribution parameter; in case of the uniform
- distribution, this is a non-inclusive upper boundary, in case of the
- normal distribution, this is a standard deviation (diagonal of the
- standard deviation matrix or the full standard deviation matrix).
- @param saturateRange pre-saturation flag; for uniform distribution only;
- if true, the method will first convert a and b to the acceptable value
- range (according to the mat datatype) and then will generate uniformly
- distributed random numbers within the range [saturate(a), saturate(b)),
- if saturateRange=false, the method will generate uniformly distributed
- random numbers in the original range [a, b) and then will saturate them,
- it means, for example, that
- <tt>theRNG().fill(mat_8u, RNG::UNIFORM, -DBL_MAX, DBL_MAX)</tt> will likely
- produce array mostly filled with 0's and 255's, since the range (0, 255)
- is significantly smaller than [-DBL_MAX, DBL_MAX).
- Each of the methods fills the matrix with the random values from the
- specified distribution. As the new numbers are generated, the RNG state
- is updated accordingly. In case of multiple-channel images, every
- channel is filled independently, which means that RNG cannot generate
- samples from the multi-dimensional Gaussian distribution with
- non-diagonal covariance matrix directly. To do that, the method
- generates samples from multi-dimensional standard Gaussian distribution
- with zero mean and identity covariation matrix, and then transforms them
- using transform to get samples from the specified Gaussian distribution.
- */
- void fill( InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange = false );
- /** @brief Returns the next random number sampled from the Gaussian distribution
- @param sigma standard deviation of the distribution.
- The method transforms the state using the MWC algorithm and returns the
- next random number from the Gaussian distribution N(0,sigma) . That is,
- the mean value of the returned random numbers is zero and the standard
- deviation is the specified sigma .
- */
- double gaussian(double sigma);
- uint64 state;
- bool operator ==(const RNG& other) const;
- };
- /** @brief Mersenne Twister random number generator
- Inspired by http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c
- @todo document
- */
- class CV_EXPORTS RNG_MT19937
- {
- public:
- RNG_MT19937();
- RNG_MT19937(unsigned s);
- void seed(unsigned s);
- unsigned next();
- operator int();
- operator unsigned();
- operator float();
- operator double();
- unsigned operator ()(unsigned N);
- unsigned operator ()();
- /** @brief returns uniformly distributed integer random number from [a,b) range*/
- int uniform(int a, int b);
- /** @brief returns uniformly distributed floating-point random number from [a,b) range*/
- float uniform(float a, float b);
- /** @brief returns uniformly distributed double-precision floating-point random number from [a,b) range*/
- double uniform(double a, double b);
- private:
- enum PeriodParameters {N = 624, M = 397};
- unsigned state[N];
- int mti;
- };
- //! @} core_array
- //! @addtogroup core_cluster
- //! @{
- /** @example samples/cpp/kmeans.cpp
- An example on K-means clustering
- */
- /** @brief Finds centers of clusters and groups input samples around the clusters.
- The function kmeans implements a k-means algorithm that finds the centers of cluster_count clusters
- and groups the input samples around the clusters. As an output, \f$\texttt{bestLabels}_i\f$ contains a
- 0-based cluster index for the sample stored in the \f$i^{th}\f$ row of the samples matrix.
- @note
- - (Python) An example on K-means clustering can be found at
- opencv_source_code/samples/python/kmeans.py
- @param data Data for clustering. An array of N-Dimensional points with float coordinates is needed.
- Examples of this array can be:
- - Mat points(count, 2, CV_32F);
- - Mat points(count, 1, CV_32FC2);
- - Mat points(1, count, CV_32FC2);
- - std::vector\<cv::Point2f\> points(sampleCount);
- @param K Number of clusters to split the set by.
- @param bestLabels Input/output integer array that stores the cluster indices for every sample.
- @param criteria The algorithm termination criteria, that is, the maximum number of iterations and/or
- the desired accuracy. The accuracy is specified as criteria.epsilon. As soon as each of the cluster
- centers moves by less than criteria.epsilon on some iteration, the algorithm stops.
- @param attempts Flag to specify the number of times the algorithm is executed using different
- initial labellings. The algorithm returns the labels that yield the best compactness (see the last
- function parameter).
- @param flags Flag that can take values of cv::KmeansFlags
- @param centers Output matrix of the cluster centers, one row per each cluster center.
- @return The function returns the compactness measure that is computed as
- \f[\sum _i \| \texttt{samples} _i - \texttt{centers} _{ \texttt{labels} _i} \| ^2\f]
- after every attempt. The best (minimum) value is chosen and the corresponding labels and the
- compactness value are returned by the function. Basically, you can use only the core of the
- function, set the number of attempts to 1, initialize labels each time using a custom algorithm,
- pass them with the ( flags = #KMEANS_USE_INITIAL_LABELS ) flag, and then choose the best
- (most-compact) clustering.
- */
- CV_EXPORTS_W double kmeans( InputArray data, int K, InputOutputArray bestLabels,
- TermCriteria criteria, int attempts,
- int flags, OutputArray centers = noArray() );
- //! @} core_cluster
- //! @addtogroup core_basic
- //! @{
- /////////////////////////////// Formatted output of cv::Mat ///////////////////////////
- /** @todo document */
- class CV_EXPORTS Formatted
- {
- public:
- virtual const char* next() = 0;
- virtual void reset() = 0;
- virtual ~Formatted();
- };
- /** @todo document */
- class CV_EXPORTS Formatter
- {
- public:
- enum FormatType {
- FMT_DEFAULT = 0,
- FMT_MATLAB = 1,
- FMT_CSV = 2,
- FMT_PYTHON = 3,
- FMT_NUMPY = 4,
- FMT_C = 5
- };
- virtual ~Formatter();
- virtual Ptr<Formatted> format(const Mat& mtx) const = 0;
- virtual void set16fPrecision(int p = 4) = 0;
- virtual void set32fPrecision(int p = 8) = 0;
- virtual void set64fPrecision(int p = 16) = 0;
- virtual void setMultiline(bool ml = true) = 0;
- static Ptr<Formatter> get(Formatter::FormatType fmt = FMT_DEFAULT);
- };
- static inline
- String& operator << (String& out, Ptr<Formatted> fmtd)
- {
- fmtd->reset();
- for(const char* str = fmtd->next(); str; str = fmtd->next())
- out += cv::String(str);
- return out;
- }
- static inline
- String& operator << (String& out, const Mat& mtx)
- {
- return out << Formatter::get()->format(mtx);
- }
- //////////////////////////////////////// Algorithm ////////////////////////////////////
- class CV_EXPORTS Algorithm;
- template<typename _Tp, typename _EnumTp = void> struct ParamType {};
- /** @brief This is a base class for all more or less complex algorithms in OpenCV
- especially for classes of algorithms, for which there can be multiple implementations. The examples
- are stereo correspondence (for which there are algorithms like block matching, semi-global block
- matching, graph-cut etc.), background subtraction (which can be done using mixture-of-gaussians
- models, codebook-based algorithm etc.), optical flow (block matching, Lucas-Kanade, Horn-Schunck
- etc.).
- Here is example of SimpleBlobDetector use in your application via Algorithm interface:
- @snippet snippets/core_various.cpp Algorithm
- */
- class CV_EXPORTS_W Algorithm
- {
- public:
- Algorithm();
- virtual ~Algorithm();
- /** @brief Clears the algorithm state
- */
- CV_WRAP virtual void clear() {}
- /** @brief Stores algorithm parameters in a file storage
- */
- virtual void write(FileStorage& fs) const { CV_UNUSED(fs); }
- /** @brief simplified API for language bindings
- * @overload
- */
- CV_WRAP void write(const Ptr<FileStorage>& fs, const String& name = String()) const;
- /** @brief Reads algorithm parameters from a file storage
- */
- CV_WRAP virtual void read(const FileNode& fn) { CV_UNUSED(fn); }
- /** @brief Returns true if the Algorithm is empty (e.g. in the very beginning or after unsuccessful read
- */
- CV_WRAP virtual bool empty() const { return false; }
- /** @brief Reads algorithm from the file node
- This is static template method of Algorithm. It's usage is following (in the case of SVM):
- @code
- cv::FileStorage fsRead("example.xml", FileStorage::READ);
- Ptr<SVM> svm = Algorithm::read<SVM>(fsRead.root());
- @endcode
- In order to make this method work, the derived class must overwrite Algorithm::read(const
- FileNode& fn) and also have static create() method without parameters
- (or with all the optional parameters)
- */
- template<typename _Tp> static Ptr<_Tp> read(const FileNode& fn)
- {
- Ptr<_Tp> obj = _Tp::create();
- obj->read(fn);
- return !obj->empty() ? obj : Ptr<_Tp>();
- }
- /** @brief Loads algorithm from the file
- @param filename Name of the file to read.
- @param objname The optional name of the node to read (if empty, the first top-level node will be used)
- This is static template method of Algorithm. It's usage is following (in the case of SVM):
- @code
- Ptr<SVM> svm = Algorithm::load<SVM>("my_svm_model.xml");
- @endcode
- In order to make this method work, the derived class must overwrite Algorithm::read(const
- FileNode& fn).
- */
- template<typename _Tp> static Ptr<_Tp> load(const String& filename, const String& objname=String())
- {
- FileStorage fs(filename, FileStorage::READ);
- CV_Assert(fs.isOpened());
- FileNode fn = objname.empty() ? fs.getFirstTopLevelNode() : fs[objname];
- if (fn.empty()) return Ptr<_Tp>();
- Ptr<_Tp> obj = _Tp::create();
- obj->read(fn);
- return !obj->empty() ? obj : Ptr<_Tp>();
- }
- /** @brief Loads algorithm from a String
- @param strModel The string variable containing the model you want to load.
- @param objname The optional name of the node to read (if empty, the first top-level node will be used)
- This is static template method of Algorithm. It's usage is following (in the case of SVM):
- @code
- Ptr<SVM> svm = Algorithm::loadFromString<SVM>(myStringModel);
- @endcode
- */
- template<typename _Tp> static Ptr<_Tp> loadFromString(const String& strModel, const String& objname=String())
- {
- FileStorage fs(strModel, FileStorage::READ + FileStorage::MEMORY);
- FileNode fn = objname.empty() ? fs.getFirstTopLevelNode() : fs[objname];
- Ptr<_Tp> obj = _Tp::create();
- obj->read(fn);
- return !obj->empty() ? obj : Ptr<_Tp>();
- }
- /** Saves the algorithm to a file.
- In order to make this method work, the derived class must implement Algorithm::write(FileStorage& fs). */
- CV_WRAP virtual void save(const String& filename) const;
- /** Returns the algorithm string identifier.
- This string is used as top level xml/yml node tag when the object is saved to a file or string. */
- CV_WRAP virtual String getDefaultName() const;
- protected:
- void writeFormat(FileStorage& fs) const;
- };
- enum struct Param {
- INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, MAT_VECTOR=5, ALGORITHM=6, FLOAT=7,
- UNSIGNED_INT=8, UINT64=9, UCHAR=11, SCALAR=12
- };
- template<> struct ParamType<bool>
- {
- typedef bool const_param_type;
- typedef bool member_type;
- static const Param type = Param::BOOLEAN;
- };
- template<> struct ParamType<int>
- {
- typedef int const_param_type;
- typedef int member_type;
- static const Param type = Param::INT;
- };
- template<> struct ParamType<double>
- {
- typedef double const_param_type;
- typedef double member_type;
- static const Param type = Param::REAL;
- };
- template<> struct ParamType<String>
- {
- typedef const String& const_param_type;
- typedef String member_type;
- static const Param type = Param::STRING;
- };
- template<> struct ParamType<Mat>
- {
- typedef const Mat& const_param_type;
- typedef Mat member_type;
- static const Param type = Param::MAT;
- };
- template<> struct ParamType<std::vector<Mat> >
- {
- typedef const std::vector<Mat>& const_param_type;
- typedef std::vector<Mat> member_type;
- static const Param type = Param::MAT_VECTOR;
- };
- template<> struct ParamType<Algorithm>
- {
- typedef const Ptr<Algorithm>& const_param_type;
- typedef Ptr<Algorithm> member_type;
- static const Param type = Param::ALGORITHM;
- };
- template<> struct ParamType<float>
- {
- typedef float const_param_type;
- typedef float member_type;
- static const Param type = Param::FLOAT;
- };
- template<> struct ParamType<unsigned>
- {
- typedef unsigned const_param_type;
- typedef unsigned member_type;
- static const Param type = Param::UNSIGNED_INT;
- };
- template<> struct ParamType<uint64>
- {
- typedef uint64 const_param_type;
- typedef uint64 member_type;
- static const Param type = Param::UINT64;
- };
- template<> struct ParamType<uchar>
- {
- typedef uchar const_param_type;
- typedef uchar member_type;
- static const Param type = Param::UCHAR;
- };
- template<> struct ParamType<Scalar>
- {
- typedef const Scalar& const_param_type;
- typedef Scalar member_type;
- static const Param type = Param::SCALAR;
- };
- template<typename _Tp>
- struct ParamType<_Tp, typename std::enable_if< std::is_enum<_Tp>::value >::type>
- {
- typedef typename std::underlying_type<_Tp>::type const_param_type;
- typedef typename std::underlying_type<_Tp>::type member_type;
- static const Param type = Param::INT;
- };
- //! @} core_basic
- } //namespace cv
- #include "opencv2/core/operations.hpp"
- #include "opencv2/core/cvstd.inl.hpp"
- #include "opencv2/core/utility.hpp"
- #include "opencv2/core/optim.hpp"
- #include "opencv2/core/ovx.hpp"
- #endif /*OPENCV_CORE_HPP*/
|