private void InitializeComponent(MatND <float> matND, RangeF[] ranges)
{
_matND = matND;
MCvMatND cvMatND = _matND.MCvMatND;
Debug.Assert(
ranges.Length == cvMatND.dims,
"incompatible dimension");
_ptr = Marshal.AllocHGlobal(StructSize.MCvHistogram);
#region parse the ranges to appropriate format
GCHandle rangesHandle = GCHandle.Alloc(ranges, GCHandleType.Pinned);
IntPtr[] rangesPts = new IntPtr[ranges.Length];
Int64 address = rangesHandle.AddrOfPinnedObject().ToInt64();
for (int i = 0; i < rangesPts.Length; i++)
{
rangesPts[i] = new IntPtr(address + i * StructSize.RangF);
}
#endregion
CvInvoke.cvMakeHistHeaderForArray(
cvMatND.dims,
Array.ConvertAll <MCvMatND.Dimension, int>(cvMatND.dim, delegate(MCvMatND.Dimension d) {
return(d.Size);
}), //binSizes
_ptr,
_matND.MCvMatND.data,
rangesPts,
1);
rangesHandle.Free();
}