View Source Changelog
Unreleased
Fixed
Evision.Mat.clip/3: upper bound no longer collapses to the lower bound (typo where both branches compared againstlower).Evision.Mat.dot/2: now actually computes a dot product. The previous implementation calledcv::Mat::crossdespite being nameddot, so it only worked for 3-element vectors and returned aMat. See Breaking changes below.Evision.Mat.arange/4,5: range count is now computed with ceiling division, so the final stepped value is included when the interval is not evenly divisible (e.g.arange(0, 5, 2)now returns[0, 2, 4]instead of[0, 2]).step == 0and direction mismatches are rejected explicitly.Evision.Mat.negate/1,Evision.Mat.ceil/1,Evision.Mat.floor/1,Evision.Mat.round/1: now traverse every scalar in multi-channel matrices instead of only the first channel of each pixel.Evision.Mat.ceil/1,Evision.Mat.floor/1,Evision.Mat.round/1: added support forCV_16F(half-precision float) inputs.Evision.Mat.at/2: added bounds checking (was previously undefined behaviour past the end) and a clone-on-non-continuous fallback so the scalar index lands on the right element.CV_16Fis now supported.Evision.Mat.from_binary_by_shape/3: rejects binaries whose byte size does not match the declared shape (previously created aMatthat read past the binary).Evision.Mat.from_binary/5: the declaredrows × cols × channels × bytes_per_elementis now computed with overflow checks.Evision.Mat.to_binary/1,2:- The
limitparameter is now honored on the NIF path (was previously ignored). - Non-continuous matrices are cloned before serialisation so the returned binary contains contiguous element data rather than the underlying buffer's interleaved padding.
- The
nx_tensorbranch in Elixir now interpretslimitas the number of elements (multiplying byelem_size), matching the NIF path and theBackend.inspect/2caller.
- The
Evision.Mat.to_batched/3(3-arg): now works on multi-channel matrices (previously theshape(mat)it derived internally always failed the size check). The 3-arg wrapper also no longer passes a tuple where a list is expected.Evision.Mat.to_batched/4repeat mode: no longer reads past the source matrix whenbatch_size × slice_sizeexceeds the source size; the source is now safely repeated as many times as needed.Evision.Mat.update_roi/3: the caller'sMatdata is no longer mutated in place —update_roialways returns a newMatand leaves the input untouched. Previously the underlying buffer was modified through the shared reference, silently mutating any other reference to the sameMat.Evision.Mat.transpose/3withas_shape:: rejectsas_shapewhose total byte size does not match the source matrix, preventing out-of-bounds reads fromcv::transposeND.Evision.Mat.expm1/1: removed a dead/buggy fallback that calledcv::expa second time without exception protection after the wrapped call had already failed.Evision.Mat.last_dim_as_channel/1: now usessrc.depth()(instead of the full type) when re-tagging the channels and explicitly rejects channel counts outside[1, CV_CN_MAX].Evision.CUDA.GpuMat.from_pointer/3: the resource is now released on the error path (previously leaked) and the OOM path returns a proper error term.evision::nif::get_tupleforstd::vector<int64_t>: now reads each element asint64_t(wasint), so large 64-bit values in tuples are no longer truncated/rejected.evision_highguithread initialisation: races between concurrentstart_native_guicallers are now serialised behind anEVISION_INITIATINGstate, andevision_main_loopnotifies all waiters (wasnotify_one, which could leave additional waiters stuck).alloc_resourceforcv::Mat *: explicitly initialisestmp->val = nullptrso a release before assignment does not free uninitialised memory.
Added
Evision.Mat.matmul/2: convenience wrapper aroundcv::Mat::operator*(matrix multiplication viacv::gemm). Both inputs must be 2-D and share aCV_32ForCV_64Fdepth. For element-wise dot-product semantics useEvision.Mat.dot/2.
Breaking changes
Evision.Mat.dot/2now returns anumber()(the scalar dot product) instead of a%Evision.Mat{}. This matches the C++cv::Mat::dotdefinition. The previous behaviour was a bug: the function was implemented withcv::Mat::cross, which only accepted 3-element vectors and returned aMat. Callers who actually wanted matrix multiplication should switch to the newEvision.Mat.matmul/2.Evision.Mat.to_batched/4(4-arg, explicitas_shape) now requiresas_shapeto include channels as a dimension for multi-channel matrices, and the resulting batches are single-channelMats with the channel axis at the end. Concretely:- Old:
to_batched(cv_8uc3_mat, batch_size, {N, H, W}, ...)→ batches ofCV_8UC3mats with shape{batch_size, H, W}. - New:
to_batched(cv_8uc3_mat, batch_size, {N, H, W, 3}, ...)→ batches ofCV_8Umats with shape{batch_size, H, W, 3}. - The old
to_batched(cv_8uc3_mat, batch_size, {N, H, W}, ...)call now returns{:error, "to_batched failed: cannot treated matrix as the request shape"}. Evision.Backend(Nx) workflows are not affected: tensors entering throughfrom_nx/from_binaryare always single-channelMats with the logical Nx shape, so the old and new size-checks evaluate identically.
- Old:
v0.2.14 (2025-08-15)
Browse the Repository | Released Assets
Changes
- Added support for newer generation of CUDA architectures, including
sm_100andsm_120.
v0.2.13 (2025-05-15)
Browse the Repository | Released Assets
Fixed
- Allowing Features2D parameters to be
nilwhen they have default values or as output parameters.
v0.2.12 (2025-04-14)
Browse the Repository | Released Assets
Added
- Precompiled binaries for
x86_64-unknown-freebsd.
v0.2.11 (2025-01-18)
Browse the Repository | Released Assets
Changes
- Bump OpenCV to v4.11.0. Some APIs may have changed, please see OpenCV's release note for more information.
- Removed
aarch64-windows-msvcandppc64le-linux-gnutarget from the precompiled binaries.
v0.2.10 (2024-09-22)
Browse the Repository | Released Assets
Changes
- Bump
reqto0.5and updated examples accordingly. Thanks @mnishiguchi for PR #266
v0.2.9 (2024-08-17)
Browse the Repository | Released Assets
Fixes
- Include the
c_src/evision_consts.hin the package.
v0.2.8 (2024-08-04)
Browse the Repository | Released Assets
Fixes
- Fixed inheritance issues for classes that have any of the following base classes:
cv::img_hash::ImgHashBasecv::legacy::Trackercv::phase_unwrapping::PhaseUnwrappingcv::rapid::Trackercv::reg::Mapcv::reg::Mappercv::structured_light::StructuredLightPatternBackgroundSubtractor
v0.2.7 (2024-07-03)
Browse the Repository | Released Assets
Breaking changes (compile-time and CUDA users only)
EVISION_CUDA_VERSION, now it should be the major version of CUDA, e.g.,12.EVISION_CUDNN_VERSION, it should be the major version of cuDNN, e.g.,9.
Changes
- Added precompiled version with CUDA 12.x and cudnn 9.x for aarch64-linux-gnu.
v0.2.5 (2024-07-01)
Browse the Repository | Released Assets
Changes
Validate possible keyword arguments for functions that accept named arguments.
iex> img = Evision.imread("test/testdata/dog.jpg") # valid keyword argument iex> Evision.applyColorMap(src: img, colormap: Evision.Constant.cv_COLORMAP_AUTUMN) %Evision.Mat{ channels: 3, dims: 2, type: {:u, 8}, raw_type: 16, shape: {576, 768, 3}, ref: #Reference<0.97833242.1116078104.245977> } # list all possible keyword arguments if the user provides any invalid ones iex> Evision.applyColorMap(src: img, colorMap: Evision.Constant.cv_COLORMAP_AUTUMN) ** (ArgumentError) unknown keys [:colorMap] in [src: %Evision.Mat{channels: 3, dims: 2, type: {:u, 8}, raw_type: 16, shape: {576, 768, 3}, ref: #Reference<0.97833242.1116078110.246705>}, colorMap: 0], the allowed keys are: [:dst, :colormap, :userColor, :src] (elixir 1.18.0-dev) lib/keyword.ex:362: Keyword.validate!/2 (evision 0.2.4) lib/generated/evision.ex:4603: Evision.applyColorMap/1 iex:4: (file)Generated typed enums for OpenCV's
cv::flann.This should include the following enums and place them in the corresponding modules.
flann_algorithm_tflann_centers_init_tflann_log_level_tflann_distance_tflann_datatype_t
For example,
flann_algorithm_twill be put in theEvision.Flann.Algorithmmodule:defmodule Evision.Flann.Algorithm do @type enum :: integer() @doc enum: true def cv_FLANN_INDEX_LINEAR, do: 0 @doc enum: true def cv_FLANN_INDEX_KDTREE, do: 1 @doc enum: true def cv_FLANN_INDEX_KMEANS, do: 2 @doc enum: true def cv_FLANN_INDEX_COMPOSITE, do: 3 @doc enum: true def cv_FLANN_INDEX_KDTREE_SINGLE, do: 4 @doc enum: true def cv_FLANN_INDEX_HIERARCHICAL, do: 5 @doc enum: true def cv_FLANN_INDEX_LSH, do: 6 @doc enum: true def cv_FLANN_INDEX_SAVED, do: 254 @doc enum: true def cv_FLANN_INDEX_AUTOTUNED, do: 255 end
v0.2.4 (2024-06-20)
Browse the Repository | Released Assets
Changes
- Allow users to use named arguments.
v0.2.3 (2024-06-17)
Browse the Repository | Released Assets
Added
- Experimental support for use shared CUDA memory via
Evision.CUDA.GpuMat.from_pointer/{3,4}.
v0.2.2 (2024-06-15)
Browse the Repository | Released Assets
Added
- Experimental support for CUDA shared memory via
Evision.CUDA.GpuMat.to_pointer/{1,2}. - Experimental support for Gleam. See gleam_evision_demo for more information.
Changes
General improvements to the typespecs. Enumerators now also have their own modules.
Experimental support for using Nx.tensor directly without calling helper functions like
Evision.Mat.from_nx/1,Evision.Mat.from_nx_2d/1andEvision.Mat.last_dim_as_channel/1.Support
/AOS(arithmetic op src) marks in OpenCV source code.This should make evision's behaviour in line with OpenCV (C++ and Python).
For example, in
Evision.add/2, the expected behaviour should be different when src1/src2 are single number and they are tuple/array.add(src, X)whereXis a number (orNx.tensor(X)), it meansadd(src, {X,X,X,X})while
add(src, {X})(oradd(src, Nx.tensor([X]))) meansadd(src, {X,0,0,0}).Allow a single number to be passed as
Evision.Mat.maybe_mat_in()andEvision.scalar().Allow a n-tuple (containing n numbers) to be passed as
Evision.Mat.maybe_mat_in()andEvision.scalar().Evision.Matnow implementsNx.LazyContainerprotocol.
Fixes
- Fixed Erlang bindings when converting from Elixir structs to Erlang records and vice versa.
v0.2.1 (2024-06-04)
Browse the Repository | Released Assets
Fixes
- Fixed function specs where type hints for sub-classes were using the type of their parent-classes.
v0.2.0 (2024-06-03)
Browse the Repository | Released Assets
Changes
- Uses OpenCV 4.10.0. Some APIs may have changed, please see OpenCV's release note for more information.
Change logs for v0.1.x can be found in the CHANGELOG.v0.1.md