【问题标题】:Cannot implicitly convert 'byte[*,*]' to 'byte[*,*,*] '无法将 'byte[*,*]' 隐式转换为 'byte[*,*,*]'
【发布时间】:2018-09-05 21:26:59
【问题描述】:

我正在尝试访问我的图像的像素数据。我想知道每个像素的 BGR 或 HSV 值。我必须弄清楚什么价值观最有效。现在我被困在访问像素数据上。

首先我尝试将我的图像转换为正确的格式。我在文档中读到使用新的 Emgu 我需要这样做。然后我想以某种方式访问​​像素数据,这样我就可以过滤掉白色像素,只查看颜色较深的像素。然后我想确定那个较暗的颜色是什么颜色,并使用该值来估计另一个函数的色调的上下阈值。但这都是以后的事情了。首先,我需要能够正确访问像素数据,但这会出错。这对我来说是新的,所以我希望有人能告诉我我犯的错误,以便我了解更多!

这是我的代码

Image<Bgr, Byte> img = imgOriginal.ToImage<Bgr, Byte>();
Matrix<Byte> matrix = new Matrix<Byte>(imgOriginal.Rows, imgOriginal.Cols, imgOriginal.NumberOfChannels);
imgOriginal.CopyTo(matrix);

byte[,,] data = matrix.Data;

for (int i = matrix.Rows - 1; i >= 0; i--)
{
    for (int j = matrix.Cols - 1; j >= 0; j--)
    {
        Byte B = data[i, j, 0];
        Byte G = data[i, j, 1];
        Byte R = data[i, j, 2];
    }
}

我得到的错误如下

Cannot implicitly convert 'byte[*,*]' to 'byte[*,*,*] '

如果有人能进一步帮助我,那就太好了!

编辑

这里没有错误了。不过,我现在不知道如何访问我的单独数据。

        Image<Bgr, Byte> img = imgOriginal.ToImage<Bgr, Byte>();
        Matrix<Byte> matrix = new Matrix<Byte>(imgOriginal.Rows, imgOriginal.Cols);
        imgOriginal.CopyTo(matrix);

        byte[,] data = matrix.Data;

        for (int i = matrix.Rows - 1; i >= 0; i--)
        {
            for (int j = matrix.Cols - 1; j >= 0; j--)
            {
                Byte B = data[i, j];
                Byte G = data[i, j];
                Byte R = data[i, j];
            }
        }

【问题讨论】:

  • 该消息非常不言自明:matrix.Data 是一个二维数组,您正试图将其视为三维数组。
  • 如果你想访问频道,应该是Matrix&lt;Bgr&gt;。但是我对 OpenCV Matrix 不太了解。
  • 好吧,我认为 'byte[,,]' 意味着它是三维的。我没有看到“matrix.Data”是二维的,因为我输入了三个值,对吗?
  • 你最近见过 3D 矩阵吗?
  • 我已将Matrix&lt;Byte&gt; 更改为Matrix&lt;Bgr&gt;。它仍然给出同样的错误。没有额外的错误。我还应该如何创建矩阵?

标签: c# visual-studio opencv emgucv


【解决方案1】:

最后我需要做的就是将我的Mat 图像转换为Image&lt;,&gt; 图像。 然后我能够分别访问像素并给它们例如另一个值。执行此操作的信息在这里。 http://www.emgu.com/wiki/index.php/Working_with_Images

这里是代码

Image<Bgr, Byte> img = imgTest.ToImage<Bgr, Byte>();

for (int i = img.Rows - 1; i >= 0; i--)
{
    for (int j = img.Cols - 1; j >= 0; j--)
    {
        if (img.Data[i, j, 0] <= 100)
        {
            img.Data[i, j, 0] = 255;
        }
    }
}

【讨论】:

    【解决方案2】:

    我刚刚从https://github.com/emgucv/emgucv 下载并评估了 EmguCV 源代码。

    矩阵的数据定义为

    public TDepth[,] Data 
    {
        get ...
        set ...
    }
    

    这基本上意味着您正在尝试将二维值分配给三维变量,这就是您收到错误的原因。

    我唯一可以建议您进一步推进的事情是阅读 EmguCV 文档以了解如何使用它们的数据结构。

    【讨论】:

    • 好的,谢谢。我明天会调查一下,因为我需要去上课..耶。明天我会回来的!
    猜你喜欢
    • 2021-12-02
    • 2019-05-15
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2011-06-08
    • 2020-07-03
    • 2021-08-26
    • 2014-07-21
    相关资源
    最近更新 更多