123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- 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
|