1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
const CV_CN_MAX = 512
const CV_CN_SHIFT = 3
const CV_DEPTH_MAX = (1 << CV_CN_SHIFT)
const CV_8U = 0
const CV_8S = 1
const CV_16U = 2
const CV_16S = 3
const CV_32S = 4
const CV_32F = 5
const CV_64F = 6
const CV_MAT_DEPTH_MASK = (CV_DEPTH_MAX - 1)
CV_MAT_DEPTH(flags) = ((flags) & CV_MAT_DEPTH_MASK)
CV_MAKETYPE(depth,cn) = (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
CV_MAKE_TYPE = CV_MAKETYPE
function cpp_to_julia(mat::CxxMat)
rets = jlopencv_core_Mat_mutable_data(mat)
if rets[2] == CV_MAKE_TYPE(CV_8U, rets[3])
dtype = UInt8
elseif rets[2]==CV_MAKE_TYPE(CV_8S, rets[3])
dtype = Int8
elseif rets[2]==CV_MAKE_TYPE(CV_16U, rets[3])
dtype = UInt16
elseif rets[2]==CV_MAKE_TYPE(CV_16S, rets[3])
dtype = Int16
elseif rets[2]==CV_MAKE_TYPE(CV_32S, rets[3])
dtype = Int32
elseif rets[2]==CV_MAKE_TYPE(CV_32F, rets[3])
dtype = Float32
elseif rets[2]==CV_MAKE_TYPE(CV_64F, rets[3])
dtype = Float64
else
error("Bad type returned from OpenCV")
end
steps = [rets[6]/sizeof(dtype), rets[7]/sizeof(dtype)]
# println(steps[1]/rets[3], steps[2]/rets[3]/rets[4])
#TODO: Implement views when steps do not result in continous memory
arr = Base.unsafe_wrap(Array{dtype, 3}, Ptr{dtype}(rets[1].cpp_object), (rets[3], rets[4], rets[5]))
#Preserve Mat so that array allocated by C++ isn't deallocated
return Mat{dtype}(mat, arr)
end
function julia_to_cpp(img::InputArray)
if typeof(img) <: CxxMat
return img
end
steps = 0
try
steps = strides(img)
catch
# Copy array since array is not strided
img = img[:, :, :]
steps = strides(img)
end
if steps[1] <= steps[2] <= steps[3] && steps[1]==1
steps_a = Array{size_t, 1}()
ndims_a = Array{Int32, 1}()
sz = sizeof(eltype(img))
push!(steps_a, UInt64(steps[3]*sz))
push!(steps_a, UInt64(steps[2]*sz))
push!(steps_a, UInt64(steps[1]*sz))
push!(ndims_a, Int32(size(img)[3]))
push!(ndims_a, Int32(size(img)[2]))
if eltype(img) == UInt8
return CxxMat(2, pointer(ndims_a), CV_MAKE_TYPE(CV_8U, size(img)[1]), Ptr{Nothing}(pointer(img)), pointer(steps_a))
elseif eltype(img) == UInt16
return CxxMat(2, pointer(ndims_a), CV_MAKE_TYPE(CV_16U, size(img)[1]), Ptr{Nothing}(pointer(img)), pointer(steps_a))
elseif eltype(img) == Int8
return CxxMat(2, pointer(ndims_a), CV_MAKE_TYPE(CV_8S, size(img)[1]), Ptr{Nothing}(pointer(img)), pointer(steps_a))
elseif eltype(img) == Int16
return CxxMat(2, pointer(ndims_a), CV_MAKE_TYPE(CV_16S, size(img)[1]), Ptr{Nothing}(pointer(img)), pointer(steps_a))
elseif eltype(img) == Int32
return CxxMat(2, pointer(ndims_a), CV_MAKE_TYPE(CV_32S, size(img)[1]), Ptr{Nothing}(pointer(img)), pointer(steps_a))
elseif eltype(img) == Float32
return CxxMat(2, pointer(ndims_a), CV_MAKE_TYPE(CV_32F, size(img)[1]), Ptr{Nothing}(pointer(img)), pointer(steps_a))
elseif eltype(img) == Float64
return CxxMat(2, pointer(ndims_a), CV_MAKE_TYPE(CV_64F, size(img)[1]), Ptr{Nothing}(pointer(img)), pointer(steps_a))
end
else
# Copy array, invalid config
return julia_to_cpp(img[:, :, :])
end
end
function julia_to_cpp(var::Array{T, 1}) where {T <: InputArray}
ret = CxxWrap.StdVector{CxxMat}()
for x in var
push!(ret, julia_to_cpp(x))
end
return ret
end
function cpp_to_julia(var::CxxWrap.StdVector{T}) where {T <: CxxMat}
ret = Array{Mat, 1}()
for x in var
push!(ret, cpp_to_julia(x))
end
return ret
end
|