mirror of
https://github.com/opencv/opencv.git
synced 2026-07-21 19:33:03 +04:00
f968fb969f
* experimental new arithmetics; work-in-progress * continue working on new-gen arithmetic expressions * * improved performance of the new add on small arrays * added sub * extended tests * fixed potential bug when adding multi-channel array and a single-channel scalar * improved const handling * * added copyMask * added mul/dev (without scale so far) * * accelerated mul * addedd scale to mul and div * * done substantial refactoring; however a few more rounds of refactoring are ahead. * added min, max, absdiff, addweighted. * improved performance of the new arithmetic functions, but some of them are still slow, e.g. operations with mask have some bugs (that affect speed, not accuracy). * * further (significantly) accelerated several functions, especially on small arrays: mul, binary ops with mask * further polished the new arithmetic engine * started integration of the new element-wise arithmetic engine into core * big step forward. We now use the new engine inside cv::add, subtract, multiply, divide, absdiff, min and max. * big progress: * added bitwise operations * fixed and accelerated compare * ported regression tests to test new broadcasting behaviour of arithmetic functions * lot's of improvements in compare, divide, addWeighted! * lot's of small and big performance improvements in the new arithmetics * * some more optimizations; parsing texpr-expressions is now faster as well * port new_arithm to Linux/x86: dispatch guards, scalar-Mat compat fallback, dnn shape-contract fixes Core: - arithm.simd.hpp: CV_CPU_OPTIMIZATION_DECLARATIONS_ONLY guards (the file is included once per dispatched mode on x86), vx_load_expand instead of the 128-bit v_load_expand, VTraits::vlanes() instead of ::nlanes - arithm.cpp/precomp.hpp: compat fallback for scalar-like Mat operands (1x1, 1xcn/cnx1, 4x1 CV_64F - java/python tuples, operator-(Mat, Matx)): treated as a per-channel scalar ONLY when the shapes are not broadcast-compatible, so every valid numpy-style broadcast keeps its meaning and calls that would otherwise throw get the 4.x semantics DNN (fallout of the stricter shape semantics, found by the new engine): - dict.hpp: DictValue relied on fresh AutoBuffer having size()==fixed_size; allocate explicitly - batch_norm: weights_/bias_ are 1-D [n] now; 0/1-D forward runs on exact-shape 1-D views - net_impl2: extend the post-forward sanity check to non-temp outputs - a layer that reallocates its preallocated output tensor now fails loudly instead of silently detaching the result from the graph - LSTM/LSTM2 batchwise (layout=1): getMemoryShapes now matches what forward() writes (ONNX: Y=(batch,seq,dirs,hid), Yh/Yc=(batch,dirs,hid)); forward assembles seq-major results in a local buffer and transposes INTO the preallocated outputs in place Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * u8/s8 multiply: exact integer SIMD path on non-FP16 builds (3-10x vs 5.x) The unit-scale branch of vecBinaryKernel already supported a separate work-vector type Wvec1 (used by the ARM f16 build and by u16/s16 everywhere), but on x86 the u8/s8 same-type multiply still went through the f32 hub. Route it through v_uint16/v_int16: products of 8-bit values fit exactly (255^2 < 2^16), the saturating pack on store gives bit-exact results at half the vector traffic. Also fix a latent kernel bug this exposed: the unit-scale branch stepped by Wvec's lane count while loading/storing Wvec1 vectors. All previous Wvec1 instantiations had equal lane counts, but u8's v_uint16 has 2x the lanes of v_float32 - the pairs overlapped (50% redundant work) and the tail backoff could write VECSZ bytes past the row end. The branch now derives its step, offsets and tail condition from Wvec1 itself. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * vecBinaryKernel: constexpr Op::useScalar instead of a runtime-only scale check Every binary op functor now declares whether it consumes the scale scalar (params[0]): true only for mul and the two div variants. Ops that ignore it (add/sub/min/max/absdiff) take the fast 2-arg branch unconditionally - the 'scalar == 1' check used to fail for them (their params[0] is 0), sending them through the preproc branch, and the condition now folds at compile time. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * restore cv::hal::mul8u as a wrapper over the element-wise engine The symbol is still declared in core/hal/hal.hpp and called directly by external code (the G-API fluid backend in opencv_contrib), but its implementation went away with the old arithm kernels. Forward it to getMulFunc(CV_8U, CV_8U) - with scale==1 it lands on the new exact integer SIMD path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * silence every new-arithm warning reported by CI (ARM64/Mac) and gcc 15 - arithm.cpp: bitwise_op_ocl and the actualScalarDepth/coerceTypes helpers are consumed only by the OpenCL paths - guard them with HAVE_OPENCL; haveScalar in cv::compare is read only inside CV_OCL_RUN - CV_UNUSED for OpenCL-less builds - arithm_expr.hpp: declare getBitwiseFunc/getNotFunc/getAddWeightedFunc next to the other per-op entry points (-Wmissing-prototypes in arithm.dispatch.cpp) - arithm.simd.hpp: define CV_SIMD_16F to 0 when FP16 SIMD is absent (-Wundef); {}-init the expandScalar staging buffers (-Wmaybe-uninitialized: they are fully written before use, but the compiler cannot prove it with runtime vector widths); rename the compare kernel's lambda parameter (-Wshadow) - arithm_expr.cpp: rename the exec tile-lambda's hot-field locals that shadowed TExpr members and outer locals (-Wshadow) - test_new_arithm_extensive.cpp: rename the name-generator lambdas' parameter shadowing the INSTANTIATE macro's own (-Wshadow), drop an unused variable Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * restore 4.x scalar semantics for the bindings' 4x1 CV_64F Scalar columns The python/java bindings materialize numbers and tuples as a 2-D 4x1 CV_64F Mat - or UMat, when the call carries UMat arguments. Three CI-reported python failures came from those pseudo-scalars reaching the engine as arrays: - absdiff(int_arr, 0): the (4,1) column is broadcast-COMPATIBLE with a 1-D array, so numpy semantics silently won - an outer-product f64 result instead of the int per-channel-scalar one; - subtract(u8 4x8x4, (40,)): same, by the rows==4 coincidence; - multiply(UMat, 2., dst=UMat): the scalar arrives as a UMAT, which the scalar detection did not recognize at all. isScalarArg now treats the exact bindings shape - 2-D 4x1 CV_64F single-channel Mat/UMat against a <=4-channel array - as a scalar UNCONDITIONALLY (a 1-D [4] array has dims==1 and still broadcasts). One exception, decided in arithm_op: when the partner is itself a tiny scalar-shaped array, both are honest data and ride the broadcast (compare(Mat 4x1, Mat 1x1) - issue #8999 - stays elementwise). Small-array discipline, this all runs per engine call: the probes read Mat/UMat fields directly (rows == 4 alone rejects almost everything, no _InputArray getter dispatch), and a UMAT scalar's 32 bytes are copied into a caller-stack buffer - no heap, no getMat mapping. Measured: no latency change on 4x4/16x16 element-wise calls. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * cv::texpr: std::string_view -> const std::string& in the public API string_view in an exported signature breaks some CUDA toolchain builds, and for short expression strings the difference is immaterial (SSO, parsed once). The parser internals keep string_view - the argument converts implicitly. Also drop the now-unused <string_view> include from cvstd.hpp, so the header does not reach every nvcc TU. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * compare boundary-rewrite: fixed 4-slot kind/bound arrays instead of AutoBuffers A CONST operand is capped at 4 channels (addConst), so the per-channel kind/bound staging needs no dynamic buffers - plain int[4]/double[4], with a CV_Assert on the contract. This is also what gcc's -Wmaybe-uninitialized was flagging (it could not see the AutoBuffer's inline storage get filled). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * element-wise engine: unary math kernels (sqrt/exp/log/sin/cos/tanh/erf/relu) + select New dispatched pair math.simd.hpp / math.dispatch.cpp - the unary/ternary sibling of arithm.simd.hpp: - vecUnaryKernel: T -> T over f16/bf16/f32/f64 on top of the intrin_math primitives (v_exp/v_log/v_sin/v_cos/v_sqrt/v_erf/v_max). f32/f64 compute natively, f16/bf16 ride the f32 hub inside the kernel (vx_load_pair_as / v_store_pair_as) - no materialized casts. Continuity collapse + the halide right-edge backoff, suppressed in-place (it would re-apply Op to already-written values). tanh = (e^2x-1)/(e^2x+1) with the input clamped to +/-10 (f32) / +/-20 (f64) - unclamped saturation hits inf/inf = NaN. erf has no f64 SIMD primitive: std::erf per lane. - selectKernel(mask, x, y): 1-byte mask expanded to lane width and tested against zero in the INTEGER domain (immune to DAZ/FTZ), branches of any depth by element size, broadcast branches supported. - emitUnary: math over a float input is T -> T now (f16 in -> f16 out, native kernel when input and result depths match); integer inputs still compute in the float domain and land in f32. - emitTernary/select: literal branches are typed via typedConstFrom (an OP_CAST of a depth-less flex const crashed); a non-1-byte mask is normalized by an explicit "mask != 0" compare, never a value cast. texpr already parsed the function names - they now execute. Tests: per-depth accuracy of all 8 ops against the double std:: reference, integer input, in-place, select over 4 depths / const branch / float mask. Perf vs the classic kernels (1920x1080 f32, 16 threads, AVX2): exp 3.7x, log 2.6x, sqrt 5.7x faster; polarToCart expressed as (r*cos(a), r*sin(a)) 4.0x. Accuracy improves too (max rel err vs f64 reference): exp 8.1e-8 vs 2.1e-7, log 8.0e-8 vs 1.5e-7. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * engine: OP_COPY_MASK folded into OP_SELECT; selectKernel moved to arithm.simd.hpp copyMask(dst, mask, src) is select(mask, src, dst) - one masking primitive instead of two. The compiler emits the masked-op tail as addInsn(OP_SELECT, mask, r, out, out): the output slot rides as both arg2 and the result, so unmasked elements are preserved by reading them back through the b-branch. OP_COPY_MASK, copyMaskKernel and getCopyMaskFunc are gone. selectKernel (moved from math.simd.hpp to arithm.simd.hpp) inherits every copyMaskKernel optimization: - the interleaved multichannel fast path (2..4 channels under a per-pixel mask: expand the mask once per VECSZ rows, v_store_interleave across lanes); - the per-row scalar path with the row-skip when the selected source row IS dst (the "leave the output untouched" half of copyMask); - plus the select-specific ones: branch broadcasts (stepx == 0) and the right-edge tail backoff under dst-aliases-a-branch - safe because re-running select over already-blended elements is idempotent; only dst == mask keeps the backoff off (the store would rewrite mask bytes before the re-read). Masked-add perf is on par with the old copyMask (1280x720, 1 thread: 8UC3 204 -> 198 us, 32FC3 1395 -> 1344, 8UC1/32FC1 within noise). Full core suite 24117 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * engine: dedicated vectorized pow kernel (moved from arithm to math.simd.hpp) pow was the last scalar-only binary op (scalarBinaryKernel + std::pow, f32/f64 only). The new powKernel keeps exact std::pow semantics and is T x T -> T over all four float depths (f16/bf16 via the f32 hub): - scalar exponent (the dominant call shape - texpr literals ride as 0-dim broadcast consts) is dispatched PER ROW to the special cases: y==2 -> x*x, y==3 -> x*x*x, y==0.5 -> v_sqrt, y==1 -> copy, y==0 -> fill 1; - everything else - including a per-element exponent array - runs the general vectorized exp(y * log(x)) path, valid for x > 0; a vector pair containing any x <= 0 lane falls back to scalar std::pow for that pair (v_check_any), which preserves every std::pow subtlety: signed results for integer y on negative bases, NaN for fractional y, the x == 0 family; - no right-edge tail backoff: pow is not idempotent, in-place calls finish rows in the scalar tail. Perf vs the classic cv::pow (1920x1080 f32, 16 threads, AVX2): p=2 1.4x (classic special-cases it too), p=3 6.1x, p=0.5 6.3x, fractional p 4.5x with slightly better accuracy (6.1e-7 vs 7.4e-7 max rel err). Tests: exponent sweep 2/3/0.5/1/0/2.5/-1.5 vs the double std::pow reference on f32/f64, negative bases (exact signed cubes, NaN for fractional), array exponent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * powKernel: halide right-edge tail backoff in every SIMD loop Same shape as vecBinaryKernel: the final partial vector re-processes [width - VECSZ*2, width) instead of finishing scalar, suppressed when dst aliases an input (pow is not idempotent - the overlap region must be recomputed from an untouched source, which the no-alias case guarantees). Modest measured win (~2% on ROI rows for the special-cased exponents; the general path tail was already cheap - modern libm powf is fast), no regressions; mainly aligns the kernel with the house style, where every SIMD loop ends vector-wide. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix MSVC 2019 C2975: function-local constexpr as a template argument inside a lambda MSVC 2019 loses the constexpr-ness of function-local constants (LOCAL_OPS, MAX_DIMS, ...) when they are used as template arguments inside a lambda body (AutoBuffer<Slice, LOCAL_OPS> / std::array<int, MAX_DIMS> in the parallel bodies of BroadcastOp::run and TExpr::exec). Hoist them to namespace scope - no behavior change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ocl_arithm_op: route 16U multiply to the CPU engine on Apple OpenCL The Apple OpenCL driver miscompiles the 16U multiply kernel: products near the top of the u16 range come back wrapped instead of saturated (CPU vs GPU NORM_INF up to 65535 in OCL_Arithm/Mul.Mat CV_16U cases). The same arithm.cl kernel is correct on Intel NEO and NVIDIA drivers - verified not to reproduce on Linux/Intel iGPU - so gate the decline to __APPLE__ only; the CPU engine computes 16u multiply exactly (integer SIMD path). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * engine: neg/abs as compositions, clamp kernel, ** and ?: operators, abs(a-b) peephole - OP_NEG and OP_ABS need no kernels: neg = sub(0, a), abs = absdiff(a, 0) - including the engine absdiff auto-type rule (signed |a| lands in the UNSIGNED type of the same width: |SHRT_MIN| fits u16 exactly instead of saturating; NB the public cv::absdiff auto depth keeps the source type for 4.x compatibility - values agree, the depth rule is the engine own). - peephole: abs(x - y) rewrites to absdiff(x, y) ALWAYS. On integers the literal semantics differ (the subtract saturates first: u8 gives max(x-y, 0)), but whoever writes abs(a - b) means absdiff - we deliberately hand out the useful semantics instead of the saturation artifact. The just- emitted OP_SUB is retired via the moveToOutput manoeuvre, so the program shrinks to the single absdiff instruction. abs(x), abs(x - 0) and absdiff(x, 0) all give one result. - OP_CLAMP kernel (arithm.simd.hpp): v_min(v_max(x, lo), hi) over u8/s8/u16/s16/u32/s32/f32 (+f64 with 64-bit SIMD), scalar f16/bf16/64-bit ints; lo/hi may broadcast (the common clamp(img, a, b) shape) or be full arrays; the tail backoff stays on under dst-aliases-x (clamp is idempotent). emitTernary types literal bounds via typedConstFrom (same flex-const crash select had) and keeps the auto result type pinned to x. - parser: "a ** b" == pow(a, b), precedence above * /, RIGHT-associative (a ** 2 ** 3 == a ** 8); "cond ? a : b" == select(cond, a, b), precedence below everything, right-associative chains (f1 ? a : f2 ? b : c) work without parentheses. parseTernary() is the expression entry point now. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * cv::exp/log/sqrt on the engine via math_op; hal functions wrapped as engine kernels math_op is the master function of the unary math family (the arithm_op analogue): same-shape same-type output over f16/bf16/f32/f64 (classic exp/log accepted f32/f64 only - the half floats are new), two tiers: - small (<= 100000 elements) and continuous: call the kernel DIRECTLY over the flattened data - no TExpr, no broadcastOp, no parallel_for setup; - everything else: the usual single-instruction program via compile()/exec() (parallelism for large arrays, real steps for ROIs). getMathFunc routes OP_EXP/OP_LOG at f32/f64 through the full cv::hal stack - an external vendor HAL (CALL_HAL), IPP, or the built-in table kernels, whichever is installed - by wrapping hal::exp32f/exp64f/log32f/log64f as engine kernels with the function pointer in TKernel::userdata, the same mechanism castKernel uses for core BinaryFuncs. The engine adds tiling and parallelism on top, so every tier gets the best available scalar-span implementation. v_exp/v_log remain for f16/bf16 (the f32 hub) and the ops hal has no entry points for. v_log_default_32f: the degree-8 polynomial is evaluated by Estrin pairing (4 dependent levels) instead of an 8-FMA Horner chain (~5% on the f16 hub path). An exp64 Taylor-without-division rewrite was tried and benched SLOWER than the Cephes Pade scheme (the evaluation is FMA-throughput-bound, and vdivpd pipelines well enough) - reverted; a table-based reduction is the only way further there. cv::exp f32 (16 threads, AVX2+IPP build), old -> new: 640 elements 0.16 -> 0.15 us, 16k 2.79 -> 2.49, 640x480 47 -> 20, 1920x1080 452 -> 60 us (the old CPU loops were single-threaded); f64 exp 1080p 1295 -> 161 us. No size regresses; small arrays now run at installed-HAL speed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * getMathFunc: IPP tier + raw-HAL probing; the exp/log table kernels are deleted The raw cv_hal_* entry points return int for a reason: without an installed HAL they are stubs returning CV_HAL_ERROR_NOT_IMPLEMENTED. getMathFunc now selects the exp/log implementation in three tiers: 1. HAVE_IPP && ipp::useIPP(): ippsExp/ippsLn through thin int adapters (IPP is not routed through the cv_hal_ hooks, so it needs its own tier); 2. the raw cv_hal_exp32f/... hook, PROBED once with a 1-element call on the safe input 1.0 (cached in magic statics): implemented -> wrapped as an engine kernel with the function pointer in TKernel::userdata; 3. the engine own v_exp/v_log kernels. Whichever wins, the engine adds tiling and parallelism on top. The EXPTAB/LOGTAB table kernels and their tables (~790 lines in mathfuncs_core.simd.hpp + mathfuncs.cpp) are DELETED: they benched within ~15% of v_exp/v_log, not worth a second implementation. The public cv::hal::exp32f/exp64f/log32f/log64f keep their contract - CALL_HAL, then IPP, then the built-in implementation - but the built-in is now the engine vector kernel via ew::mathSpanEngine (one contiguous span, exported from math.dispatch.cpp). All unary math kernels (vec/scalar/hal wrappers, pow) also handle the vertical-broadcast tile (s0y == 0, a row expanded into a matrix): the first row is computed, the rest are memcpy of it - transcendentals cost far more than a row copy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * texpr: hypot(x, y) binary op (alias: mag) hypot = sqrt(x^2 + y^2), NAIVE like cv::magnitude (not the overflow-safe std::hypot), computed in the float work type; kernels for the four float depths only (T x T -> T; integer inputs ride the usual f32-compute + cast). A 10-line EwHypot functor on top of vecBinaryKernel in arithm.simd.hpp - broadcast branches, continuity collapse and the tail backoff come for free. Registered in the parser as both "hypot" (the C/numpy name) and "mag" (the cv::magnitude-flavored alias). A building block for the future cartToPolar. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * texpr: atan2(y, x) binary op - radians, standard C range v_atan2 (arithm.simd.hpp, generic over the universal-intrinsic float vector): the fastAtan2 minimax polynomial from mathfuncs_core v_atan_f32 reworked to plain radians - the 180/pi factor dropped from the coefficients and the C quadrant logic instead of the [0, 360) wrap, so the result matches std::atan2 over (-pi, pi]. Measured absolute accuracy ~1.6e-4 rad. (v_atan_f32 itself is untouched - cv::phase/fastAtan2 keep their degree semantics.) EwAtan2 rides vecBinaryKernel: f16/bf16/f32 through v_atan2 (the f32 hub), f64 through exact scalar std::atan2. arg0 = y, arg1 = x, like std::atan2; float depths only, same emitBinary policy as pow/hypot. Parser name "atan2". Together with hypot this completes the cartToPolar building blocks. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix the RISC-V RVV build and two ARM64 warnings The new f64 kernel registrations (hypot, pow, the unary math family) gate on CV_SIMD_64F || CV_SIMD_SCALABLE_64F, but the vx_setall_as(const double*, v_float64&) helper family in arithm.simd.hpp was still CV_SIMD_64F-only - scalable platforms (RVV) have v_float64 with CV_SIMD_64F == 0, so vecBinaryKernel<double, ...> failed to instantiate there. Widen the helper gate to match (verified with a riscv64 rv64gcv cross-build of opencv_core - the engine f64 paths now vectorize on RVV instead of not compiling). cv::exp/cv::log: the depth local is consumed by CV_OCL_RUN only - CV_UNUSED for OpenCL-less builds (ARM64 -Wunused-variable). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * silence the remaining ARM64 gcc warnings - compare boundary-rewrite: {}-init the fixed kind/bound arrays (filled for every channel used below, but gcc cannot prove it across the cn <= 4 loop); - cv::exp/log: [[maybe_unused]] on the depth local (consumed by CV_OCL_RUN only), instead of the CV_UNUSED idiom; - AutoBuffer::reserve: a targeted -Wmaybe-uninitialized suppression around the live-element copy loop - only [0, sz) is read, all written before, but gcc inlining a grow-from-inline-storage chain cannot see that. An annotation for the analyzer, no behavior change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * saturating 32-bit add/sub kernels; cv::texpr python binding; two CI warnings - v_add_sat/v_sub_sat for v_int32/v_uint32, local to arithm.simd.hpp for now (the plan is to grow them into proper universal intrinsics later): NEON single-instruction vqadd/vqsub, elsewhere the Hacker Delight bit tricks over universal intrinsics (u32 add is 2 ops: or with the wrapped-compare mask). EwAdd/EwSub overload vec() for the 32-bit lanes and getAddSubFunc routes 32S/32U T->T through vecBinaryKernel instead of the former pure scalar kernel. Semantics unchanged - the scalar int64 tail already saturated; directed boundary tests added (both rails, 0 - INT_MIN, u32 cases, a full-range random block vs an exact int64 reference). 640x480 32S add: 0.48x of 5.x -> parity (memory-bound); 1080p: 6-8x. - cv::texpr becomes CV_EXPORTS_W: python gets cv.texpr(expr, [inputs]) -> tuple of ndarrays, so `res, = cv.texpr(...)` and `mag, ang = cv.texpr(...)` unpacking both work. modules/python/test/test_expr.py covers arithmetic, the fused abs(a-b), casts, broadcasting, ?: and ** operators, math functions vs numpy, clamp, named temporaries, tuple outputs, the one-line cartToPolar and the int32 saturation cases. - warnings: {}-init the parser args array (gcc -Wmaybe-uninitialized on Ubuntu 20/22); the compare short-row block gates sizeof(T) <= 4 as constexpr so the f64 instantiation does not leave set-but-unused locals (gcc 9 -Wunused-but-set-variable). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * arithm_op: direct-kernel fast path for small continuous arrays Building and compiling the 1-instruction program plus the BroadcastOp setup costs ~40-250ns per call - negligible on big images, dominant at 127x61-class sizes where the classic 5.x functions were 1.3-2x faster. Mirror math_op two tiers in arithm_op: two same-type same-shape continuous arrays, no mask, no scalar, result depth == input depth, <= 100k elements -> call the T x T -> T kernel directly over the flattened elements (checks ordered cheapest-first). Applies to add/subtract/min/max/absdiff/multiply/addWeighted/and/or/xor; compare and divide lower to more than a single kernel (boundary rewrites, int guards) and keep the ordinary path. addWeighted falls through automatically for the 32/64-bit int types whose lowering is wide-compute + cast (getElemwiseFunc returns no direct kernel there). 127x61 vs 5.x, was -> now: add/subtract 8UC1 0.76x -> 1.3x, min/max u8 0.6x -> ~1x, addWeighted 1.0x -> 1.1-1.4x (32SC1 stays 4.5x); the one remaining laggard is add/sub 32SC1 (0.74-0.82x) - the price of the new SATURATING semantics (7-instruction AVX2 emulation vs the wrapping single add of 5.x; single-instruction on NEON). The 127x61 size is ADDED PERMANENTLY to the arithmetic/addWeighted/compare perf grids: per-call overhead regressions in these base functions must be caught by CI, not discovered by users. dst creation goes through createSameSize (whole-shape transfer including layout and future metadata, not piecemeal dims+sizes) here and in math_op. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * cv::pow rebuilt on the engine; integer-exponent and 1/sqrt(x) kernel branches Routing: p = 0/1/2 keep their early special cases (fill/copy/multiply); an INTEGER array with an INTEGER power keeps the classic iPow multiply chain - bit-exact compatibility, including its wrap-around quirks (iPow squares in int, so e.g. pow(255,4) on u8 wraps negative and saturates to 0 - somebody may rely on that). Everything else goes through the engine with the math_op two-tier scheme: small continuous arrays call powKernel directly (the exponent rides as a broadcast T scalar), the rest run the tiled parallel program. Integer arrays with fractional powers compute in the float domain and saturate back; the 32U/64-bit depths (classic iPow asserted on them) and f16/bf16 (the classic float path misread them) now just work. powKernel gets two new per-row exponent branches: - p == -0.5: 1/v_sqrt(x) (the classic path used IPP ippsInvSqrt_A21, a 21-bit approximation; ours is exact - slightly slower on small arrays, 4.5x faster at 1080p via parallelism); - any other INTEGER p (|p| <= 65536): LSB-first binary exponentiation, the same multiply chain and order as iPow, fully vectorized - a few ulp accurate vs ~2e-7 of exp(p*log x), and exact on non-positive bases (the sign falls out of the multiplies, 0^negative divides to inf) - no scalar patching. cv::pow f32 vs 5.x: p=0.5 365 -> 61 us at 1080p (6x), p=3 7.7x, p=5 7x AND faster at every size (the old scalar chain: 0.81 -> 0.47 us at 127x61), p=2.5 5.3x. The s16^5 iPow path is untouched (118.7 == 118.5 us). pow_exponents accuracy tests extended to 11 exponents x f32/f64 against the double std::pow reference. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * perf: SANITY_CHECK_NOTHING for the tests whose grids got the 127x61 size The 127x61 entry added to guard per-call overhead has no regression data in opencv_extra, so the legacy SANITY_CHECK in addWeighted/compare failed on CI (locally it passes silently without the test-data path). Accuracy of both functions is covered by the accuracy suite; the perf tests should measure time. PatchNaNs/finiteMask keep their SANITY_CHECK - their grids are untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix a temp-buffer double release in the liveness pass ("d*d" crash) When the same temp is passed as SEVERAL arguments of its last-use instruction (e.g. the named-intermediate expression "d = {0} - {1}; d*d", where the MUL consumes slot d twice), the buffer-reuse scan pushed the temp's physical buffer onto the free list once per argument. That overflows the ntemps-sized freeBufs array (caught by the AutoBuffer range check in Debug: python test_expr.py::test_named_temporary) and, in larger programs, would hand the same physical buffer to two live temps. Release the buffer once by retiring lastUse[t] after the first hit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * executor: recalibrate opCost to vectorized cycles + clamp the stripe count The per-element op costs fed into the parallel_for_ stripe hint were scalar-era estimates (~20x above the vectorized reality: the atan2/exp polynomials run at ~1.5 cycles/element, not 30). The hint therefore split transcendental/divide work into hundreds of ~1 us jobs, which the macOS/GCD backend dispatches poorly under sustained load, on top of the P/E-core equal-share straggler effect. Measured on M4 Max (12P+4E), sustained medians @1920x1080 f32: texpr atan2 320 -> 133 us, cv::exp 280 -> 141 us, cv::log 301 -> ~200 us, cv::pow(x,2.5) 388 -> 376 us; the PR tables' math rows improved ~1.5-2x across the board. - opCost is now in units of ~1/4 cycle/element of the SIMD kernels: cheap ops 1 (unchanged), div/sqrt/hypot/convert_scale 10 -> 3, transcendentals 30 -> 6. - the stripe hint is clamped by min(4*nthreads, max(32, 3*nthreads)): ~4 stripes/thread is plenty of granularity for element-wise work, and the ceiling is 32 pieces except on machines with many (heterogeneous) cores, where anything coarser than ~3 pieces/worker turns the slow cores into equal-share bottlenecks (measured: 32 stripes on 16 threads is the worst point of the curve - 193 us vs 137 us at 48 for atan2). getNumThreads() is clamped from below (WINRT/plugin backends may report 0). Not addressed here (needs cross-machine data, M2/M3 Ultra): streaming memory-bound ops saturate the M4 Max fabric at ~8 fat stripes and E-core participation only adds contention - a cost model cannot express that; candidate follow-up is a bytes-aware clamp or a GCD-backend-level fix. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * multiply: v_mul_sat integer kernels (full product clamped to the type) v_mul_sat(V, V) -> V for u8/s8/u16/s16/u32/s32 - the full-precision product clamped to the lane type, which is exactly cv::multiply's integer semantics at scale == 1. Local to arithm.simd.hpp for now, next to v_add_sat/v_sub_sat, to be promoted into proper universal intrinsics later. NEON: widening vmull + saturating narrow (vqmovn); other backends: the portable v_mul_expand + saturating v_pack composition for 8/16-bit lanes. 32-bit lanes have no universal widening multiply (no v_mul_expand for s32), so the 32-bit integer fast path is NEON-only for now and the other backends keep the previous f64 work-vector kernels (which measure well on x86 with IPP-free AVX2). EwMul::vec() now routes the integer lane types through v_mul_sat, and getMulFunc_ passes the NATIVE lane vector as the scale==1 fast-path type: whole-register loads/stores, the widening happens inside the multiply. Replaces both the half-register widening loads (u8/s8/u16/s16) and the scalar-equivalent f64 path for 32S/32U on NEON. M4 Max, 640x480 (the sizes where the old kernels lost to carotene): 8U 22.0 -> 13.6 us, 8S 15.0 -> 11.1, 16S 21.2 -> 17.4, 32S 84.8 -> 30.5 (parity with the classic path everywhere, 32S was 0.38x). 1920x1080: 8S 1.30x -> 1.78x, 16S 2.57x -> 2.98x, 32S 2.20x -> 4.02x vs 5.x. Correctness: exhaustive 8-bit (all 65536 pairs per sign), directed saturation corners for 16/32-bit (46341^2, INT_MIN*-1, 65536*65536, all sign combinations) against an exact int64 reference. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * NEON: make v_cvt_f64(v_int32) exact (was via f32, losing bits > 2^24) The NEON implementations of v_cvt_f64/v_cvt_f64_high for v_int32 did s32 -> f32 -> f64 (vcvt_f32_s32 + vcvt_f64_f32), silently rounding any |x| > 2^24. Every vectorized f64 work path with int32 inputs on AArch64 was affected: the engine's addWeighted/divide 32S kernels, convertTo 32S -> 64F, etc. Found via addWeighted 32SC1 on values ~1e9: max error was 32 vs the exact double reference (the classic carotene path is worse still - it computes in f32 end-to-end with f32-truncated weights, max error 96 on the same data). The exact sequence sxtl + scvtf (vmovl_s32 + vcvtq_f64_s64) is the same 2 instructions, so there is no cost. addWeighted 32SC1 on the engine now matches the exact-double reference bit-for-bit and stays at parity/1.4x vs the classic path (640x480/1920x1080). Pre-existing upstream bug (same code in 4.x) - worth a standalone backport with directed large-value tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * math_op: drop the temporary direct-IPP tier for exp/log Upstream moved the IPP math wrappers into the hal/ipp HAL module (cv_hal_exp32f/ log32f & co now resolve to ipp_hal_* which honor cv::ipp::useIPP via CV_HAL_CHECK_USE_IPP). The engine's single probeHalUnary(cv_hal_*) probe already picks that up uniformly, so the stopgap #ifdef HAVE_IPP ippExp/ippLog tier and its ipp::useIPP() branch in getMathFunc are now redundant - removed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * arithm: restore cv::hal::and8u/or8u/xor8u/not8u as engine wrappers These public CV_EXPORTS entry points (core/hal/hal.hpp) lost their definitions when the bitwise ops moved to the element-wise engine, but they are still declared and called by other modules (opencv_objdetect's aruco) and external code - the link broke with undefined references to cv::hal::and8u/xor8u. Restore them as thin forwarders over the engine's byte-wise bitwise kernels (getBitwiseFunc / getNotFunc), mirroring the existing mul8u wrapper. CV_Assert guards the kernel lookup. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * blobdetector: guard empty contour when computing blob radius The new AutoBuffer leaves its tail uninitialized for trivial types, which surfaced a -Wmaybe-uninitialized in findBlobs where the median of per-point distances is read. Use a std::vector, default the radius to 0, and compute the median only for a non-empty contour - no unproven size invariant. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
3392 lines
155 KiB
C++
3392 lines
155 KiB
C++
/*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
|
||
|
||
The Core module is the backbone of OpenCV, offering fundamental data structures, matrix operations,
|
||
and utility functions that other modules depend on. It’s essential for handling image data,
|
||
performing mathematical computations, and managing memory efficiently within the OpenCV ecosystem.
|
||
|
||
@{
|
||
@defgroup core_basic Basic structures
|
||
@defgroup core_array Operations on arrays
|
||
@defgroup core_async Asynchronous API
|
||
@defgroup core_xml XML/YAML/JSON 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_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
|
||
@}
|
||
@defgroup core_quaternion Quaternion
|
||
@}
|
||
*/
|
||
|
||
namespace cv {
|
||
|
||
//! @addtogroup core_utils
|
||
//! @{
|
||
|
||
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_array
|
||
//! @{
|
||
|
||
//! 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
|
||
};
|
||
|
||
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.
|
||
REDUCE_SUM2 = 4 //!< the output is the sum of all squared rows/columns of the matrix.
|
||
};
|
||
|
||
/** @brief Swaps two matrices
|
||
*/
|
||
CV_EXPORTS void swap(Mat& a, Mat& b);
|
||
/** @overload */
|
||
CV_EXPORTS void swap( UMat& a, UMat& b );
|
||
|
||
/** @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.
|
||
@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array.
|
||
`add(src,X)` means `add(src,(X,X,X,X))`.
|
||
`add(src,(X,))` means `add(src,(X,0,0,0))`.
|
||
@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 - CV_8U, CV_8S or CV_Bool 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.
|
||
@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array.
|
||
`subtract(src,X)` means `subtract(src,(X,X,X,X))`.
|
||
`subtract(src,(X,))` means `subtract(src,(X,0,0,0))`.
|
||
@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 CV_8U, CV8S or CV_Bool 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.
|
||
@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array.
|
||
`multiply(src,X)` means `multiply(src,(X,X,X,X))`.
|
||
`multiply(src,(X,))` means `multiply(src,(X,0,0,0))`.
|
||
@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.
|
||
@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array.
|
||
`divide(src,X)` means `divide(src,(X,X,X,X))`.
|
||
`divide(src,(X,))` means `divide(src,(X,0,0,0))`.
|
||
@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);
|
||
|
||
/** @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);
|
||
|
||
/** @example samples/cpp/tutorial_code/core/how_to_scan_images/how_to_scan_images.cpp
|
||
Check @ref tutorial_how_to_scan_images "the corresponding tutorial" for more details
|
||
*/
|
||
|
||
/** @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 = \forkthree{0}{if \(\texttt{src}\) has depth \(\texttt{CV_8U}\) or \(\texttt{CV_16U}\)}{128}{if \(\texttt{src}\) has depth \(\texttt{CV_8S}\)}{32768}{if \(\texttt{src}\) has depth \(\texttt{CV_16S}\)}\f]
|
||
@param src input array of 8-bit or 16-bit integer elements.
|
||
@param lut look-up table of 256 elements (if src has depth CV_8U or CV_8S) or 65536 elements(if src has depth CV_16U or CV_16S); 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 Checks for the presence of at least one non-zero array element.
|
||
|
||
The function returns whether there are non-zero elements in src
|
||
|
||
The function do not work with multi-channel arrays. If you need to check non-zero array
|
||
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.
|
||
|
||
@note
|
||
- CV_16F/CV_16BF/CV_Bool/CV_64U/CV_64S/CV_32U are not supported for src.
|
||
- If the location of non-zero array elements is important, @ref findNonZero is helpful.
|
||
- If the count of non-zero array elements is important, @ref countNonZero is helpful.
|
||
@param src single-channel array.
|
||
@sa mean, meanStdDev, norm, minMaxLoc, calcCovarMatrix
|
||
@sa findNonZero, countNonZero
|
||
*/
|
||
CV_EXPORTS_W bool hasNonZero( 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]
|
||
|
||
The function do not work with multi-channel arrays. If you need to count non-zero array
|
||
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.
|
||
|
||
@note
|
||
- CV_16F/CV_16BF/CV_Bool/CV_64U/CV_64S/CV_32U are not supported for src.
|
||
- If only whether there are non-zero elements is important, @ref hasNonZero is helpful.
|
||
- If the location of non-zero array elements is important, @ref findNonZero is helpful.
|
||
@param src single-channel array.
|
||
@sa mean, meanStdDev, norm, minMaxLoc, calcCovarMatrix
|
||
@sa findNonZero, hasNonZero
|
||
*/
|
||
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
|
||
|
||
The function do not work with multi-channel arrays. If you need to find non-zero
|
||
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.
|
||
|
||
@note
|
||
- CV_16F/CV_16BF/CV_Bool/CV_64U/CV_64S/CV_32U are not supported for src.
|
||
- If only count of non-zero array elements is important, @ref countNonZero is helpful.
|
||
- If only whether there are non-zero elements is important, @ref hasNonZero is helpful.
|
||
@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
|
||
@sa countNonZero, hasNonZero
|
||
*/
|
||
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 ot type CV_8U, CV_8S or CV_Bool.
|
||
@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 of type CV_8U, CV_8S or CV_Bool.
|
||
@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$.
|
||

