Skip to content

Cannot convert OpenCvSharp.Mat to NumSharp.NDArray #25

@korhun

Description

@korhun

This code works fine with SharpCV 0.7.0 but cannot compile with the newer versions:
Cannot implicitly convert type 'Tensorflow.NumPy.NDArray' to 'NumSharp.NDArray'

        public static NumSharp.NDArray _AsNDArray0(this OpenCvSharp.Mat mat)
        {
            return new SharpCV.Mat(mat.CvPtr).GetData();
        }

This is a 10 times slower alternative for the ones who have to use SharpCV > 0.7.0

       public static NumSharp.NDArray AsNDArray_slow(this OpenCvSharp.Mat mat)
        {
            var matType = mat.Type();
            var channels = mat.Channels();
            var size = mat.Rows * mat.Cols * channels;
            var shape = channels == 1 ? new Shape(mat.Rows, mat.Cols) : new Shape(mat.Rows, mat.Cols, channels);
            if (matType == MatType.CV_32SC1 || matType == MatType.CV_32SC2)
            {
                var managedArray = new int[size];
                Marshal.Copy(mat.Data, managedArray, 0, size);
                var aslice = ArraySlice.FromArray(managedArray);
                return new NumSharp.NDArray(aslice, shape);
            }
            if (matType == MatType.CV_32FC1)
            {
                var managedArray = new float[size];
                Marshal.Copy(mat.Data, managedArray, 0, size);
                var aslice = ArraySlice.FromArray(managedArray);
                return new NumSharp.NDArray(aslice, shape);
            }
            if (matType == MatType.CV_64FC1)
            {
                var managedArray = new double[size];
                Marshal.Copy(mat.Data, managedArray, 0, size);
                var aslice = ArraySlice.FromArray(managedArray);
                return new NumSharp.NDArray(aslice, shape);
            }
            if (matType == MatType.CV_8UC1 || matType == MatType.CV_8UC3 || matType == MatType.CV_8UC4)
            {
                var managedArray = new byte[size];
                Marshal.Copy(mat.Data, managedArray, 0, size);
                var aslice = ArraySlice.FromArray(managedArray);
                return new NumSharp.NDArray(aslice, shape);
            }

            throw new Exception($"mat data type = {matType} is not supported");
        }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions