【发布时间】:2015-11-30 10:22:33
【问题描述】:
我有多个半透明多边形,每个都有一个 RGBA 填充颜色。我想使用 OpenCV 将它们全部绘制在图像上。
多边形可能会相互重叠。我想混合重叠的部分。
我已经在.net 中使用System::Drawing::Graphics.FillPolygon 尝试过此操作,并且效果符合我的预期。添加到画布的每个多边形仅影响它所覆盖的区域,重叠区域在所有涉及的多边形之间混合,如下图所示。
但是,我无法在 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。当一个新的多边形被添加到画布上时,画布上的所有像素都会改变,而不仅仅是这个多边形覆盖的区域。
对这个问题有什么想法吗?
【问题讨论】:
标签: c++ opencv image-processing opencv3.0