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 中像素级访问的三个选项中的两个。
注意:这些问题是关于 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 中像素级访问的三个选项中的两个。