Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot convert OpenCvSharp.Mat to NumSharp.NDArray #25

Open
korhun opened this issue Aug 10, 2022 · 0 comments
Open

Cannot convert OpenCvSharp.Mat to NumSharp.NDArray #25

korhun opened this issue Aug 10, 2022 · 0 comments

Comments

@korhun
Copy link

korhun commented Aug 10, 2022

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");
        }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant