0

如何访问具有指定行、列和通道的矩阵?

Matrix<double> tensor = new Matrix<double>(yMax + 1, xMax, 4); //4 channels
CvInvoke.cvZero(tensor);
for(int k  = 0; k<x.Count; ++k)
{
    double gx = Math.Cos(angle[k] * Math.PI / 180 + 90 * Math.PI / 180 + Math.PI);
    double gy = Math.Sin(angle[k] * Math.PI / 180 + 90 * Math.PI / 180 + Math.PI);
    tensor[y[k], x[k]] = gx * gx; //How can I access other channels?
    tensor.Data[y[k], x[k] + 1] = gx * gy; //How can I access other channels?
    tensor.Data[y[k], x[k] + 2] = gx * gy; //How can I access other channels?
    tensor.Data[y[k], x[k] + 3] = gy * gy; //How can I access other channels?
}
4

2 回答 2

3

我认为您应该看一下Split()方法,然后在通道数组上循环。

于 2011-05-17T22:03:38.900 回答
0

下面是从 的两个单独通道获取像素值的示例Mat

var flowResult = new Mat();
CvInvoke.CalcOpticalFlowFarneback(_scaledDownFrameOneColorImagePrev, scaledDownFrameOneColorImage, flowResult, 0.25, 3, 15, 5, 1, 1.2, OpticalflowFarnebackFlag.Default);

var flowResultChannels = flowResult.Split();
var flowResultX = flowResultChannels[0];
var flowResultY = flowResultChannels[1];

for (var r = 0; r < flowResult.Rows; r++)
{
    for (var c = 0; c < flowResult.Cols; c++)
    {
        var xValue = new float[1];
        Marshal.Copy(flowResultX.DataPointer + (((r * flowResultX.Cols) + c) * flowResultX.ElementSize), xValue, 0, 1);

        var yValue = new float[1];
        Marshal.Copy(flowResultY.DataPointer + (((r * flowResultY.Cols) + c) * flowResultY.ElementSize), yValue, 0, 1);

        if (Math.Abs(xValue[0]) > 3 || Math.Abs(yValue[0]) > 3)
        {
            Console.WriteLine("{0} {1}", xValue[0], yValue[0]);
        }
    }
}
于 2016-01-14T10:19:38.620 回答