using Emgu.CV;
using Emgu.CV.Structure;
Mat B = new Mat(3, 1, Emgu.CV.CvEnum.DepthType.Cv64F, 1);
Matrix作为Emgu3.0版本后取代Mat的类,它具有很多实用的矩阵方法,包括获取和设置矩阵元素值。
//
// 摘要:
// Get or Set the data for this matrix
public TDepth[,] Data { get; set; }
可以用Matrix创建掩膜
Matrix mask = new Matrix(3, 1);
mask.Data[0, 0] = 1;
B.SetTo(new MCvScalar(4), mask);
mask = new Matrix(3, 1);
mask.Data[1, 0] = 1;
B.SetTo(new MCvScalar(8), mask);
mask = new Matrix(3, 1);
mask.Data[2, 0] = 1;
B.SetTo(new MCvScalar(32), mask);
其实这里只是通过掩膜设置了B的元素值,我还没有找到直接读取元素值的方法,但是通过观察B的结构,我发现它的数据以byte[]方式保存,而且Mat类有一个获取数据首地址的方法,所以可以考虑操作内存修改/获取Mat元素值。
using System.Runtime.InteropServices;
using Emgu.CV;
using Emgu.CV.CvEnum;
namespace _01_MatExtension
{
///
/// 通过指针操作内存,修改or获取Mat元素值
///
public static class MatExtension
{
///
/// 获取Mat的元素值
///
/// 需操作的Mat
/// 元素行
/// 元素列
///
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];
}
///
/// 修改Mat的元素值
///
/// 需操作的Mat
/// 元素行
/// 元素列
/// 修改值
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);
}
///
/// 根据Mat的类型,动态解析传入数据的类型
///
///
///
///
private static dynamic CreateElement(DepthType depthType, dynamic value)
{
var element = CreateElement(depthType);
element[0] = value;
return element;
}
///
/// 获取Mat元素的类型
///
///
///
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];
}
}
}
static void Main(string[] args)
{
Mat m = new Mat(3,1,Emgu.CV.CvEnum.DepthType.Cv64F,1);
MatExtension.SetValue(m, 0, 0, 3.14);
MatExtension.SetValue(m, 1, 0, 2.14);
MatExtension.SetValue(m, 2, 0, 1.14);
Console.WriteLine(MatExtension.GetValue(m,0,0));
Console.WriteLine(MatExtension.GetValue(m,1,0));
Console.WriteLine(MatExtension.GetValue(m,2,0));
Console.ReadKey();
}