Я использую 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):
Это также не очень хорошо, потому что, как вы можете видеть, разрушенная часть многоугольника имеет вид «окаймленный» или «обрамленный» черным цветом (даже если многоугольник другого цвета) — что может решить это?
Нашел это!
я добавил warpPerspective
в transformedScene
с интерполяцией «ближайший сосед»:
cv::warpPerspective(transformedScene, transformedScene, warpImageMat, outputFrame.size(), CV_INTER_NN);
где warpImageMat
это тип cv::Mat
Читать Вот больше о warpPerspective
функция OpenCV
Ура!