строка доступа к матрице emgu cv и помехи с каналом c # - PullRequest
0 голосов
/ 15 мая 2011

хиии,

как получить доступ к матрице с указанной строкой, столбцом и каналом

 Matrix<double> tensor = new Matrix<double>(yMax + 1, xMax, 4); //4 channels
       CvInvoke.cvZero(tensor );
        //cvZero( dot );
        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 another channels ??
            tensor.Data[y[k], x[k] + 1]= gx * gy; ////how can i access another channels ??
            tensor.Data[y[k], x[k] + 2] = gx * gy; ////how can i access another channels ??
            tensor.Data[y[k], x[k] + 3] = gy * gy; ////how can i access another channels ??

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Я думаю, вы должны взглянуть на метод Split () , а затем зациклить массив каналов.

0 голосов
/ 14 января 2016

Вот пример получения значения пикселей из двух отдельных каналов 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]);
        }
    }
}
...