0

注意:这些问题是关于OpenCVSharp v3.1.20160114。

问题 1。

如下例所示,我希望是红色方块,但结果是带有奇怪颜色条纹的黑色。

    public void TestMethod()
    {
        var mat = new Mat(300, 300, MatType.CV_8UC3, Scalar.White);
        for (int i = 100; i < 200; i++)
            for (int j = 100; j < 200; j++)
                mat.Set(i, j, Scalar.Red);
        Cv2.ImShow("red square", mat);
        Cv2.WaitKey();
    }

结果

在此处输入图像描述

我编辑Scalar.Red16711680(#FF0000 in integer),它可以工作。这是预期的行为吗?还是 OpenCvSharp 中的错误?

问题2。

为什么盒子右侧有多个垂直条纹颜色?当我转向红色方块时,它的右侧仍然是黄色。

右侧奇怪的黄色条带

在此处输入图像描述

问题 3。

Python 可以访问每个通道并设置值(颜色),如下所示。

mat.itemset((pixel[1], pixel[0], 2), 255) # Red channel to 255. 

OpenCvSharp中是否有类似的方法?

4

1 回答 1

2

我认为主要问题是您试图一次设置 3 通道图像的颜色。如果您遵循 URL 中的代码或下面的代码段,我认为您的所有 3 个问题都已得到解答。

我按照这些说明进行操作,没有遇到任何问题。 https://github.com/shimat/opencvsharp/wiki/Accessing-Pixel

//Option1
var mat = new Mat(300, 300, MatType.CV_8UC3, Scalar.White);
for (int i = 100; i < 200; i++)
    for (int j = 100; j < 200; j++)
    {
        Vec3b color = mat.Get<Vec3b>(i, j);
        color.Item0 = 0;
        color.Item1 = 0;
        color.Item2 = 255;
        mat.Set<Vec3b>(i, j, color);
        //mat.Set(i, j, Scalar.Red);
    }
Cv2.ImShow("red square", mat);
Cv2.WaitKey();
}

//Option2
var mat = new Mat(300, 300, MatType.CV_8UC3, Scalar.White);
var indexer = mat.GetGenericIndexer<Vec3b>();
for (int i = 100; i < 200; i++)
    for (int j = 100; j < 200; j++)
    {
        Vec3b color = mat.Get<Vec3b>(i, j);
        color.Item0 = 0;
        color.Item1 = 0;
        color.Item2 = 255;
        indexer[i, j] = color;
    }
Cv2.ImShow("red square", mat);
Cv2.WaitKey();
}

这段代码显示了上面 URL 中三个选项中的两个,该选项在 OpenCvSharp 中记录了像素级访问。

于 2016-03-14T12:48:46.140 回答