OpenCvSharp Mat.Set没有给出预期的结果

时间:2016-03-09 07:27:13

标签: python opencv opencvsharp

注意:这些问题与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();
    }

结果

enter image description here

我将Scalar.Red编辑为16711680(整数为#FF0000)并且有效。这是预期的行为吗?或OpenCvSharp中的错误?

问题2。

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

右侧有黄色条纹

enter image description here

问题3。

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

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

OpenCvSharp中是否有类似的方法?

1 个答案:

答案 0 :(得分:0)

我认为主要问题是您尝试一次设置3通道图像的颜色。如果您按照以下网址或代码段中的代码进行操作,我认为您的所有3个问题都已得到解答。

我按照这些说明操作,没有任何问题。 here.

//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中的文档像素级访问。