我正在使用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):
这也不是很好,因为正如你所看到的,多边形的被破坏的部分是带有黑色的“边框”或“框架”(即使多边形是另一种颜色) - 什么可以解决这个问题? / p>
答案 0 :(得分:1)
发现它!
我已将warpPerspective
添加到transformedScene
并使用“最近邻居”插值:
cv::warpPerspective(transformedScene, transformedScene, warpImageMat, outputFrame.size(), CV_INTER_NN);
其中warpImageMat
的类型为cv::Mat
详细了解here有关OpenCV的warpPerspective
功能
干杯!