这个解决方案
https://dev59.com/ZVwY5IYBdhLWcg3wwqA5#32559496是针对用户Quergo所要求的三个颜色通道的。
首先,很好的答案,帮了我很多忙。但我不明白这种方法如何处理多个通道。在你的示例中,你写了var mat = new Mat(3, 3, DepthType.Cv64F, 3);难道它不应该返回一个大小为3的double[],其中包含每个通道的值吗?- Quergo Nov 18 '19 at 22:30
public static class MatExtension
{
public static dynamic GetValues(this Mat mat, int row, int col)
{
var value = CreateElement3Channels(mat.Depth);
Marshal.Copy(mat.DataPointer + (row * mat.Cols + col) * mat.ElementSize, value, 0, 3);
return value;
}
public static dynamic GetValue(this Mat mat, int channel, int row, int col)
{
var value = CreateElement3Channels(mat.Depth);
Marshal.Copy(mat.DataPointer + (row * mat.Cols + col) * mat.ElementSize, value, 0, 3);
return value[channel];
}
public static dynamic GetValue(this Mat mat, int row, int col)
{
var value = CreateElement(mat.Depth);
Marshal.Copy(mat.DataPointer + (row * mat.Cols + col) * mat.ElementSize, value, 0, 1);
return value[0];
}
public static void SetValues(this Mat mat, int row, int col, dynamic value)
{
Marshal.Copy(value, 0, mat.DataPointer + (row * mat.Cols + col) * mat.ElementSize, 3);
}
public static void SetValue(this Mat mat, int channel, int row, int col, dynamic value)
{
var element = GetValues(mat, row, col);
var target = CreateElement(element, value, channel);
Marshal.Copy(target, 0, mat.DataPointer + (row * mat.Cols + col) * mat.ElementSize, 3);
}
public static void SetValue(this Mat mat, int row, int col, dynamic value)
{
var target = CreateElement(mat.Depth, value);
Marshal.Copy(target, 0, mat.DataPointer + (row * mat.Cols + col) * mat.ElementSize, 1);
}
private static dynamic CreateElement(dynamic element, dynamic value, int channel)
{
element[channel] = value;
return element;
}
private static dynamic CreateElement(DepthType depthType, dynamic value)
{
var element = CreateElement(depthType);
element[0] = value;
return element;
}
private static dynamic CreateElement3Channels(DepthType depthType)
{
if (depthType == DepthType.Cv8S)
{
return new sbyte[3];
}
if (depthType == DepthType.Cv8U)
{
return new byte[3];
}
if (depthType == DepthType.Cv16S)
{
return new short[3];
}
if (depthType == DepthType.Cv16U)
{
return new ushort[3];
}
if (depthType == DepthType.Cv32S)
{
return new int[3];
}
if (depthType == DepthType.Cv32F)
{
return new float[3];
}
if (depthType == DepthType.Cv64F)
{
return new double[3];
}
return new float[3];
}
private static dynamic CreateElement(DepthType depthType)
{
if (depthType == DepthType.Cv8S)
{
return new sbyte[1];
}
if (depthType == DepthType.Cv8U)
{
return new byte[1];
}
if (depthType == DepthType.Cv16S)
{
return new short[1];
}
if (depthType == DepthType.Cv16U)
{
return new ushort[1];
}
if (depthType == DepthType.Cv32S)
{
return new int[1];
}
if (depthType == DepthType.Cv32F)
{
return new float[1];
}
if (depthType == DepthType.Cv64F)
{
return new double[1];
}
return new float[1];
}
}