У меня есть несколько полупрозрачных полигонов, каждый из которых имеет цвет заливки RGBA. Я хочу нарисовать их на изображении с помощью OpenCV.OpenCV: Как смешивать несколько полупрозрачных полигонов с разными цветами?
Полигоны могут пересекаться друг с другом. И я хочу смешать перекрывающиеся части.
Я пробовал это с System::Drawing::Graphics.FillPolygon
в .net
, и он работал так, как я ожидал. Каждый многоугольник, добавленный к холсту, влияет только на область, которую он покрывает, и перекрывающаяся область смешивается между всеми задействованными многоугольниками, как показано на рисунке ниже.
Однако, я не могу получить это ожидаемое изображение в OpenCV.
Прежде всего, я не могу просто использовать cv::fillPoly()
или cv::fillConvexPoly
, потому что документация говорит:
функция не поддерживает альфа-прозрачность, когда целевое изображение является 4-канальным. В этом случае цвет [3] просто копируется в перекрашенные пиксели. Таким образом, если вы хотите нарисовать полупрозрачные фигуры, вы можете нарисовать их в отдельном буфере, а затем смешать с основным изображением.
тоже не могу получить желаемый результат, построение многоугольников на различных cv::Mat
и смешивая их с помощью addWeighted
альтернативы, как предложил here.
Весовой коэффициент я здесь взвешенное значение альфа для каждого полигона, т.е.
weight[i] = alpha[i]/sum(alpha[i])
canvas = sum(weight[i] * polygon[i])
Проблема этого метода состоит в том, что каждый полигон будет влиять на все другие полигоны на холсте, так как используется его значение альфа при вычислении weight
для каждого многоугольника. Когда к холсту добавляется новый многоугольник, все пиксели на холсте изменяются, а не только область, покрываемая этим полигоном.
Любые идеи по этой проблеме?
http://answers.opencv.org/question/73016 может быть полезно – sturkmen