opencv使用遮罩和绘画将一个图像覆盖在另一个图像上

时间:2014-05-17 15:48:55

标签: c++ opencv image-processing image-manipulation image-masking

我正在使用OpenCV在几个多边形上进行绘画(在纸上绘制,参见示例)。

一些传奇规格:

  • 绿框用于绘制场景“边框”,仅供参考。
  • 蓝色球漂浮在场景上,当球击中多边形时,场景会通过适当的遮蔽重新渲染,就像球正在碾碎物体一样。

以下是供参考的代码,假设inpaintedScenetransformedSceneoutputFramecv::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的结果(+ =):

enter image description here

这对我来说不好,因为我对被破坏的多边形有透明度。

选项2的结果(copyTo):

enter image description here

这也不是很好,因为正如你所看到的,多边形的被破坏的部分是带有黑色的“边框”或“框架”(即使多边形是另一种颜色) - 什么可以解决这个问题? / p>

1 个答案:

答案 0 :(得分:1)

发现它!

我已将warpPerspective添加到transformedScene并使用“最近邻居”插值:

cv::warpPerspective(transformedScene, transformedScene, warpImageMat, outputFrame.size(), CV_INTER_NN);

其中warpImageMat的类型为cv::Mat

详细了解here有关OpenCV的warpPerspective功能

干杯!