OpenCvSharp Mat.Set не дает ожидаемого результата
Примечание. Эти вопросы касаются 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.Red
в 16711680
(#FF0000 в целое число), и это работает. Это ожидаемое поведение? или ошибка в OpenCvSharp?
Вопрос 2.
почему несколько вертикальных полосовых цветов на правой стороне коробки? Когда я повернулся к красному квадрату, он все еще имеет желтый цвет с правой стороны.
Обветшалая желтая полоска на правой стороне
Вопрос 3
Python может получить доступ к каждому каналу и установить значение (цвет), как показано ниже.
mat.itemset((pixel[1], pixel[0], 2), 255) # Red channel to 255.
Есть ли подобный метод в OpenCvSharp?
1 ответ
Я думаю, что главная проблема в том, что вы пытаетесь установить цвет 3-канального изображения одновременно. Если вы будете следовать коду в URL или фрагменту ниже, я думаю, что на все 3 ваших вопроса ответили.
Я следовал этим инструкциям и не было никаких проблем. https://github.com/shimat/opencvsharp/wiki/%5BCpp%5D-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.