我正在使用 OpenCV 对几个多边形进行内画(在纸上绘制,参见示例)。
一些传说规格:
- 绿框是用来画场景“边界”的,仅供参考。
- 蓝色球漂浮在场景中,当球撞击多边形时,场景会使用适当的遮罩重新渲染,就好像球正在压碎物体一样。
inpaintedScene
这是一个参考代码,假设transformedScene
和outputFrame
是cv::Mat
:
cv::Mat mask_image(outputFrame.size(), CV_8U, BLACK_COLOR);
std::vector<cv::Point*> destroyedPolygons = //some sub-polygons that has been hit by the ball
std::vector<int> destroyedPolygonsPointCount = //points count for each destroyed polygon
for (int i = 0; i < destroyedPolygons.size(); i++)
{
const cv::Point* ppt[1] = { destroyedPolygons[i] };
int npt[] = { destroyedPolygonsPointCount[i] };
cv::fillPoly(mask_image, ppt, npt, 1, WHITE_COLOR);
}
// now that the mask is prepared, copy the points from the inpainted to the scene
inpaintedScene.copyTo(transformedScene, mask_image);
// here I have two options:
//option 1
outputFrame += transformedScene;
//option 2
transformedScene.copyTo(outputFrame, transformedScene);
这些都是对我没有好处的结果:
选项 1 (+=) 的结果:
这对我不利,因为我在被破坏的多边形上获得了透明度。
选项 2 (copyTo) 的结果:
这也不好,因为正如您所看到的,多边形的被破坏部分是一种黑色的“边框”或“框”(即使多边形是另一种颜色) - 有什么可以解决这个问题?