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.

Другие вопросы по тегам