1

我在托管代码中遇到了访问冲突异常。直方图指针不为空,一切似乎都很好。从http://www.emgu.com/forum/viewtopic.php?f=8&t=59获得了创建 IntPtr 的示例

// initializing data
var random = new Random();
var array = new double[1000];
for (int i = 0; i < 1000; i++)
{
    array[i] = random.NextDouble();
}
var arrayPtr = GetDataPtr(array);

//initializing ranges array
double[] rangesArray = { 0, 1 };
var rangesArrayPtr = GetRangesArrayPtr(rangesArray);
//creating and querying histogram
var histogramStructure = CvInvoke.cvCreateHist(1, new[] {20}, HIST_TYPE.CV_HIST_ARRAY, rangesArrayPtr, true);
var histogram = CvInvoke.cvMakeHistHeaderForArray(1, new[] { 20 }, histogramStructure, arrayPtr, rangesArrayPtr, 1);
CvInvoke.cvNormalizeHist(histogram, 1.0);
CvInvoke.cvQueryHistValue_1D(histogram, 0); // getting exception here

帮助方法

private static IntPtr[] GetRangesArrayPtr(double[] array)
{
    var ranges = new IntPtr[1];
    ranges[0] = Marshal.AllocHGlobal(array.Length * sizeof(double));
    Marshal.Copy(array, 0, ranges[0], array.Length);
    return ranges;
}
private static IntPtr GetDataPtr(double[] array)
{
    var ranges = new IntPtr();
    ranges = Marshal.AllocHGlobal(array.Length * sizeof(double));
    Marshal.Copy(array, 0, ranges,array.Length);
    return ranges;
}
4

1 回答 1

0

我在最近的一个项目中遇到了同样的问题,并通过将直方图值复制到一个新数组中来解决它。

Double[] histtemp = new double[255];

Histogram.MatND.ManagedArray.CopyTo(histtemp,0);

现在您可以访问 histt​​emp 中的直方图值。希望对以后的观众有所帮助。

于 2015-04-20T12:19:03.880 回答