|
||
|
||
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 type CV_8UC1, CV_8SC1 or CV_BoolC1.
|
||
*/
|
||
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 type CV_8UC1, CV_8S1 or CV_BoolC1.
|
||
*/
|
||
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
|
||
|
||
@note Due to rounding issues, min-max normalization can result in values outside provided boundaries.
|
||
If exact range conformity is needed, following workarounds can be used:
|
||
- use double floating point precision (dtype = CV_64F)
|
||
- manually clip values (`cv::max(res, left_bound, res)`, `cv::min(res, right_bound, res)` or `np.clip`)
|
||
|
||
@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 of type CV_8U, CV_8S or CV_Bool.
|
||
@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.
|
||
|
||
In C++, if the input is multi-channel, you should omit the minLoc, maxLoc, and mask arguments
|
||
(i.e. leave them as NULL, NULL, and noArray() respectively). These arguments are not
|
||
supported for multi-channel input arrays. If working with multi-channel input and you
|
||
need the minLoc, maxLoc, or mask arguments, then use Mat::reshape first to reinterpret
|
||
the array as single-channel. Alternatively, you can extract the particular channel using either
|
||
extractImageCOI, mixChannels, or split.
|
||
|
||
In Python, multi-channel input is not supported at all due to a limitation in the
|
||
binding generation process (there is no way to set minLoc and maxLoc to NULL). A
|
||
workaround is to operate on each channel individually or to use NumPy to achieve the same
|
||
functionality.
|
||
@note CV_16F/CV_16BF/CV_Bool/CV_64U/CV_64S/CV_32U are not supported for src.
|
||
@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 of type CV_8U, CV_8S or CV_Bool.
|
||
@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. In case of a sparse matrix, the minimum is found among non-zero elements
|
||
only. Multi-channel input is supported without mask and extremums indexes (should be nullptr).
|
||
@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)).
|
||
@note CV_16F/CV_16BF/CV_Bool/CV_64U/CV_64S/CV_32U are not supported for src.
|
||
@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, #REDUCE_SUM2 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);
|
||
|
||
/** @brief Flips a n-dimensional at given axis
|
||
* @param src input array
|
||
* @param dst output array that has the same shape of src
|
||
* @param axis axis that performs a flip on. 0 <= axis < src.dims.
|
||
*/
|
||
CV_EXPORTS_W void flipND(InputArray src, OutputArray dst, int axis);
|
||
|
||
/** @brief Broadcast the given Mat to the given shape.
|
||
* @param src input array
|
||
* @param shape target shape. Should be a list of CV_32S numbers. Note that negative values are not supported.
|
||
* @param dst output array that has the given shape
|
||
*/
|
||
CV_EXPORTS_W void broadcast(InputArray src, InputArray shape, OutputArray dst);
|
||
|
||
/** @brief Broadcast the given Mat to the given shape.
|
||
* @param src input array
|
||
* @param shape target shape. Note that negative values are not supported.
|
||
* @param dst output array that has the given shape
|
||
*/
|
||
CV_EXPORTS void broadcast(InputArray src, const MatShape& shape, OutputArray dst);
|
||
|
||
/** @brief Evaluate a broadcasting element-wise expression over the input arrays.
|
||
|
||
The expression is a small std::format-like string over placeholders `{0}`, `{1}`, ... (the entries of
|
||
@p inputs), C-style arithmetic / comparison / bitwise operators, type-cast and math function calls
|
||
(`uint8(...)`, `min`, `max`, `absdiff`, `pow`, ...), `;`-separated named temporaries and a
|
||
parenthesized tuple for multiple results. All operands broadcast against each other (numpy rules,
|
||
channels innermost) and the whole expression is fused into a single traversal of the data.
|
||
|
||
@param expr the expression string, e.g. `"{0} * 2.5 + {1}"` or `"({0} + {1}, {0} - {1})"`.
|
||
@param inputs the arrays bound to `{0}`, `{1}`, ...
|
||
@param outputs receives one array per top-level result (one entry, or several for a tuple).
|
||
*/
|
||
CV_EXPORTS_W void texpr(const String& expr, InputArrayOfArrays inputs, OutputArrayOfArrays outputs);
|
||
|
||
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, CV_8U, CV_8S or CV_Bool 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, CV_8U, CV_8S or CV_Bool 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, CV_8U, CV_8S or CV_Bool 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, CV_8U, CV_8S or CV_Bool 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.
|
||
@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array.
|
||
`absdiff(src,X)` means `absdiff(src,(X,X,X,X))`.
|
||
`absdiff(src,(X,))` means `absdiff(src,(X,0,0,0))`.
|
||
@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, CV_8S or CV_Bool 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 Replaces NaNs (Not-a-Number values) in a matrix with the specified value.
|
||
|
||
This function modifies the input matrix in-place.
|
||
The input matrix must be of type `CV_32F` or `CV_64F`; other types are not supported.
|
||
|
||
@param a Input/output matrix (CV_32F or CV_64F type).
|
||
@param val Value used to replace NaNs (defaults to 0).
|
||
*/
|
||
CV_EXPORTS_W void patchNaNs(InputOutputArray a, double val = 0);
|
||
|
||
/** @brief Generates a mask of finite float values, i.e. not NaNs nor Infs.
|
||
|
||
An element is set to to 255 (all 1-bits) if all channels are finite.
|
||
@param src Input matrix, should contain float or double elements of 1 to 4 channels
|
||
@param mask Output matrix of the same size as input of type CV_8UC1
|
||
*/
|
||
CV_EXPORTS_W void finiteMask(InputArray src, OutputArray mask);
|
||
|
||
|
||
/** @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 Transpose for n-dimensional matrices.
|
||
*
|
||
* @note Input should be continuous single-channel matrix.
|
||
* @param src input array.
|
||
* @param order a permutation of [0,1,..,N-1] where N is the number of axes of src.
|
||
* The i'th axis of dst will correspond to the axis numbered order[i] of the input.
|
||
* @param dst output array of the same type as src.
|
||
*/
|
||
CV_EXPORTS_W void transposeND(InputArray src, const std::vector<int>& order, 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 0, 1, 2 or 3 elements.
|
||
@return number of real roots. It can be -1 (all real numbers), 0, 1, 2 or 3.
|
||
*/
|
||
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);
|
||
|
||
/** @example samples/python/snippets/dft.py
|
||
An example on Discrete Fourier transform (DFT) in python.
|
||
*/
|
||
|
||
/** @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:
|
||
@include samples/cpp/snippets/dft.cpp
|
||
An example on DFT-based convolution
|
||
|
||
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 Performs the per-element division of the first Fourier spectrum by the second Fourier spectrum.
|
||
*
|
||
* The function cv::divSpectrums performs the per-element division of the first array by the second array.
|
||
* The arrays are CCS-packed or complex matrices that are results of a real or complex Fourier transform.
|
||
*
|
||
* @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 divSpectrums(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
|
||
//! @{
|
||
|
||
//! 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
|
||
};
|
||
|
||
/** @example samples/cpp/snippets/kmeans.cpp
|
||
An example on k-means clustering
|
||
*/
|
||
/** @example samples/python/snippets/kmeans.py
|
||
An example on k-means clustering in python
|
||
*/
|
||
|
||
/** @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);
|
||
|
||
};
|
||
|
||
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;
|
||
}
|
||
|
||
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 {};
|
||
|
||
|
||
/** @example samples/cpp/snippets/detect_blob.cpp
|
||
An example using the BLOB to detect and filter region.
|
||
*/
|
||
|
||
/** @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
|
||
*/
|
||
CV_WRAP virtual void write(FileStorage& fs) const { CV_UNUSED(fs); }
|
||
|
||
/**
|
||
* @overload
|
||
*/
|
||
CV_WRAP void write(FileStorage& fs, const String& name) const;
|
||
#if CV_VERSION_MAJOR < 5
|
||
/** @deprecated */
|
||
void write(const Ptr<FileStorage>& fs, const String& name = String()) const;
|
||
#endif
|
||
|
||
/** @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"
|
||
|
||
#endif /*OPENCV_CORE_HPP*/
|