From ff581614c8c223aa7422cbf2a13a99e96b333f12 Mon Sep 17 00:00:00 2001 From: Archit Rungta Date: Mon, 29 Jun 2020 18:24:27 +0530 Subject: [PATCH] add julia phase2 files --- modules/julia/CMakeLists.txt | 1 + modules/julia/README.md | 8 +- modules/julia/function_list.md | 274 +++++++++++ modules/julia/package/OpenCV/src/OpenCV.jl | 11 +- .../julia/package/OpenCV/src/cv_dnn_wrap.jl | 435 ++++++++++++++++++ modules/julia/package/OpenCV/src/cv_wrap.jl | 13 +- .../package/OpenCV/src/types_conversion.jl | 4 +- modules/julia/samples/face_detect_dnn.jl | 36 ++ modules/julia/src/cv2.cpp | 251 ++++++++-- modules/julia/src/jlcv2.hpp | 8 + modules/julia/test/CMakeLists.txt | 10 +- modules/julia/test/test_dnn.jl | 33 ++ modules/julia/test/test_mat.jl | 118 +++++ modules/julia/test/testsuite.jl | 2 + 14 files changed, 1166 insertions(+), 38 deletions(-) create mode 100644 modules/julia/function_list.md create mode 100644 modules/julia/package/OpenCV/src/cv_dnn_wrap.jl create mode 100644 modules/julia/samples/face_detect_dnn.jl create mode 100644 modules/julia/test/test_dnn.jl create mode 100644 modules/julia/test/test_mat.jl diff --git a/modules/julia/CMakeLists.txt b/modules/julia/CMakeLists.txt index 2efa34a03..9e5f5a5b2 100644 --- a/modules/julia/CMakeLists.txt +++ b/modules/julia/CMakeLists.txt @@ -65,6 +65,7 @@ ocv_add_module( opencv_highgui opencv_features2d opencv_videoio + opencv_dnn ) ocv_glob_module_sources() diff --git a/modules/julia/README.md b/modules/julia/README.md index 721c2e70e..7fd69a363 100644 --- a/modules/julia/README.md +++ b/modules/julia/README.md @@ -74,7 +74,7 @@ Another change is that all integer and float constants might need to prefixed wi Usage -========= +--- This section has some more information about how to use the Julia bindings. The function signatures are identical to Python bindings except the previously mentioned OOP exception. All functions that will accept a Mat/numpy array in C++/Python signatures will instead accept `OpenCV.InputArray` type in the Julia functions. `OpenCV.InputArray` is a union type between `CxxMat` and `AbstractArray{T, 3}`. As such, you can pass any arrays generated by any Julia function directly into OpenCV. If the AbstractArray is strided and has appropriate strides, the bindings will try to directly pass the memory region to OpenCV functions. However, if that's not possible then the array will first be copied to a `DenseArray` and then passed to OpenCV. The previously mentioned `CxxMat` is a black-box pointer type and should never be needed by users. @@ -82,3 +82,9 @@ The function signatures are identical to Python bindings except the previously m The output arrays of all OpenCV functions are of the type `OpenCV.Mat{T}`. Currently, all array input and output is restricted to 3D only (2D Mat and an additional dimension for color channels). The `OpenCV.Mat` type inherits from `AbstractArray{T, 3}` and can be directly passed to any Julia function that accepts AbstractArray types. It internally maintains a pointer to the original C++ `Mat` type to make sure that the memory is never deallocated. However, if you copy the `OpenCV.Mat` type object then the pointer is not copied and array moves to a Julia owned memory space. All other types map directly to the corresponding types on C++. Unlike Python, `Point`, `Size`, `Rect` etc are represented not as tuples but as appropriate objects like `OpenCV.Point{Float32}` and so on. However, `Scalar` types are a tuple of numbers where the tuple has a size of 1-4. + + +Current Functionality +--- + +The total functionality implemented till now is restricted to basic image input and operations, windows, VideoCap and some drawing functions. In addition to these, most of the dnn module functionality present in `dnn.hpp` is wrapped aswell. The samples implement most of the availabe functionality but a complete list of function and function prototypes can be found [here](function_list.md). diff --git a/modules/julia/function_list.md b/modules/julia/function_list.md new file mode 100644 index 000000000..d02c2c86f --- /dev/null +++ b/modules/julia/function_list.md @@ -0,0 +1,274 @@ +This is a compilation of the general functions implemented in this module. + +``` +function KeyPoint(x::Float32, y::Float32, _size::Float32, _angle::Float32, _response::Float32, _octave::Int32, _class_id::Int32) + +KeyPoint(x::Float32, y::Float32, _size::Float32; _angle::Float32 = Float32(-1), _response::Float32 = Float32(0), _octave::Int32 = Int32(0), _class_id::Int32 = Int32(-1)) = KeyPoint(x, y, _size, _angle, _response, _octave, _class_id) + +function VideoCapture(filename::String, apiPreference::Int32) + +VideoCapture(filename::String; apiPreference::Int32 = Int32(CAP_ANY)) = VideoCapture(filename, apiPreference) + +function VideoCapture(index::Int32, apiPreference::Int32) + +VideoCapture(index::Int32; apiPreference::Int32 = Int32(CAP_ANY)) = VideoCapture(index, apiPreference) + +function CascadeClassifier(filename::String) + +function detect(cobj::cv_Ptr{T}, image::InputArray, mask::InputArray) where {T <: Feature2D} + +detect(cobj::cv_Ptr{T}, image::InputArray; mask::InputArray = (CxxMat())) where {T <: Feature2D} = detect(cobj, image, mask) + +function detectMultiScale(cobj::CascadeClassifier, image::InputArray, scaleFactor::Float64, minNeighbors::Int32, flags::Int32, minSize::Size{Int32}, maxSize::Size{Int32}) + +detectMultiScale(cobj::CascadeClassifier, image::InputArray; scaleFactor::Float64 = Float64(1.1), minNeighbors::Int32 = Int32(3), flags::Int32 = Int32(0), minSize::Size{Int32} = (Size{Int32}(0,0)), maxSize::Size{Int32} = (Size{Int32}(0,0))) = detectMultiScale(cobj, image, scaleFactor, minNeighbors, flags, minSize, maxSize) + +function empty(cobj::CascadeClassifier) + +function read(cobj::VideoCapture, image::InputArray) + +read(cobj::VideoCapture; image::InputArray = (CxxMat())) = read(cobj, image) + +function release(cobj::VideoCapture) + +function SimpleBlobDetector_create(parameters::SimpleBlobDetector_Params) + +SimpleBlobDetector_create(; parameters::SimpleBlobDetector_Params = (SimpleBlobDetector_Params())) = SimpleBlobDetector_create(parameters) + +function imread(filename::String, flags::Int32) + +imread(filename::String; flags::Int32 = Int32(IMREAD_COLOR)) = imread(filename, flags) + +function imshow(winname::String, mat::InputArray) + +function namedWindow(winname::String, flags::Int32) + +namedWindow(winname::String; flags::Int32 = Int32(WINDOW_AUTOSIZE)) = namedWindow(winname, flags) + +function waitKey(delay::Int32) + +waitKey(; delay::Int32 = Int32(0)) = waitKey(delay) + +function rectangle(img::InputArray, pt1::Point{Int32}, pt2::Point{Int32}, color::Scalar, thickness::Int32, lineType::Int32, shift::Int32) + +rectangle(img::InputArray, pt1::Point{Int32}, pt2::Point{Int32}, color::Scalar; thickness::Int32 = Int32(1), lineType::Int32 = Int32(LINE_8), shift::Int32 = Int32(0)) = rectangle(img, pt1, pt2, color, thickness, lineType, shift) + +function cvtColor(src::InputArray, code::Int32, dst::InputArray, dstCn::Int32) + +cvtColor(src::InputArray, code::Int32; dst::InputArray = (CxxMat()), dstCn::Int32 = Int32(0)) = cvtColor(src, code, dst, dstCn) + +function equalizeHist(src::InputArray, dst::InputArray) + +equalizeHist(src::InputArray; dst::InputArray = (CxxMat())) = equalizeHist(src, dst) + +function destroyAllWindows() + +function getTextSize(text::String, fontFace::Int32, fontScale::Float64, thickness::Int32) + +function putText(img::InputArray, text::String, org::Point{Int32}, fontFace::Int32, fontScale::Float64, color::Scalar, thickness::Int32, lineType::Int32, bottomLeftOrigin::Bool) + +putText(img::InputArray, text::String, org::Point{Int32}, fontFace::Int32, fontScale::Float64, color::Scalar; thickness::Int32 = Int32(1), lineType::Int32 = Int32(LINE_8), bottomLeftOrigin::Bool = (false)) = putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin) + +``` + +This is a list of functions implemented from the `dnn` module. + +``` +function finalize(cobj::cv_Ptr{T}, inputs::Array{InputArray, 1}, outputs::Array{InputArray, 1}) where {T <: dnn_Layer} + +finalize(cobj::cv_Ptr{T}, inputs::Array{InputArray, 1}; outputs::Array{InputArray, 1} = (Array{InputArray, 1}())) where {T <: dnn_Layer} = finalize(cobj, inputs, outputs) + +function outputNameToIndex(cobj::cv_Ptr{T}, outputName::String) where {T <: dnn_Layer} + +function empty(cobj::dnn_Net) + +function dump(cobj::dnn_Net) + +function dumpToFile(cobj::dnn_Net, path::String) + +function getLayerId(cobj::dnn_Net, layer::String) + +function getLayerNames(cobj::dnn_Net) + +function getLayer(cobj::dnn_Net, layerId::dnn_LayerId) + +function connect(cobj::dnn_Net, outPin::String, inpPin::String) + +function setInputsNames(cobj::dnn_Net, inputBlobNames::Array{String, 1}) + +function setInputShape(cobj::dnn_Net, inputName::String, shape::Array{Int32, 1}) + +function forward(cobj::dnn_Net, outputName::String) + +forward(cobj::dnn_Net; outputName::String = (String())) = forward(cobj, outputName) +function forward(cobj::dnn_Net, outputBlobs::Array{InputArray, 1}, outputName::String) + +function forward(cobj::dnn_Net, outBlobNames::Array{String, 1}, outputBlobs::Array{InputArray, 1}) + +forward(cobj::dnn_Net, outBlobNames::Array{String, 1}; outputBlobs::Array{InputArray, 1} = (Array{InputArray, 1}())) = forward(cobj, outBlobNames, outputBlobs) +function forwardAsync(cobj::dnn_Net, outputName::String) + +forwardAsync(cobj::dnn_Net; outputName::String = (String())) = forwardAsync(cobj, outputName) +function setHalideScheduler(cobj::dnn_Net, scheduler::String) + +function setPreferableBack(cobj::dnn_Net, backId::Int32) + +function setPreferableTarget(cobj::dnn_Net, targetId::Int32) + +function setInput(cobj::dnn_Net, blob::InputArray, name::String, scalefactor::Float64, mean::Scalar) + +setInput(cobj::dnn_Net, blob::InputArray; name::String = (""), scalefactor::Float64 = Float64(1.0), mean::Scalar = ()) = setInput(cobj, blob, name, scalefactor, mean) +function setParam(cobj::dnn_Net, layer::dnn_LayerId, numParam::Int32, blob::InputArray) + +function getParam(cobj::dnn_Net, layer::dnn_LayerId, numParam::Int32) + +getParam(cobj::dnn_Net, layer::dnn_LayerId; numParam::Int32 = Int32(0)) = getParam(cobj, layer, numParam) +function getUnconnectedOutLayers(cobj::dnn_Net) + +function getUnconnectedOutLayersNames(cobj::dnn_Net) + +function getLayersShapes(cobj::dnn_Net, netInputShapes::Array{Array{Int32, 1}, 1}) + +function getLayersShapes(cobj::dnn_Net, netInputShape::Array{Int32, 1}) + +function getFLOPS(cobj::dnn_Net, netInputShapes::Array{Array{Int32, 1}, 1}) + +function getFLOPS(cobj::dnn_Net, netInputShape::Array{Int32, 1}) + +function getFLOPS(cobj::dnn_Net, layerId::Int32, netInputShapes::Array{Array{Int32, 1}, 1}) + +function getFLOPS(cobj::dnn_Net, layerId::Int32, netInputShape::Array{Int32, 1}) + +function getLayerTypes(cobj::dnn_Net) + +function getLayersCount(cobj::dnn_Net, layerType::String) + +function getMemoryConsumption(cobj::dnn_Net, netInputShape::Array{Int32, 1}) + +function getMemoryConsumption(cobj::dnn_Net, layerId::Int32, netInputShapes::Array{Array{Int32, 1}, 1}) + +function getMemoryConsumption(cobj::dnn_Net, layerId::Int32, netInputShape::Array{Int32, 1}) + +function enableFusion(cobj::dnn_Net, fusion::Bool) + +function getPerfProfile(cobj::dnn_Net) + +function setInputSize(cobj::dnn_Model, size::Size) + +function setInputSize(cobj::dnn_Model, width::Int32, height::Int32) + +function setInputMean(cobj::dnn_Model, mean::Scalar) + +function setInputScale(cobj::dnn_Model, scale::Float64) + +function setInputCrop(cobj::dnn_Model, crop::Bool) + +function setInputSwapRB(cobj::dnn_Model, swapRB::Bool) + +function setInputParams(cobj::dnn_Model, scale::Float64, size::Size, mean::Scalar, swapRB::Bool, crop::Bool) + +setInputParams(cobj::dnn_Model; scale::Float64 = Float64(1.0), size::Size = (SizeOP()), mean::Scalar = (), swapRB::Bool = (false), crop::Bool = (false)) = setInputParams(cobj, scale, size, mean, swapRB, crop) +function predict(cobj::dnn_Model, frame::InputArray, outs::Array{InputArray, 1}) + +predict(cobj::dnn_Model, frame::InputArray; outs::Array{InputArray, 1} = (Array{InputArray, 1}())) = predict(cobj, frame, outs) +function dnn_Model(model::String, config::String) + +dnn_Model(model::String; config::String = ("")) = dnn_Model(model, config) +function dnn_Model(network::dnn_Net) + +function classify(cobj::dnn_ClassificationModel, frame::InputArray) + +function dnn_ClassificationModel(model::String, config::String) + +dnn_ClassificationModel(model::String; config::String = ("")) = dnn_ClassificationModel(model, config) +function dnn_ClassificationModel(network::dnn_Net) + +function estimate(cobj::dnn_KeypointsModel, frame::InputArray, thresh::Float32) + +estimate(cobj::dnn_KeypointsModel, frame::InputArray; thresh::Float32 = Float32(0.5)) = estimate(cobj, frame, thresh) +function dnn_KeypointsModel(model::String, config::String) + +dnn_KeypointsModel(model::String; config::String = ("")) = dnn_KeypointsModel(model, config) +function dnn_KeypointsModel(network::dnn_Net) + +function segment(cobj::dnn_SegmentationModel, frame::InputArray, mask::InputArray) + +segment(cobj::dnn_SegmentationModel, frame::InputArray; mask::InputArray = (CxxMat())) = segment(cobj, frame, mask) +function dnn_SegmentationModel(model::String, config::String) + +dnn_SegmentationModel(model::String; config::String = ("")) = dnn_SegmentationModel(model, config) +function dnn_SegmentationModel(network::dnn_Net) + +function detect(cobj::dnn_DetectionModel, frame::InputArray, confThreshold::Float32, nmsThreshold::Float32) + +detect(cobj::dnn_DetectionModel, frame::InputArray; confThreshold::Float32 = Float32(0.5), nmsThreshold::Float32 = Float32(0.0)) = detect(cobj, frame, confThreshold, nmsThreshold) +function dnn_DetectionModel(model::String, config::String) + +dnn_DetectionModel(model::String; config::String = ("")) = dnn_DetectionModel(model, config) +function dnn_DetectionModel(network::dnn_Net) + +function Net_readFromModelOptimizer(xml::String, bin::String) + +function Net_readFromModelOptimizer(bufferModelConfig::Array{UInt8, 1}, bufferWeights::Array{UInt8, 1}) + +function readNetFromDarknet(cfgFile::String, darknetModel::String) + +readNetFromDarknet(cfgFile::String; darknetModel::String = (String())) = readNetFromDarknet(cfgFile, darknetModel) +function readNetFromDarknet(bufferCfg::Array{UInt8, 1}, bufferModel::Array{UInt8, 1}) + +readNetFromDarknet(bufferCfg::Array{UInt8, 1}; bufferModel::Array{UInt8, 1} = (stdggvectoriUInt8kOP())) = readNetFromDarknet(bufferCfg, bufferModel) +function readNetFromCaffe(prototxt::String, caffeModel::String) + +readNetFromCaffe(prototxt::String; caffeModel::String = (String())) = readNetFromCaffe(prototxt, caffeModel) +function readNetFromCaffe(bufferProto::Array{UInt8, 1}, bufferModel::Array{UInt8, 1}) + +readNetFromCaffe(bufferProto::Array{UInt8, 1}; bufferModel::Array{UInt8, 1} = (stdggvectoriUInt8kOP())) = readNetFromCaffe(bufferProto, bufferModel) +function readNetFromTensorflow(model::String, config::String) + +readNetFromTensorflow(model::String; config::String = (String())) = readNetFromTensorflow(model, config) +function readNetFromTensorflow(bufferModel::Array{UInt8, 1}, bufferConfig::Array{UInt8, 1}) + +readNetFromTensorflow(bufferModel::Array{UInt8, 1}; bufferConfig::Array{UInt8, 1} = (stdggvectoriUInt8kOP())) = readNetFromTensorflow(bufferModel, bufferConfig) +function readNetFromTorch(model::String, isBinary::Bool, evaluate::Bool) + +readNetFromTorch(model::String; isBinary::Bool = (true), evaluate::Bool = (true)) = readNetFromTorch(model, isBinary, evaluate) +function readNet(model::String, config::String, framework::String) + +readNet(model::String; config::String = (""), framework::String = ("")) = readNet(model, config, framework) +function readNet(framework::String, bufferModel::Array{UInt8, 1}, bufferConfig::Array{UInt8, 1}) + +readNet(framework::String, bufferModel::Array{UInt8, 1}; bufferConfig::Array{UInt8, 1} = (stdggvectoriUInt8kOP())) = readNet(framework, bufferModel, bufferConfig) +function readTorchBlob(filename::String, isBinary::Bool) + +readTorchBlob(filename::String; isBinary::Bool = (true)) = readTorchBlob(filename, isBinary) +function readNetFromModelOptimizer(xml::String, bin::String) + +function readNetFromModelOptimizer(bufferModelConfig::Array{UInt8, 1}, bufferWeights::Array{UInt8, 1}) + +function readNetFromONNX(onnxFile::String) + +function readNetFromONNX(buffer::Array{UInt8, 1}) + +function readTensorFromONNX(path::String) + +function blobFromImage(image::InputArray, scalefactor::Float64, size::Size, mean::Scalar, swapRB::Bool, crop::Bool, ddepth::Int32) + +blobFromImage(image::InputArray; scalefactor::Float64 = Float64(1.0), size::Size = (SizeOP()), mean::Scalar = (), swapRB::Bool = (false), crop::Bool = (false), ddepth::Int32 = Int32(CV_32F)) = blobFromImage(image, scalefactor, size, mean, swapRB, crop, ddepth) +function blobFromImages(images::Array{InputArray, 1}, scalefactor::Float64, size::Size, mean::Scalar, swapRB::Bool, crop::Bool, ddepth::Int32) + +blobFromImages(images::Array{InputArray, 1}; scalefactor::Float64 = Float64(1.0), size::Size = (SizeOP()), mean::Scalar = (), swapRB::Bool = (false), crop::Bool = (false), ddepth::Int32 = Int32(CV_32F)) = blobFromImages(images, scalefactor, size, mean, swapRB, crop, ddepth) +function imagesFromBlob(blob_::InputArray, images_::Array{InputArray, 1}) + +imagesFromBlob(blob_::InputArray; images_::Array{InputArray, 1} = (Array{InputArray, 1}())) = imagesFromBlob(blob_, images_) +function shrinkCaffeModel(src::String, dst::String, layersTypes::Array{String, 1}) + +shrinkCaffeModel(src::String, dst::String; layersTypes::Array{String, 1} = (stdggvectoriStringkOP())) = shrinkCaffeModel(src, dst, layersTypes) +function writeTextGraph(model::String, output::String) + +function NMSBoxes(bboxes::Array{Rect{Float64}, 1}, scores::Array{Float32, 1}, score_threshold::Float32, nms_threshold::Float32, eta::Float32, top_k::Int32) + +NMSBoxes(bboxes::Array{Rect{Float64}, 1}, scores::Array{Float32, 1}, score_threshold::Float32, nms_threshold::Float32; eta::Float32 = Float32(1.0), top_k::Int32 = Int32(0)) = NMSBoxes(bboxes, scores, score_threshold, nms_threshold, eta, top_k) +function NMSBoxesRotated(bboxes::Array{RotatedRect, 1}, scores::Array{Float32, 1}, score_threshold::Float32, nms_threshold::Float32, eta::Float32, top_k::Int32) + +NMSBoxesRotated(bboxes::Array{RotatedRect, 1}, scores::Array{Float32, 1}, score_threshold::Float32, nms_threshold::Float32; eta::Float32 = Float32(1.0), top_k::Int32 = Int32(0)) = NMSBoxesRotated(bboxes, scores, score_threshold, nms_threshold, eta, top_k) +``` \ No newline at end of file diff --git a/modules/julia/package/OpenCV/src/OpenCV.jl b/modules/julia/package/OpenCV/src/OpenCV.jl index 4b7d5489b..e5bcfff14 100644 --- a/modules/julia/package/OpenCV/src/OpenCV.jl +++ b/modules/julia/package/OpenCV/src/OpenCV.jl @@ -10,7 +10,7 @@ using CxxWrap function __init__() @initcxx end -const Scalar = Union{Tuple{Number}, Tuple{Number, Number}, Tuple{Number, Number, Number}, NTuple{4, Number}} +const Scalar = Union{Tuple{}, Tuple{Number}, Tuple{Number, Number}, Tuple{Number, Number, Number}, NTuple{4, Number}} include("Mat.jl") @@ -52,6 +52,15 @@ function cpp_to_julia(var::Tuple) end return tuple(ret_arr...) end + +function cpp_to_julia(var::CxxBool) + return Bool(var) +end + +function julia_to_cpp(var::Bool) + return CxxBool(var) +end + # using StaticArrays include("cv_wrap.jl") diff --git a/modules/julia/package/OpenCV/src/cv_dnn_wrap.jl b/modules/julia/package/OpenCV/src/cv_dnn_wrap.jl new file mode 100644 index 000000000..755326514 --- /dev/null +++ b/modules/julia/package/OpenCV/src/cv_dnn_wrap.jl @@ -0,0 +1,435 @@ + +function Base.getproperty(m::dnn_Layer, s::Symbol) + if s==:blobs + return cpp_to_julia(jlopencv_Layer_get_blobs(m)) + end + if s==:name + return cpp_to_julia(jlopencv_Layer_get_name(m)) + end + if s==:type + return cpp_to_julia(jlopencv_Layer_get_type(m)) + end + if s==:preferableTarget + return cpp_to_julia(jlopencv_Layer_get_preferableTarget(m)) + end + return Base.getfield(m, s) +end + +function Base.setproperty!(m::dnn_Layer, s::Symbol, v) + if s==:name + jlopencv_Layer_set_name(m, julia_to_cpp(v)) + end + if s==:type + jlopencv_Layer_set_type(m, julia_to_cpp(v)) + end + if s==:preferableTarget + jlopencv_Layer_set_preferableTarget(m, julia_to_cpp(v)) + end + return Base.setfield!(m, s, v) +end + +function finalize(cobj::cv_Ptr{T}, inputs::Array{InputArray, 1}, outputs::Array{InputArray, 1}) where {T <: dnn_Layer} + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Layer_cv_dnn_Layer_finalize(julia_to_cpp(cobj),julia_to_cpp(inputs),julia_to_cpp(outputs))) +end +finalize(cobj::cv_Ptr{T}, inputs::Array{InputArray, 1}; outputs::Array{InputArray, 1} = (Array{InputArray, 1}())) where {T <: dnn_Layer} = finalize(cobj, inputs, outputs) + +# function run(cobj::cv_Ptr{T}, inputs::Array{InputArray, 1}, internals::Array{InputArray, 1}, outputs::Array{InputArray, 1}) where {T <: dnn_Layer} +# return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Layer_cv_dnn_Layer_run(julia_to_cpp(cobj),julia_to_cpp(inputs),julia_to_cpp(internals),julia_to_cpp(outputs))) +# end +# run(cobj::cv_Ptr{T}, inputs::Array{InputArray, 1}, internals::Array{InputArray, 1}; outputs::Array{InputArray, 1} = (Array{InputArray, 1}())) where {T <: dnn_Layer} = run(cobj, inputs, internals, outputs) + +function outputNameToIndex(cobj::cv_Ptr{T}, outputName::String) where {T <: dnn_Layer} + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Layer_cv_dnn_Layer_outputNameToIndex(julia_to_cpp(cobj),julia_to_cpp(outputName))) +end +function Base.getproperty(m::dnn_Net, s::Symbol) + return Base.getfield(m, s) +end +function Base.setproperty!(m::dnn_Net, s::Symbol, v) + return Base.setfield!(m, s, v) +end + +function empty(cobj::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_empty(julia_to_cpp(cobj))) +end + +function dump(cobj::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_dump(julia_to_cpp(cobj))) +end + +function dumpToFile(cobj::dnn_Net, path::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_dumpToFile(julia_to_cpp(cobj),julia_to_cpp(path))) +end + +function getLayerId(cobj::dnn_Net, layer::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayerId(julia_to_cpp(cobj),julia_to_cpp(layer))) +end + +function getLayerNames(cobj::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayerNames(julia_to_cpp(cobj))) +end + +function getLayer(cobj::dnn_Net, layerId::dnn_LayerId) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayer(julia_to_cpp(cobj),julia_to_cpp(layerId))) +end + +function connect(cobj::dnn_Net, outPin::String, inpPin::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_connect(julia_to_cpp(cobj),julia_to_cpp(outPin),julia_to_cpp(inpPin))) +end + +function setInputsNames(cobj::dnn_Net, inputBlobNames::Array{String, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setInputsNames(julia_to_cpp(cobj),julia_to_cpp(inputBlobNames))) +end + +function setInputShape(cobj::dnn_Net, inputName::String, shape::Array{Int32, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setInputShape(julia_to_cpp(cobj),julia_to_cpp(inputName),julia_to_cpp(shape))) +end + +function forward(cobj::dnn_Net, outputName::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forward(julia_to_cpp(cobj),julia_to_cpp(outputName))) +end +forward(cobj::dnn_Net; outputName::String = (String())) = forward(cobj, outputName) + +function forward(cobj::dnn_Net, outputBlobs::Array{InputArray, 1}, outputName::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forward(julia_to_cpp(cobj),julia_to_cpp(outputBlobs),julia_to_cpp(outputName))) +end + +function forward(cobj::dnn_Net, outBlobNames::Array{String, 1}, outputBlobs::Array{InputArray, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forward(julia_to_cpp(cobj),julia_to_cpp(outBlobNames),julia_to_cpp(outputBlobs))) +end +forward(cobj::dnn_Net, outBlobNames::Array{String, 1}; outputBlobs::Array{InputArray, 1} = (Array{InputArray, 1}())) = forward(cobj, outBlobNames, outputBlobs) + +function forwardAsync(cobj::dnn_Net, outputName::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forwardAsync(julia_to_cpp(cobj),julia_to_cpp(outputName))) +end +forwardAsync(cobj::dnn_Net; outputName::String = (String())) = forwardAsync(cobj, outputName) + +function setHalideScheduler(cobj::dnn_Net, scheduler::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setHalideScheduler(julia_to_cpp(cobj),julia_to_cpp(scheduler))) +end + +function setPreferableBackend(cobj::dnn_Net, backendId::Int32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setPreferableBackend(julia_to_cpp(cobj),julia_to_cpp(backendId))) +end + +function setPreferableTarget(cobj::dnn_Net, targetId::Int32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setPreferableTarget(julia_to_cpp(cobj),julia_to_cpp(targetId))) +end + +function setInput(cobj::dnn_Net, blob::InputArray, name::String, scalefactor::Float64, mean::Scalar) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setInput(julia_to_cpp(cobj),julia_to_cpp(blob),julia_to_cpp(name),julia_to_cpp(scalefactor),julia_to_cpp(mean))) +end +setInput(cobj::dnn_Net, blob::InputArray; name::String = (""), scalefactor::Float64 = Float64(1.0), mean::Scalar = ()) = setInput(cobj, blob, name, scalefactor, mean) + +function setParam(cobj::dnn_Net, layer::dnn_LayerId, numParam::Int32, blob::InputArray) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setParam(julia_to_cpp(cobj),julia_to_cpp(layer),julia_to_cpp(numParam),julia_to_cpp(blob))) +end + +function getParam(cobj::dnn_Net, layer::dnn_LayerId, numParam::Int32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getParam(julia_to_cpp(cobj),julia_to_cpp(layer),julia_to_cpp(numParam))) +end +getParam(cobj::dnn_Net, layer::dnn_LayerId; numParam::Int32 = Int32(0)) = getParam(cobj, layer, numParam) + +function getUnconnectedOutLayers(cobj::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getUnconnectedOutLayers(julia_to_cpp(cobj))) +end + +function getUnconnectedOutLayersNames(cobj::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getUnconnectedOutLayersNames(julia_to_cpp(cobj))) +end + +function getLayersShapes(cobj::dnn_Net, netInputShapes::Array{Array{Int32, 1}, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayersShapes(julia_to_cpp(cobj),julia_to_cpp(netInputShapes))) +end + +function getLayersShapes(cobj::dnn_Net, netInputShape::Array{Int32, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayersShapes(julia_to_cpp(cobj),julia_to_cpp(netInputShape))) +end + +function getFLOPS(cobj::dnn_Net, netInputShapes::Array{Array{Int32, 1}, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getFLOPS(julia_to_cpp(cobj),julia_to_cpp(netInputShapes))) +end + +function getFLOPS(cobj::dnn_Net, netInputShape::Array{Int32, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getFLOPS(julia_to_cpp(cobj),julia_to_cpp(netInputShape))) +end + +function getFLOPS(cobj::dnn_Net, layerId::Int32, netInputShapes::Array{Array{Int32, 1}, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getFLOPS(julia_to_cpp(cobj),julia_to_cpp(layerId),julia_to_cpp(netInputShapes))) +end + +function getFLOPS(cobj::dnn_Net, layerId::Int32, netInputShape::Array{Int32, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getFLOPS(julia_to_cpp(cobj),julia_to_cpp(layerId),julia_to_cpp(netInputShape))) +end + +function getLayerTypes(cobj::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayerTypes(julia_to_cpp(cobj))) +end + +function getLayersCount(cobj::dnn_Net, layerType::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayersCount(julia_to_cpp(cobj),julia_to_cpp(layerType))) +end + +function getMemoryConsumption(cobj::dnn_Net, netInputShape::Array{Int32, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getMemoryConsumption(julia_to_cpp(cobj),julia_to_cpp(netInputShape))) +end + +function getMemoryConsumption(cobj::dnn_Net, layerId::Int32, netInputShapes::Array{Array{Int32, 1}, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getMemoryConsumption(julia_to_cpp(cobj),julia_to_cpp(layerId),julia_to_cpp(netInputShapes))) +end + +function getMemoryConsumption(cobj::dnn_Net, layerId::Int32, netInputShape::Array{Int32, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getMemoryConsumption(julia_to_cpp(cobj),julia_to_cpp(layerId),julia_to_cpp(netInputShape))) +end + +function enableFusion(cobj::dnn_Net, fusion::Bool) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_enableFusion(julia_to_cpp(cobj),julia_to_cpp(fusion))) +end + +function getPerfProfile(cobj::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getPerfProfile(julia_to_cpp(cobj))) +end + +function Base.getproperty(m::dnn_Model, s::Symbol) + return Base.getfield(m, s) +end +function Base.setproperty!(m::dnn_Model, s::Symbol, v) + return Base.setfield!(m, s, v) +end + +function setInputSize(cobj::dnn_Model, size::Size) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputSize(julia_to_cpp(cobj),julia_to_cpp(size))) +end + +function setInputSize(cobj::dnn_Model, width::Int32, height::Int32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputSize(julia_to_cpp(cobj),julia_to_cpp(width),julia_to_cpp(height))) +end + +function setInputMean(cobj::dnn_Model, mean::Scalar) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputMean(julia_to_cpp(cobj),julia_to_cpp(mean))) +end + +function setInputScale(cobj::dnn_Model, scale::Float64) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputScale(julia_to_cpp(cobj),julia_to_cpp(scale))) +end + +function setInputCrop(cobj::dnn_Model, crop::Bool) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputCrop(julia_to_cpp(cobj),julia_to_cpp(crop))) +end + +function setInputSwapRB(cobj::dnn_Model, swapRB::Bool) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputSwapRB(julia_to_cpp(cobj),julia_to_cpp(swapRB))) +end + +function setInputParams(cobj::dnn_Model, scale::Float64, size::Size, mean::Scalar, swapRB::Bool, crop::Bool) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputParams(julia_to_cpp(cobj),julia_to_cpp(scale),julia_to_cpp(size),julia_to_cpp(mean),julia_to_cpp(swapRB),julia_to_cpp(crop))) +end +setInputParams(cobj::dnn_Model; scale::Float64 = Float64(1.0), size::Size = (SizeOP()), mean::Scalar = (), swapRB::Bool = (false), crop::Bool = (false)) = setInputParams(cobj, scale, size, mean, swapRB, crop) + +function predict(cobj::dnn_Model, frame::InputArray, outs::Array{InputArray, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_predict(julia_to_cpp(cobj),julia_to_cpp(frame),julia_to_cpp(outs))) +end +predict(cobj::dnn_Model, frame::InputArray; outs::Array{InputArray, 1} = (Array{InputArray, 1}())) = predict(cobj, frame, outs) + +function dnn_Model(model::String, config::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_Model(julia_to_cpp(model),julia_to_cpp(config))) +end +dnn_Model(model::String; config::String = ("")) = dnn_Model(model, config) + +function dnn_Model(network::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_Model(julia_to_cpp(network))) +end +function Base.getproperty(m::dnn_ClassificationModel, s::Symbol) + return Base.getfield(m, s) +end +function Base.setproperty!(m::dnn_ClassificationModel, s::Symbol, v) + return Base.setfield!(m, s, v) +end + +function classify(cobj::dnn_ClassificationModel, frame::InputArray) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_ClassificationModel_cv_dnn_ClassificationModel_classify(julia_to_cpp(cobj),julia_to_cpp(frame))) +end + +function dnn_ClassificationModel(model::String, config::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_ClassificationModel_cv_dnn_ClassificationModel_ClassificationModel(julia_to_cpp(model),julia_to_cpp(config))) +end +dnn_ClassificationModel(model::String; config::String = ("")) = dnn_ClassificationModel(model, config) + +function dnn_ClassificationModel(network::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_ClassificationModel_cv_dnn_ClassificationModel_ClassificationModel(julia_to_cpp(network))) +end +function Base.getproperty(m::dnn_KeypointsModel, s::Symbol) + return Base.getfield(m, s) +end +function Base.setproperty!(m::dnn_KeypointsModel, s::Symbol, v) + return Base.setfield!(m, s, v) +end + +function estimate(cobj::dnn_KeypointsModel, frame::InputArray, thresh::Float32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_KeypointsModel_cv_dnn_KeypointsModel_estimate(julia_to_cpp(cobj),julia_to_cpp(frame),julia_to_cpp(thresh))) +end +estimate(cobj::dnn_KeypointsModel, frame::InputArray; thresh::Float32 = Float32(0.5)) = estimate(cobj, frame, thresh) + +function dnn_KeypointsModel(model::String, config::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_KeypointsModel_cv_dnn_KeypointsModel_KeypointsModel(julia_to_cpp(model),julia_to_cpp(config))) +end +dnn_KeypointsModel(model::String; config::String = ("")) = dnn_KeypointsModel(model, config) + +function dnn_KeypointsModel(network::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_KeypointsModel_cv_dnn_KeypointsModel_KeypointsModel(julia_to_cpp(network))) +end +function Base.getproperty(m::dnn_SegmentationModel, s::Symbol) + return Base.getfield(m, s) +end +function Base.setproperty!(m::dnn_SegmentationModel, s::Symbol, v) + return Base.setfield!(m, s, v) +end + +function segment(cobj::dnn_SegmentationModel, frame::InputArray, mask::InputArray) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_SegmentationModel_cv_dnn_SegmentationModel_segment(julia_to_cpp(cobj),julia_to_cpp(frame),julia_to_cpp(mask))) +end +segment(cobj::dnn_SegmentationModel, frame::InputArray; mask::InputArray = (CxxMat())) = segment(cobj, frame, mask) + +function dnn_SegmentationModel(model::String, config::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_SegmentationModel_cv_dnn_SegmentationModel_SegmentationModel(julia_to_cpp(model),julia_to_cpp(config))) +end +dnn_SegmentationModel(model::String; config::String = ("")) = dnn_SegmentationModel(model, config) + +function dnn_SegmentationModel(network::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_SegmentationModel_cv_dnn_SegmentationModel_SegmentationModel(julia_to_cpp(network))) +end +function Base.getproperty(m::dnn_DetectionModel, s::Symbol) + return Base.getfield(m, s) +end +function Base.setproperty!(m::dnn_DetectionModel, s::Symbol, v) + return Base.setfield!(m, s, v) +end + +function detect(cobj::dnn_DetectionModel, frame::InputArray, confThreshold::Float32, nmsThreshold::Float32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_DetectionModel_cv_dnn_DetectionModel_detect(julia_to_cpp(cobj),julia_to_cpp(frame),julia_to_cpp(confThreshold),julia_to_cpp(nmsThreshold))) +end +detect(cobj::dnn_DetectionModel, frame::InputArray; confThreshold::Float32 = Float32(0.5), nmsThreshold::Float32 = Float32(0.0)) = detect(cobj, frame, confThreshold, nmsThreshold) + +function dnn_DetectionModel(model::String, config::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_DetectionModel_cv_dnn_DetectionModel_DetectionModel(julia_to_cpp(model),julia_to_cpp(config))) +end +dnn_DetectionModel(model::String; config::String = ("")) = dnn_DetectionModel(model, config) + +function dnn_DetectionModel(network::dnn_Net) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_DetectionModel_cv_dnn_DetectionModel_DetectionModel(julia_to_cpp(network))) +end + +# function getAvailableTargets(be::dnn_Backend) +# return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_getAvailableTargets(julia_to_cpp(be))) +# end + +function Net_readFromModelOptimizer(xml::String, bin::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_readFromModelOptimizer(julia_to_cpp(xml),julia_to_cpp(bin))) +end + +function Net_readFromModelOptimizer(bufferModelConfig::Array{UInt8, 1}, bufferWeights::Array{UInt8, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_Net_readFromModelOptimizer(julia_to_cpp(bufferModelConfig),julia_to_cpp(bufferWeights))) +end + +function readNetFromDarknet(cfgFile::String, darknetModel::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromDarknet(julia_to_cpp(cfgFile),julia_to_cpp(darknetModel))) +end +readNetFromDarknet(cfgFile::String; darknetModel::String = (String())) = readNetFromDarknet(cfgFile, darknetModel) + +function readNetFromDarknet(bufferCfg::Array{UInt8, 1}, bufferModel::Array{UInt8, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromDarknet(julia_to_cpp(bufferCfg),julia_to_cpp(bufferModel))) +end +readNetFromDarknet(bufferCfg::Array{UInt8, 1}; bufferModel::Array{UInt8, 1} = (stdggvectoriUInt8kOP())) = readNetFromDarknet(bufferCfg, bufferModel) + +function readNetFromCaffe(prototxt::String, caffeModel::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromCaffe(julia_to_cpp(prototxt),julia_to_cpp(caffeModel))) +end +readNetFromCaffe(prototxt::String; caffeModel::String = (String())) = readNetFromCaffe(prototxt, caffeModel) + +function readNetFromCaffe(bufferProto::Array{UInt8, 1}, bufferModel::Array{UInt8, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromCaffe(julia_to_cpp(bufferProto),julia_to_cpp(bufferModel))) +end +readNetFromCaffe(bufferProto::Array{UInt8, 1}; bufferModel::Array{UInt8, 1} = (stdggvectoriUInt8kOP())) = readNetFromCaffe(bufferProto, bufferModel) + +function readNetFromTensorflow(model::String, config::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromTensorflow(julia_to_cpp(model),julia_to_cpp(config))) +end +readNetFromTensorflow(model::String; config::String = (String())) = readNetFromTensorflow(model, config) + +function readNetFromTensorflow(bufferModel::Array{UInt8, 1}, bufferConfig::Array{UInt8, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromTensorflow(julia_to_cpp(bufferModel),julia_to_cpp(bufferConfig))) +end +readNetFromTensorflow(bufferModel::Array{UInt8, 1}; bufferConfig::Array{UInt8, 1} = (stdggvectoriUInt8kOP())) = readNetFromTensorflow(bufferModel, bufferConfig) + +function readNetFromTorch(model::String, isBinary::Bool, evaluate::Bool) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromTorch(julia_to_cpp(model),julia_to_cpp(isBinary),julia_to_cpp(evaluate))) +end +readNetFromTorch(model::String; isBinary::Bool = (true), evaluate::Bool = (true)) = readNetFromTorch(model, isBinary, evaluate) + +function readNet(model::String, config::String, framework::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNet(julia_to_cpp(model),julia_to_cpp(config),julia_to_cpp(framework))) +end +readNet(model::String; config::String = (""), framework::String = ("")) = readNet(model, config, framework) + +function readNet(framework::String, bufferModel::Array{UInt8, 1}, bufferConfig::Array{UInt8, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNet(julia_to_cpp(framework),julia_to_cpp(bufferModel),julia_to_cpp(bufferConfig))) +end +readNet(framework::String, bufferModel::Array{UInt8, 1}; bufferConfig::Array{UInt8, 1} = (stdggvectoriUInt8kOP())) = readNet(framework, bufferModel, bufferConfig) + +function readTorchBlob(filename::String, isBinary::Bool) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readTorchBlob(julia_to_cpp(filename),julia_to_cpp(isBinary))) +end +readTorchBlob(filename::String; isBinary::Bool = (true)) = readTorchBlob(filename, isBinary) + +function readNetFromModelOptimizer(xml::String, bin::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromModelOptimizer(julia_to_cpp(xml),julia_to_cpp(bin))) +end + +function readNetFromModelOptimizer(bufferModelConfig::Array{UInt8, 1}, bufferWeights::Array{UInt8, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromModelOptimizer(julia_to_cpp(bufferModelConfig),julia_to_cpp(bufferWeights))) +end + +function readNetFromONNX(onnxFile::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromONNX(julia_to_cpp(onnxFile))) +end + +function readNetFromONNX(buffer::Array{UInt8, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readNetFromONNX(julia_to_cpp(buffer))) +end + +function readTensorFromONNX(path::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_readTensorFromONNX(julia_to_cpp(path))) +end + +function blobFromImage(image::InputArray, scalefactor::Float64, size::Size, mean::Scalar, swapRB::Bool, crop::Bool, ddepth::Int32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_blobFromImage(julia_to_cpp(image),julia_to_cpp(scalefactor),julia_to_cpp(size),julia_to_cpp(mean),julia_to_cpp(swapRB),julia_to_cpp(crop),julia_to_cpp(ddepth))) +end +blobFromImage(image::InputArray; scalefactor::Float64 = Float64(1.0), size::Size = (SizeOP()), mean::Scalar = (), swapRB::Bool = (false), crop::Bool = (false), ddepth::Int32 = Int32(CV_32F)) = blobFromImage(image, scalefactor, size, mean, swapRB, crop, ddepth) + +function blobFromImages(images::Array{InputArray, 1}, scalefactor::Float64, size::Size, mean::Scalar, swapRB::Bool, crop::Bool, ddepth::Int32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_blobFromImages(julia_to_cpp(images),julia_to_cpp(scalefactor),julia_to_cpp(size),julia_to_cpp(mean),julia_to_cpp(swapRB),julia_to_cpp(crop),julia_to_cpp(ddepth))) +end +blobFromImages(images::Array{InputArray, 1}; scalefactor::Float64 = Float64(1.0), size::Size = (SizeOP()), mean::Scalar = (), swapRB::Bool = (false), crop::Bool = (false), ddepth::Int32 = Int32(CV_32F)) = blobFromImages(images, scalefactor, size, mean, swapRB, crop, ddepth) + +function imagesFromBlob(blob_::InputArray, images_::Array{InputArray, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_imagesFromBlob(julia_to_cpp(blob_),julia_to_cpp(images_))) +end +imagesFromBlob(blob_::InputArray; images_::Array{InputArray, 1} = (Array{InputArray, 1}())) = imagesFromBlob(blob_, images_) + +function shrinkCaffeModel(src::String, dst::String, layersTypes::Array{String, 1}) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_shrinkCaffeModel(julia_to_cpp(src),julia_to_cpp(dst),julia_to_cpp(layersTypes))) +end +shrinkCaffeModel(src::String, dst::String; layersTypes::Array{String, 1} = (stdggvectoriStringkOP())) = shrinkCaffeModel(src, dst, layersTypes) + +function writeTextGraph(model::String, output::String) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_writeTextGraph(julia_to_cpp(model),julia_to_cpp(output))) +end + +function NMSBoxes(bboxes::Array{Rect{Float64}, 1}, scores::Array{Float32, 1}, score_threshold::Float32, nms_threshold::Float32, eta::Float32, top_k::Int32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_NMSBoxes(julia_to_cpp(bboxes),julia_to_cpp(scores),julia_to_cpp(score_threshold),julia_to_cpp(nms_threshold),julia_to_cpp(eta),julia_to_cpp(top_k))) +end +NMSBoxes(bboxes::Array{Rect{Float64}, 1}, scores::Array{Float32, 1}, score_threshold::Float32, nms_threshold::Float32; eta::Float32 = Float32(1.0), top_k::Int32 = Int32(0)) = NMSBoxes(bboxes, scores, score_threshold, nms_threshold, eta, top_k) + +function NMSBoxesRotated(bboxes::Array{RotatedRect, 1}, scores::Array{Float32, 1}, score_threshold::Float32, nms_threshold::Float32, eta::Float32, top_k::Int32) + return cpp_to_julia(jlopencv_cv_dnn_cv_dnn_NMSBoxes(julia_to_cpp(bboxes),julia_to_cpp(scores),julia_to_cpp(score_threshold),julia_to_cpp(nms_threshold),julia_to_cpp(eta),julia_to_cpp(top_k))) +end +NMSBoxesRotated(bboxes::Array{RotatedRect, 1}, scores::Array{Float32, 1}, score_threshold::Float32, nms_threshold::Float32; eta::Float32 = Float32(1.0), top_k::Int32 = Int32(0)) = NMSBoxesRotated(bboxes, scores, score_threshold, nms_threshold, eta, top_k) \ No newline at end of file diff --git a/modules/julia/package/OpenCV/src/cv_wrap.jl b/modules/julia/package/OpenCV/src/cv_wrap.jl index 7adcc05d6..8ed3f7a7b 100644 --- a/modules/julia/package/OpenCV/src/cv_wrap.jl +++ b/modules/julia/package/OpenCV/src/cv_wrap.jl @@ -20,7 +20,7 @@ function Base.getproperty(m::KeyPoint, s::Symbol) return Base.getfield(m, s) end function Base.setproperty!(m::KeyPoint, s::Symbol, v) - return Base.setfield(m, s, v) + return Base.setfield!(m, s, v) end function KeyPoint(x::Float32, y::Float32, _size::Float32, _angle::Float32, _response::Float32, _octave::Int32, _class_id::Int32) @@ -112,3 +112,14 @@ equalizeHist(src::InputArray; dst::InputArray = (CxxMat())) = equalizeHist(src, function destroyAllWindows() return cpp_to_julia(jlopencv_cv_cv_destroyAllWindows()) end + +function getTextSize(text::String, fontFace::Int32, fontScale::Float64, thickness::Int32) + return cpp_to_julia(jlopencv_cv_cv_getTextSize(julia_to_cpp(text),julia_to_cpp(fontFace),julia_to_cpp(fontScale),julia_to_cpp(thickness))) +end + +function putText(img::InputArray, text::String, org::Point{Int32}, fontFace::Int32, fontScale::Float64, color::Scalar, thickness::Int32, lineType::Int32, bottomLeftOrigin::Bool) + return cpp_to_julia(jlopencv_cv_cv_putText(julia_to_cpp(img),julia_to_cpp(text),julia_to_cpp(org),julia_to_cpp(fontFace),julia_to_cpp(fontScale),julia_to_cpp(color),julia_to_cpp(thickness),julia_to_cpp(lineType),julia_to_cpp(bottomLeftOrigin))) +end +putText(img::InputArray, text::String, org::Point{Int32}, fontFace::Int32, fontScale::Float64, color::Scalar; thickness::Int32 = Int32(1), lineType::Int32 = Int32(LINE_8), bottomLeftOrigin::Bool = (false)) = putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin) + +include("cv_dnn_wrap.jl") diff --git a/modules/julia/package/OpenCV/src/types_conversion.jl b/modules/julia/package/OpenCV/src/types_conversion.jl index 7c72e3a9b..57d517af1 100644 --- a/modules/julia/package/OpenCV/src/types_conversion.jl +++ b/modules/julia/package/OpenCV/src/types_conversion.jl @@ -8,7 +8,9 @@ function cpp_to_julia(var::CxxVec{T, N}) where {T, N} end function julia_to_cpp(sc::Scalar) - if size(sc,1)==1 + if size(sc,1)==0 + return CxxScalar{Float64}(0,0,0,0) + elseif size(sc, 1) == 1 return CxxScalar{Float64}(Float64(sc[1]), 0, 0, 0) elseif size(sc,1) == 2 return CxxScalar{Float64}(Float64(sc[1]), Float64(sc[2]), 0, 0) diff --git a/modules/julia/samples/face_detect_dnn.jl b/modules/julia/samples/face_detect_dnn.jl new file mode 100644 index 000000000..14509818b --- /dev/null +++ b/modules/julia/samples/face_detect_dnn.jl @@ -0,0 +1,36 @@ +using OpenCV +const cv = OpenCV +size0 = Int32(300) +# take the model from https://github.com/opencv/opencv_extra/tree/master/testdata/dnn +net = cv.dnn_DetectionModel("opencv_face_detector.pbtxt", "opencv_face_detector_uint8.pb") + +cv.setPreferableTarget(net, cv.DNN_TARGET_CPU) +cv.setInputMean(net, (104, 177, 123)) +cv.setInputScale(net, 1.) +cv.setInputSize(net, size0, size0) + +cap = cv.VideoCapture(Int32(0)) +while true + ok, frame = cv.read(cap) + if ok == false + break + end + classIds, confidences, boxes = cv.detect(net, frame, confThreshold=Float32(0.5)) + for i in 1:size(boxes,1) + confidence = confidences[i] + x0 = Int32(boxes[i].x) + y0 = Int32(boxes[i].y) + x1 = Int32(boxes[i].x+boxes[i].width) + y1 = Int32(boxes[i].y+boxes[i].height) + cv.rectangle(frame, cv.Point{Int32}(x0, y0), cv.Point{Int32}(x1, y1), (100, 255, 100); thickness = Int32(5)) + label = "face: " * string(confidence) + lsize, bl = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.5, Int32(1)) + cv.rectangle(frame, cv.Point{Int32}(x0,y0), cv.Point{Int32}(x0+lsize.width, y0+lsize.height+bl), (100,255,100); thickness = Int32(-1)) + cv.putText(frame, label, cv.Point{Int32}(x0, y0 + lsize.height), + cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0); thickness = Int32(1), lineType = cv.LINE_AA) + end + cv.imshow("detections", frame) + if cv.waitKey(Int32(30)) >= 0 + break + end +end \ No newline at end of file diff --git a/modules/julia/src/cv2.cpp b/modules/julia/src/cv2.cpp index 75f978ef8..bea881a29 100644 --- a/modules/julia/src/cv2.cpp +++ b/modules/julia/src/cv2.cpp @@ -16,8 +16,9 @@ #include #include #include -#include "opencv2/highgui.hpp" #include "opencv2/videoio.hpp" +#include "opencv2/dnn.hpp" + using namespace cv; using namespace std; @@ -27,40 +28,79 @@ using namespace jlcxx; namespace jlcxx { -template -struct IsSmartPointerType> : std::true_type -{ -}; -template -struct ConstructorPointerType> -{ - typedef T *type; -}; + template + struct IsSmartPointerType> : std::true_type + { + }; + template + struct ConstructorPointerType> + { + typedef T *type; + }; -template -struct BuildParameterList> -{ - typedef ParameterList> type; -}; -template <> -struct SuperType -{ - typedef cv::Algorithm type; -}; -template <> -struct SuperType -{ - typedef cv::Feature2D type; -}; -} + template + struct BuildParameterList> + { + typedef ParameterList> type; + }; + template <> + struct SuperType + { + typedef cv::Algorithm type; + }; + template <> + struct SuperType + { + typedef cv::Feature2D type; + }; -// Needed to prevent documentation warning + template <> + struct SuperType + { + typedef cv::Algorithm type; + }; + + template <> + struct SuperType + { + typedef cv::dnn::Net type; + }; -namespace cv { namespace julia { -void initJulia(int, char**) {} -}} + template <> + struct SuperType + { + typedef cv::dnn::Model type; + }; + template <> + struct SuperType + { + typedef cv::dnn::Model type; + }; + template <> + struct SuperType + { + typedef cv::dnn::Model type; + }; + + template <> + struct SuperType + { + typedef cv::dnn::Model type; + }; + +} // namespace jlcxx + +// Needed to prevent documentation warning + +namespace cv +{ + namespace julia + { + void initJulia(int, char **) {} + } // namespace julia +} // namespace cv JLCXX_MODULE cv_wrap(jlcxx::Module &mod) { @@ -130,7 +170,11 @@ JLCXX_MODULE cv_wrap(jlcxx::Module &mod) mod.method("jlopencv_cv_cv_imshow", [](string &winname, Mat &mat) { cv::imshow(winname, mat); ; }); mod.method("jlopencv_cv_cv_namedWindow", [](string &winname, int &flags) { cv::namedWindow(winname, flags); ; }); mod.method("jlopencv_cv_cv_waitKey", [](int &delay) { auto retval = cv::waitKey(delay); return retval; }); + + mod.method("jlopencv_cv_cv_getTextSize", [](string &text, int &fontFace, double &fontScale, int &thickness) {int baseLine; auto retval = cv::getTextSize(text, fontFace, fontScale, thickness, &baseLine); return make_tuple(move(retval),move(baseLine)); }); + mod.method("jlopencv_cv_cv_putText", [](Mat &img, string &text, Point &org, int &fontFace, double &fontScale, Scalar &color, int &thickness, int &lineType, bool bottomLeftOrigin) { cv::putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin); return img; }); mod.method("jlopencv_cv_cv_rectangle", [](Mat &img, Point &pt1, Point &pt2, Scalar &color, int &thickness, int &lineType, int &shift) { cv::rectangle(img, pt1, pt2, color, thickness, lineType, shift); return img; }); + mod.method("jlopencv_cv_cv_cvtColor", [](Mat &src, int &code, Mat &dst, int &dstCn) { cv::cvtColor(src, dst, code, dstCn); return dst; }); mod.method("jlopencv_cv_cv_equalizeHist", [](Mat &src, Mat &dst) { cv::equalizeHist(src, dst); return dst; }); mod.method("jlopencv_cv_cv_destroyAllWindows", []() { cv::destroyAllWindows(); ; }); @@ -432,4 +476,151 @@ JLCXX_MODULE cv_wrap(jlcxx::Module &mod) mod.set_const("COLOR_M_RGBA2RGBA", (int)cv::COLOR_mRGBA2RGBA); mod.set_const("CAP_ANY", (int)cv::CAP_ANY); + + mod.set_const("FONT_HERSHEY_COMPLEX", (int)cv::FONT_HERSHEY_COMPLEX); + mod.set_const("FONT_HERSHEY_COMPLEX_SMALL", (int)cv::FONT_HERSHEY_COMPLEX_SMALL); + mod.set_const("FONT_HERSHEY_DUPLEX", (int)cv::FONT_HERSHEY_DUPLEX); + mod.set_const("FONT_HERSHEY_PLAIN", (int)cv::FONT_HERSHEY_PLAIN); + mod.set_const("FONT_HERSHEY_SCRIPT_COMPLEX", (int)cv::FONT_HERSHEY_SCRIPT_COMPLEX); + mod.set_const("FONT_HERSHEY_SCRIPT_SIMPLEX", (int)cv::FONT_HERSHEY_SCRIPT_SIMPLEX); + mod.set_const("FONT_HERSHEY_SIMPLEX", (int)cv::FONT_HERSHEY_SIMPLEX); + mod.set_const("FONT_HERSHEY_TRIPLEX", (int)cv::FONT_HERSHEY_TRIPLEX); + mod.set_const("FONT_ITALIC", (int)cv::FONT_ITALIC); + + // DNN Module + + using namespace cv::dnn; + + mod.add_type("dnn_Layer", jlcxx::julia_base_type()); + mod.add_type("dnn_Net"); + mod.add_type("dnn_Model", jlcxx::julia_base_type()); + mod.add_type("dnn_ClassificationModel", jlcxx::julia_base_type()); + mod.add_type("dnn_KeypointsModel", jlcxx::julia_base_type()); + mod.add_type("dnn_SegmentationModel", jlcxx::julia_base_type()); + mod.add_type("dnn_DetectionModel", jlcxx::julia_base_type()); + + + mod.add_type("dnn_LayerId"); + mod.add_type("AsyncArray"); + + mod.method("jlopencv_Layer_set_blobs", [](cv::Ptr cobj, const vector_Mat &v) { cobj->blobs = (vector_Mat)v; }); + + mod.method("jlopencv_Layer_get_blobs", [](const cv::Ptr &cobj) { return cobj->blobs; }); + mod.method("jlopencv_Layer_get_name", [](const cv::Ptr &cobj) { return cobj->name; }); + mod.method("jlopencv_Layer_get_type", [](const cv::Ptr &cobj) { return cobj->type; }); + mod.method("jlopencv_Layer_get_preferableTarget", [](const cv::Ptr &cobj) { return cobj->preferableTarget; }); + + mod.method("jlopencv_cv_dnn_cv_dnn_Layer_cv_dnn_Layer_finalize", [](cv::Ptr &cobj, vector &inputs, vector &outputs) { cobj->finalize(inputs, outputs); return outputs; }); + // mod.method("jlopencv_cv_dnn_cv_dnn_Layer_cv_dnn_Layer_run", [](cv::Ptr &cobj, vector &inputs, vector &internals, vector &outputs) { cobj->run(inputs, outputs, internals); return make_tuple(move(outputs),move(internals)); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Layer_cv_dnn_Layer_outputNameToIndex", [](cv::Ptr &cobj, string &outputName) { auto retval = cobj->outputNameToIndex(outputName); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_Net", []() { return jlcxx::create(); }); + + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_empty", [](cv::dnn::Net &cobj) { auto retval = cobj.empty(); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_dump", [](cv::dnn::Net &cobj) { auto retval = cobj.dump(); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_dumpToFile", [](cv::dnn::Net &cobj, string &path) { cobj.dumpToFile(path); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayerId", [](cv::dnn::Net &cobj, string &layer) { auto retval = cobj.getLayerId(layer); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayerNames", [](cv::dnn::Net &cobj) { auto retval = cobj.getLayerNames(); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayer", [](cv::dnn::Net &cobj, LayerId &layerId) { auto retval = cobj.getLayer(layerId); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_connect", [](cv::dnn::Net &cobj, string &outPin, string &inpPin) { cobj.connect(outPin, inpPin); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setInputsNames", [](cv::dnn::Net &cobj, vector &inputBlobNames) { cobj.setInputsNames(inputBlobNames); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setInputShape", [](cv::dnn::Net &cobj, string &inputName, MatShape &shape) { cobj.setInputShape(inputName, shape); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forward", [](cv::dnn::Net &cobj, string &outputName) { auto retval = cobj.forward(outputName); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forward", [](cv::dnn::Net &cobj, vector &outputBlobs, string &outputName) { cobj.forward(outputBlobs, outputName); return outputBlobs; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forward", [](cv::dnn::Net &cobj, vector &outBlobNames, vector &outputBlobs) { cobj.forward(outputBlobs, outBlobNames); return outputBlobs; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forward", [](cv::dnn::Net &cobj, vector &outBlobNames) {vector> outputBlobs; cobj.forward(outputBlobs, outBlobNames); return outputBlobs; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_forwardAsync", [](cv::dnn::Net &cobj, string &outputName) { auto retval = cobj.forwardAsync(outputName); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setHalideScheduler", [](cv::dnn::Net &cobj, string &scheduler) { cobj.setHalideScheduler(scheduler); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setPreferableBackend", [](cv::dnn::Net &cobj, int &backendId) { cobj.setPreferableBackend(backendId); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setPreferableTarget", [](cv::dnn::Net &cobj, int &targetId) { cobj.setPreferableTarget(targetId); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setInput", [](cv::dnn::Net &cobj, Mat &blob, string &name, double &scalefactor, Scalar &mean) { cobj.setInput(blob, name, scalefactor, mean); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_setParam", [](cv::dnn::Net &cobj, LayerId &layer, int &numParam, Mat &blob) { cobj.setParam(layer, numParam, blob); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getParam", [](cv::dnn::Net &cobj, LayerId &layer, int &numParam) { auto retval = cobj.getParam(layer, numParam); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getUnconnectedOutLayers", [](cv::dnn::Net &cobj) { auto retval = cobj.getUnconnectedOutLayers(); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getUnconnectedOutLayersNames", [](cv::dnn::Net &cobj) { auto retval = cobj.getUnconnectedOutLayersNames(); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayersShapes", [](cv::dnn::Net &cobj, vector &netInputShapes) {vector layersIds;vector> inLayersShapes;vector> outLayersShapes; cobj.getLayersShapes(netInputShapes, layersIds, inLayersShapes, outLayersShapes); return make_tuple(move(layersIds),move(inLayersShapes),move(outLayersShapes)); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayersShapes", [](cv::dnn::Net &cobj, MatShape &netInputShape) {vector layersIds;vector> inLayersShapes;vector> outLayersShapes; cobj.getLayersShapes(netInputShape, layersIds, inLayersShapes, outLayersShapes); return make_tuple(move(layersIds),move(inLayersShapes),move(outLayersShapes)); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getFLOPS", [](cv::dnn::Net &cobj, vector &netInputShapes) { auto retval = cobj.getFLOPS(netInputShapes); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getFLOPS", [](cv::dnn::Net &cobj, MatShape &netInputShape) { auto retval = cobj.getFLOPS(netInputShape); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getFLOPS", [](cv::dnn::Net &cobj, int &layerId, vector &netInputShapes) { auto retval = cobj.getFLOPS(layerId, netInputShapes); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getFLOPS", [](cv::dnn::Net &cobj, int &layerId, MatShape &netInputShape) { auto retval = cobj.getFLOPS(layerId, netInputShape); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayerTypes", [](cv::dnn::Net &cobj) {vector layersTypes; cobj.getLayerTypes(layersTypes); return layersTypes; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getLayersCount", [](cv::dnn::Net &cobj, string &layerType) { auto retval = cobj.getLayersCount(layerType); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getMemoryConsumption", [](cv::dnn::Net &cobj, MatShape &netInputShape) {size_t weights;size_t blobs; cobj.getMemoryConsumption(netInputShape, weights, blobs); return make_tuple(move(weights),move(blobs)); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getMemoryConsumption", [](cv::dnn::Net &cobj, int &layerId, vector &netInputShapes) {size_t weights;size_t blobs; cobj.getMemoryConsumption(layerId, netInputShapes, weights, blobs); return make_tuple(move(weights),move(blobs)); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getMemoryConsumption", [](cv::dnn::Net &cobj, int &layerId, MatShape &netInputShape) {size_t weights;size_t blobs; cobj.getMemoryConsumption(layerId, netInputShape, weights, blobs); return make_tuple(move(weights),move(blobs)); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_enableFusion", [](cv::dnn::Net &cobj, bool &fusion) { cobj.enableFusion(fusion); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_cv_dnn_Net_getPerfProfile", [](cv::dnn::Net &cobj) {vector timings; auto retval = cobj.getPerfProfile(timings); return make_tuple(move(retval),move(timings)); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_Model", [](string &model, string &config) { return jlcxx::create(model, config); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_Model", [](Net &network) { return jlcxx::create(network); }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputSize", [](cv::dnn::Model &cobj, Size &size) { auto retval = cobj.setInputSize(size); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputSize", [](cv::dnn::Model &cobj, int &width, int &height) { auto retval = cobj.setInputSize(width, height); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputMean", [](cv::dnn::Model &cobj, Scalar &mean) { auto retval = cobj.setInputMean(mean); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputScale", [](cv::dnn::Model &cobj, double &scale) { auto retval = cobj.setInputScale(scale); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputCrop", [](cv::dnn::Model &cobj, bool &crop) { auto retval = cobj.setInputCrop(crop); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputSwapRB", [](cv::dnn::Model &cobj, bool &swapRB) { auto retval = cobj.setInputSwapRB(swapRB); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_setInputParams", [](cv::dnn::Model &cobj, double &scale, Size &size, Scalar &mean, bool &swapRB, bool &crop) { cobj.setInputParams(scale, size, mean, swapRB, crop); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Model_cv_dnn_Model_predict", [](cv::dnn::Model &cobj, Mat &frame, vector &outs) { cobj.predict(frame, outs); return outs; }); + mod.method("jlopencv_cv_dnn_cv_dnn_ClassificationModel_cv_dnn_ClassificationModel_ClassificationModel", [](string &model, string &config) { return jlcxx::create(model, config); }); + mod.method("jlopencv_cv_dnn_cv_dnn_ClassificationModel_cv_dnn_ClassificationModel_ClassificationModel", [](Net &network) { return jlcxx::create(network); }); + + mod.method("jlopencv_cv_dnn_cv_dnn_ClassificationModel_cv_dnn_ClassificationModel_classify", [](cv::dnn::ClassificationModel &cobj, Mat &frame) {int classId;float conf; cobj.classify(frame, classId, conf); return make_tuple(move(classId),move(conf)); }); + mod.method("jlopencv_cv_dnn_cv_dnn_KeypointsModel_cv_dnn_KeypointsModel_KeypointsModel", [](string &model, string &config) { return jlcxx::create(model, config); }); + mod.method("jlopencv_cv_dnn_cv_dnn_KeypointsModel_cv_dnn_KeypointsModel_KeypointsModel", [](Net &network) { return jlcxx::create(network); }); + + mod.method("jlopencv_cv_dnn_cv_dnn_KeypointsModel_cv_dnn_KeypointsModel_estimate", [](cv::dnn::KeypointsModel &cobj, Mat &frame, float &thresh) { auto retval = cobj.estimate(frame, thresh); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_SegmentationModel_cv_dnn_SegmentationModel_SegmentationModel", [](string &model, string &config) { return jlcxx::create(model, config); }); + mod.method("jlopencv_cv_dnn_cv_dnn_SegmentationModel_cv_dnn_SegmentationModel_SegmentationModel", [](Net &network) { return jlcxx::create(network); }); + + mod.method("jlopencv_cv_dnn_cv_dnn_SegmentationModel_cv_dnn_SegmentationModel_segment", [](cv::dnn::SegmentationModel &cobj, Mat &frame, Mat &mask) { cobj.segment(frame, mask); return mask; }); + mod.method("jlopencv_cv_dnn_cv_dnn_DetectionModel_cv_dnn_DetectionModel_DetectionModel", [](string &model, string &config) { return jlcxx::create(model, config); }); + mod.method("jlopencv_cv_dnn_cv_dnn_DetectionModel_cv_dnn_DetectionModel_DetectionModel", [](Net &network) { return jlcxx::create(network); }); + + mod.method("jlopencv_cv_dnn_cv_dnn_DetectionModel_cv_dnn_DetectionModel_detect", [](cv::dnn::DetectionModel &cobj, Mat &frame, float &confThreshold, float &nmsThreshold) {vector classIds;vector confidences;vector boxes; cobj.detect(frame, classIds, confidences, boxes, confThreshold, nmsThreshold); return make_tuple(move(classIds),move(confidences),move(boxes)); }); + + // Fix later int-enum auto conversion + // mod.method("jlopencv_cv_dnn_cv_dnn_getAvailableTargets", [](dnn_Backend &be) { auto retval = cv::dnn::getAvailableTargets(be); return retval; }); + + mod.method("jlopencv_cv_dnn_cv_dnn_Net_readFromModelOptimizer", [](string &xml, string &bin) { auto retval = cv::dnn::Net::readFromModelOptimizer(xml, bin); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_Net_readFromModelOptimizer", [](vector &bufferModelConfig, vector &bufferWeights) { auto retval = cv::dnn::Net::readFromModelOptimizer(bufferModelConfig, bufferWeights); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromDarknet", [](string &cfgFile, string &darknetModel) { auto retval = cv::dnn::readNetFromDarknet(cfgFile, darknetModel); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromDarknet", [](vector &bufferCfg, vector &bufferModel) { auto retval = cv::dnn::readNetFromDarknet(bufferCfg, bufferModel); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromCaffe", [](string &prototxt, string &caffeModel) { auto retval = cv::dnn::readNetFromCaffe(prototxt, caffeModel); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromCaffe", [](vector &bufferProto, vector &bufferModel) { auto retval = cv::dnn::readNetFromCaffe(bufferProto, bufferModel); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromTensorflow", [](string &model, string &config) { auto retval = cv::dnn::readNetFromTensorflow(model, config); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromTensorflow", [](vector &bufferModel, vector &bufferConfig) { auto retval = cv::dnn::readNetFromTensorflow(bufferModel, bufferConfig); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromTorch", [](string &model, bool &isBinary, bool &evaluate) { auto retval = cv::dnn::readNetFromTorch(model, isBinary, evaluate); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNet", [](string &model, string &config, string &framework) { auto retval = cv::dnn::readNet(model, config, framework); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNet", [](string &framework, vector &bufferModel, vector &bufferConfig) { auto retval = cv::dnn::readNet(framework, bufferModel, bufferConfig); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readTorchBlob", [](string &filename, bool &isBinary) { auto retval = cv::dnn::readTorchBlob(filename, isBinary); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromModelOptimizer", [](string &xml, string &bin) { auto retval = cv::dnn::readNetFromModelOptimizer(xml, bin); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromModelOptimizer", [](vector &bufferModelConfig, vector &bufferWeights) { auto retval = cv::dnn::readNetFromModelOptimizer(bufferModelConfig, bufferWeights); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromONNX", [](string &onnxFile) { auto retval = cv::dnn::readNetFromONNX(onnxFile); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readNetFromONNX", [](vector &buffer) { auto retval = cv::dnn::readNetFromONNX(buffer); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_readTensorFromONNX", [](string &path) { auto retval = cv::dnn::readTensorFromONNX(path); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_blobFromImage", [](Mat &image, double &scalefactor, Size &size, Scalar &mean, bool &swapRB, bool &crop, int &ddepth) { auto retval = cv::dnn::blobFromImage(image, scalefactor, size, mean, swapRB, crop, ddepth); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_blobFromImages", [](vector &images, double &scalefactor, Size &size, Scalar &mean, bool &swapRB, bool &crop, int &ddepth) { auto retval = cv::dnn::blobFromImages(images, scalefactor, size, mean, swapRB, crop, ddepth); return retval; }); + mod.method("jlopencv_cv_dnn_cv_dnn_imagesFromBlob", [](Mat &blob_, vector &images_) { cv::dnn::imagesFromBlob(blob_, images_); return images_; }); + mod.method("jlopencv_cv_dnn_cv_dnn_shrinkCaffeModel", [](string &src, string &dst, vector &layersTypes) { cv::dnn::shrinkCaffeModel(src, dst, layersTypes); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_writeTextGraph", [](string &model, string &output) { cv::dnn::writeTextGraph(model, output); ; }); + mod.method("jlopencv_cv_dnn_cv_dnn_NMSBoxes", [](vector &bboxes, vector &scores, float &score_threshold, float &nms_threshold, float &eta, int &top_k) {vector indices; cv::dnn::NMSBoxes(bboxes, scores, score_threshold, nms_threshold, indices, eta, top_k); return indices; }); + mod.method("jlopencv_cv_dnn_cv_dnn_NMSBoxes", [](vector &bboxes, vector &scores, float &score_threshold, float &nms_threshold, float &eta, int &top_k) {vector indices; cv::dnn::NMSBoxes(bboxes, scores, score_threshold, nms_threshold, indices, eta, top_k); return indices; }); + mod.set_const("DNN_BACKEND_CUDA", (int)cv::dnn::DNN_BACKEND_CUDA); + mod.set_const("DNN_BACKEND_DEFAULT", (int)cv::dnn::DNN_BACKEND_DEFAULT); + mod.set_const("DNN_BACKEND_HALIDE", (int)cv::dnn::DNN_BACKEND_HALIDE); + mod.set_const("DNN_BACKEND_INFERENCE_ENGINE", (int)cv::dnn::DNN_BACKEND_INFERENCE_ENGINE); + mod.set_const("DNN_BACKEND_OPENCV", (int)cv::dnn::DNN_BACKEND_OPENCV); + mod.set_const("DNN_BACKEND_VKCOM", (int)cv::dnn::DNN_BACKEND_VKCOM); + mod.set_const("DNN_TARGET_CPU", (int)cv::dnn::DNN_TARGET_CPU); + mod.set_const("DNN_TARGET_CUDA", (int)cv::dnn::DNN_TARGET_CUDA); + mod.set_const("DNN_TARGET_CUDA_FP16", (int)cv::dnn::DNN_TARGET_CUDA_FP16); + mod.set_const("DNN_TARGET_FPGA", (int)cv::dnn::DNN_TARGET_FPGA); + mod.set_const("DNN_TARGET_MYRIAD", (int)cv::dnn::DNN_TARGET_MYRIAD); + mod.set_const("DNN_TARGET_OPENCL", (int)cv::dnn::DNN_TARGET_OPENCL); + mod.set_const("DNN_TARGET_OPENCL_FP16", (int)cv::dnn::DNN_TARGET_OPENCL_FP16); + mod.set_const("DNN_TARGET_VULKAN", (int)cv::dnn::DNN_TARGET_VULKAN); + +// Hack for more complex default parameters + mod.method("stdggvectoriStringkOP", [](){return std::vector();}); + mod.method("stdggvectoriucharkOP", [](){return std::vector();}); + mod.method("SizeOP", [](){return Size();}); } diff --git a/modules/julia/src/jlcv2.hpp b/modules/julia/src/jlcv2.hpp index f6051f8c9..f029d0933 100644 --- a/modules/julia/src/jlcv2.hpp +++ b/modules/julia/src/jlcv2.hpp @@ -50,6 +50,12 @@ typedef cv::flann::IndexParams flann_IndexParams; typedef cv::flann::SearchParams flann_SearchParams; #endif + +#ifdef HAVE_OPENCV_DNN +typedef cv::dnn::DictValue LayerId; +typedef cv::dnn::Backend dnn_Backend; +#endif + using namespace cv; using namespace std; using namespace jlcxx; @@ -86,4 +92,6 @@ struct force_enum_int{ using Type = typename force_enum::value>::Type; }; +typedef std::vector vector_Mat; + #include "jlcv2_types.hpp" diff --git a/modules/julia/test/CMakeLists.txt b/modules/julia/test/CMakeLists.txt index 5d36a8f25..3c0d8f505 100644 --- a/modules/julia/test/CMakeLists.txt +++ b/modules/julia/test/CMakeLists.txt @@ -5,10 +5,12 @@ file(REMOVE ${JULIA_TEST_PROXY}) # call the python executable to generate the julia gateways add_custom_command( OUTPUT ${JULIA_TEST_PROXY} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/testsuite.jl ${CMAKE_CURRENT_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/test_feature2d.jl ${CMAKE_CURRENT_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/test_objdetect.jl ${CMAKE_CURRENT_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/test_imgproc.jl ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/testsuite.jl ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test_feature2d.jl ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test_objdetect.jl ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test_imgproc.jl ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test_mat.jl ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test_dnn.jl ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_COMMAND} -E touch ${JULIA_TEST_PROXY} COMMENT "Building Julia tests" ) diff --git a/modules/julia/test/test_dnn.jl b/modules/julia/test/test_dnn.jl new file mode 100644 index 000000000..42099dcd5 --- /dev/null +++ b/modules/julia/test/test_dnn.jl @@ -0,0 +1,33 @@ +function IOU(boxA, boxB) + xA = max(boxA[1], boxB[1]) + yA = max(boxA[2], boxB[2]) + xB = min(boxA[3], boxB[3]) + yB = min(boxA[4], boxB[4]) + interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1) + boxAArea = (boxA[3] - boxA[1] + 1) * (boxA[4] - boxA[2] + 1) + boxBArea = (boxB[3] - boxB[1] + 1) * (boxB[4] - boxB[2] + 1) + iou = interArea / float(boxAArea + boxBArea - interArea) + return iou +end + +const cv = OpenCV + +net = cv.dnn_DetectionModel(joinpath(ENV["OPENCV_TEST_DATA_PATH"], "dnn", "opencv_face_detector.pbtxt"),joinpath(ENV["OPENCV_TEST_DATA_PATH"], "dnn", "opencv_face_detector_uint8.pb")) +size0 = Int32(300) + +cv.setPreferableTarget(net, cv.DNN_TARGET_CPU) +cv.setInputMean(net, (104, 177, 123)) +cv.setInputScale(net, 1.) +cv.setInputSize(net, size0, size0) + + +img = OpenCV.imread(joinpath(test_dir, "cascadeandhog", "images", "mona-lisa.png")) + +classIds, confidences, boxes = cv.detect(net, img, confThreshold=Float32(0.5)) + +box = (boxes[1].x, boxes[1].y, boxes[1].x+boxes[1].width, boxes[1].y+boxes[1].height) +expected_rect = (185,101,129+185,169+101) + +@test IOU(box, expected_rect) > 0.8 + +print("dnn test passed\n") \ No newline at end of file diff --git a/modules/julia/test/test_mat.jl b/modules/julia/test/test_mat.jl new file mode 100644 index 000000000..bf7567871 --- /dev/null +++ b/modules/julia/test/test_mat.jl @@ -0,0 +1,118 @@ +# This file is adapted from test/abstractarray.jl from Julia. + +# This file is a part of Julia. License is MIT: https://julialang.org/license + +A_abs = rand(5,4,3) +A = OpenCV.Mat(A_abs) +@testset "Bounds checking" begin + @test checkbounds(Bool, A, 1, 1, 1) == true + @test checkbounds(Bool, A, 5, 4, 3) == true + @test checkbounds(Bool, A, 0, 1, 1) == false + @test checkbounds(Bool, A, 1, 0, 1) == false + @test checkbounds(Bool, A, 1, 1, 0) == false + @test checkbounds(Bool, A, 6, 4, 3) == false + @test checkbounds(Bool, A, 5, 5, 3) == false + @test checkbounds(Bool, A, 5, 4, 4) == false + @test checkbounds(Bool, A, 1) == true # linear indexing + @test checkbounds(Bool, A, 60) == true + @test checkbounds(Bool, A, 61) == false + @test checkbounds(Bool, A, 2, 2, 2, 1) == true # extra indices + @test checkbounds(Bool, A, 2, 2, 2, 2) == false + @test checkbounds(Bool, A, 1, 1) == false + @test checkbounds(Bool, A, 1, 12) == false + @test checkbounds(Bool, A, 5, 12) == false + @test checkbounds(Bool, A, 1, 13) == false + @test checkbounds(Bool, A, 6, 12) == false +end + +@testset "single CartesianIndex" begin + @test checkbounds(Bool, A, CartesianIndex((1, 1, 1))) == true + @test checkbounds(Bool, A, CartesianIndex((5, 4, 3))) == true + @test checkbounds(Bool, A, CartesianIndex((0, 1, 1))) == false + @test checkbounds(Bool, A, CartesianIndex((1, 0, 1))) == false + @test checkbounds(Bool, A, CartesianIndex((1, 1, 0))) == false + @test checkbounds(Bool, A, CartesianIndex((6, 4, 3))) == false + @test checkbounds(Bool, A, CartesianIndex((5, 5, 3))) == false + @test checkbounds(Bool, A, CartesianIndex((5, 4, 4))) == false + @test checkbounds(Bool, A, CartesianIndex((1,))) == false + @test checkbounds(Bool, A, CartesianIndex((60,))) == false + @test checkbounds(Bool, A, CartesianIndex((61,))) == false + @test checkbounds(Bool, A, CartesianIndex((2, 2, 2, 1,))) == true + @test checkbounds(Bool, A, CartesianIndex((2, 2, 2, 2,))) == false + @test checkbounds(Bool, A, CartesianIndex((1, 1,))) == false + @test checkbounds(Bool, A, CartesianIndex((1, 12,))) == false + @test checkbounds(Bool, A, CartesianIndex((5, 12,))) == false + @test checkbounds(Bool, A, CartesianIndex((1, 13,))) == false + @test checkbounds(Bool, A, CartesianIndex((6, 12,))) == false +end + +@testset "mix of CartesianIndex and Int" begin + @test checkbounds(Bool, A, CartesianIndex((1,)), 1, CartesianIndex((1,))) == true + @test checkbounds(Bool, A, CartesianIndex((5, 4)), 3) == true + @test checkbounds(Bool, A, CartesianIndex((0, 1)), 1) == false + @test checkbounds(Bool, A, 1, CartesianIndex((0, 1))) == false + @test checkbounds(Bool, A, 1, 1, CartesianIndex((0,))) == false + @test checkbounds(Bool, A, 6, CartesianIndex((4, 3))) == false + @test checkbounds(Bool, A, 5, CartesianIndex((5,)), 3) == false + @test checkbounds(Bool, A, CartesianIndex((5,)), CartesianIndex((4,)), CartesianIndex((4,))) == false +end + +@testset "vector indices" begin + @test checkbounds(Bool, A, 1:5, 1:4, 1:3) == true + @test checkbounds(Bool, A, 0:5, 1:4, 1:3) == false + @test checkbounds(Bool, A, 1:5, 0:4, 1:3) == false + @test checkbounds(Bool, A, 1:5, 1:4, 0:3) == false + @test checkbounds(Bool, A, 1:6, 1:4, 1:3) == false + @test checkbounds(Bool, A, 1:5, 1:5, 1:3) == false + @test checkbounds(Bool, A, 1:5, 1:4, 1:4) == false + @test checkbounds(Bool, A, 1:60) == true + @test checkbounds(Bool, A, 1:61) == false + @test checkbounds(Bool, A, 2, 2, 2, 1:1) == true # extra indices + @test checkbounds(Bool, A, 2, 2, 2, 1:2) == false + @test checkbounds(Bool, A, 1:5, 1:4) == false + @test checkbounds(Bool, A, 1:5, 1:12) == false + @test checkbounds(Bool, A, 1:5, 1:13) == false + @test checkbounds(Bool, A, 1:6, 1:12) == false +end + +@testset "logical" begin + @test checkbounds(Bool, A, trues(5), trues(4), trues(3)) == true + @test checkbounds(Bool, A, trues(6), trues(4), trues(3)) == false + @test checkbounds(Bool, A, trues(5), trues(5), trues(3)) == false + @test checkbounds(Bool, A, trues(5), trues(4), trues(4)) == false + @test checkbounds(Bool, A, trues(60)) == true + @test checkbounds(Bool, A, trues(61)) == false + @test checkbounds(Bool, A, 2, 2, 2, trues(1)) == true # extra indices + @test checkbounds(Bool, A, 2, 2, 2, trues(2)) == false + @test checkbounds(Bool, A, trues(5), trues(12)) == false + @test checkbounds(Bool, A, trues(5), trues(13)) == false + @test checkbounds(Bool, A, trues(6), trues(12)) == false + @test checkbounds(Bool, A, trues(5, 4, 3)) == true + @test checkbounds(Bool, A, trues(5, 4, 2)) == false + @test checkbounds(Bool, A, trues(5, 12)) == false + @test checkbounds(Bool, A, trues(1, 5), trues(1, 4, 1), trues(1, 1, 3)) == false + @test checkbounds(Bool, A, trues(1, 5), trues(1, 4, 1), trues(1, 1, 2)) == false + @test checkbounds(Bool, A, trues(1, 5), trues(1, 5, 1), trues(1, 1, 3)) == false + @test checkbounds(Bool, A, trues(1, 5), :, 2) == false +end + +@testset "array of CartesianIndex" begin + @test checkbounds(Bool, A, [CartesianIndex((1, 1, 1))]) == true + @test checkbounds(Bool, A, [CartesianIndex((5, 4, 3))]) == true + @test checkbounds(Bool, A, [CartesianIndex((0, 1, 1))]) == false + @test checkbounds(Bool, A, [CartesianIndex((1, 0, 1))]) == false + @test checkbounds(Bool, A, [CartesianIndex((1, 1, 0))]) == false + @test checkbounds(Bool, A, [CartesianIndex((6, 4, 3))]) == false + @test checkbounds(Bool, A, [CartesianIndex((5, 5, 3))]) == false + @test checkbounds(Bool, A, [CartesianIndex((5, 4, 4))]) == false + @test checkbounds(Bool, A, [CartesianIndex((1, 1))], 1) == true + @test checkbounds(Bool, A, [CartesianIndex((5, 4))], 3) == true + @test checkbounds(Bool, A, [CartesianIndex((0, 1))], 1) == false + @test checkbounds(Bool, A, [CartesianIndex((1, 0))], 1) == false + @test checkbounds(Bool, A, [CartesianIndex((1, 1))], 0) == false + @test checkbounds(Bool, A, [CartesianIndex((6, 4))], 3) == false + @test checkbounds(Bool, A, [CartesianIndex((5, 5))], 3) == false + @test checkbounds(Bool, A, [CartesianIndex((5, 4))], 4) == false +end + +println("OpenCV.Mat tests passed") \ No newline at end of file diff --git a/modules/julia/test/testsuite.jl b/modules/julia/test/testsuite.jl index e92d2d9be..d25775b95 100644 --- a/modules/julia/test/testsuite.jl +++ b/modules/julia/test/testsuite.jl @@ -6,8 +6,10 @@ using Test test_dir = joinpath(ENV["OPENCV_TEST_DATA_PATH"], "cv") +include("test_mat.jl") include("test_feature2d.jl") include("test_imgproc.jl") include("test_objdetect.jl") +include("test_dnn.jl") exit(0)