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

OpenCvSharp Mat.Set does not give expected result

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

问题一

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

    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.Red 编辑为 16711680(#FF0000 整数)并且它有效。这是预期的行为吗?还是 OpenCvSharp 中的错误?

问题二

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

右侧有黄色条纹

问题三

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

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

OpenCvSharp中有没有类似的方法?

我认为主要问题是您试图一次设置 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 中像素级访问的三个选项中的两个。