219 lines
6.2 KiB
C#
219 lines
6.2 KiB
C#
using OpenCVForUnity.CoreModule;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace OpenCVForUnity.UtilsModule
|
|
{
|
|
|
|
public class MatIndexer
|
|
{
|
|
|
|
private readonly Mat parent;
|
|
|
|
private readonly long[] steps;
|
|
|
|
private readonly long ptrVal;
|
|
|
|
public MatIndexer(Mat mat)
|
|
{
|
|
if (mat == null)
|
|
throw new ArgumentNullException("mat");
|
|
if (mat != null)
|
|
mat.ThrowIfDisposed();
|
|
|
|
this.parent = mat;
|
|
|
|
var dims = parent.dims();
|
|
steps = new long[dims];
|
|
for (var i = 0; i < dims; i++)
|
|
{
|
|
steps[i] = parent.step1(i);
|
|
}
|
|
|
|
ptrVal = parent.dataAddr();
|
|
}
|
|
|
|
public void get(int row, int col, byte[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(ptr, data, 0, (int)steps[1]);
|
|
}
|
|
|
|
public void get(int[] idx, byte[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(ptr, data, 0, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
public void get(int row, int col, short[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(ptr, data, 0, (int)steps[1]);
|
|
}
|
|
|
|
public void get(int[] idx, short[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(ptr, data, 0, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
public void get(int row, int col, int[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(ptr, data, 0, (int)steps[1]);
|
|
}
|
|
|
|
public void get(int[] idx, int[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(ptr, data, 0, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
public void get(int row, int col, float[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(ptr, data, 0, (int)steps[1]);
|
|
}
|
|
|
|
public void get(int[] idx, float[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(ptr, data, 0, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
public void get(int row, int col, double[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(ptr, data, 0, (int)steps[1]);
|
|
}
|
|
|
|
public void get(int[] idx, double[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(ptr, data, 0, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
|
|
public void put(int row, int col, byte[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(data, 0, ptr, (int)steps[1]);
|
|
}
|
|
|
|
public void put(int[] idx, byte[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(data, 0, ptr, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
public void put(int row, int col, short[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(data, 0, ptr, (int)steps[1]);
|
|
}
|
|
|
|
public void put(int[] idx, short[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(data, 0, ptr, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
public void put(int row, int col, int[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(data, 0, ptr, (int)steps[1]);
|
|
}
|
|
|
|
public void put(int[] idx, int[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(data, 0, ptr, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
public void put(int row, int col, float[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(data, 0, ptr, (int)steps[1]);
|
|
}
|
|
|
|
public void put(int[] idx, float[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(data, 0, ptr, (int)steps[idx.Length - 1]);
|
|
}
|
|
|
|
public void put(int row, int col, double[] data)
|
|
{
|
|
IntPtr ptr = new IntPtr(ptrVal + (steps[0] * row) + (steps[1] * col));
|
|
Marshal.Copy(data, 0, ptr, (int)steps[1]);
|
|
}
|
|
|
|
public void put(int[] idx, double[] data)
|
|
{
|
|
long offset = 0;
|
|
for (var i = 0; i < idx.Length; i++)
|
|
{
|
|
offset += steps[i] * idx[i];
|
|
}
|
|
|
|
IntPtr ptr = new IntPtr(ptrVal + offset);
|
|
Marshal.Copy(data, 0, ptr, (int)steps[idx.Length - 1]);
|
|
}
|
|
}
|
|
|
|
}
|