SharpCV icon indicating copy to clipboard operation
SharpCV copied to clipboard

Cannot convert OpenCvSharp.Mat to NumSharp.NDArray

Open korhun opened this issue 2 years ago • 0 comments

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");
        }

korhun avatar Aug 10 '22 11:08 korhun