我有多个半透明多边形,每个都有RGBA填充颜色。我想使用OpenCV将它们全部绘制在图像上。
多边形可能彼此重叠。我想混合重叠的部分。
我在System::Drawing::Graphics.FillPolygon
中使用.net
尝试了此操作,它的效果与我的预期一致。添加到画布的每个多边形仅影响它所覆盖的区域,并且重叠区域在所有相关多边形之间混合,如下图所示。
但是,我无法在OpenCV中获得这个预期的图像。
首先,我不能简单地使用cv::fillPoly()
或cv::fillConvexPoly
,因为文档说:
当目标图像是4通道时,这些功能不支持Alpha透明度。在这种情况下,颜色[3]被简单地复制到重新绘制的像素。因此,如果要绘制半透明形状,可以将它们绘制在单独的缓冲区中,然后将其与主图像混合。
我不能通过在不同的cv::Mat
上绘制多边形并使用建议here的addWeighted
替代品来混合它们来获得所需的结果。
此处使用的加权因子是每个多边形的加权alpha值,即
weight[i] = alpha[i] / sum(alpha[i])
canvas = sum(weight[i] * polygon[i])
此方法的问题是每个多边形都会影响画布上的所有其他多边形,因为其alpha值用于计算每个多边形的weight
。将新多边形添加到画布时,画布上的所有像素都会更改,而不仅仅是此多边形所覆盖的区域。
关于这个问题的任何想法?
答案 0 :(得分:2)
混合是一个比看起来更复杂的话题。有几种常见的混合策略。有关图片的详细解释可以在QML文档中找到(在“mode”参数下):http://doc.qt.io/qt-5/qml-qtgraphicaleffects-blend.html
创建包含多边形的矩阵后,您必须自己进行混合,就像您已经开始的那样。在您的例程中,您正在使用强度值的自适应标准化。这可以保证不会出现过饱和现象。
如果您希望多边形绘图不会影响图像的整体亮度,则必须放弃标准化。您只需使用最适合您应用的混合策略,并仅对多边形应用加权,而不是源图像。
E.g。 canvas = canvas + 0.2*polygon[i]
(简单补充)
根据您想要使用的策略,您可能需要在混合之前在黑色或白色背景上渲染多边形。