SharpCV
SharpCV copied to clipboard
Cannot convert OpenCvSharp.Mat to NumSharp.NDArray
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");
}