OpenCv覆盖多个Mat部分使用掩码

时间:2017-07-20 16:13:37

标签: c++ opencv mask

您可以采用这种将多边形复制到OpenCv overlay two Mat (drawings not images) with transparency中的其他Mat的明智方法,我需要稍微提高一点。

除了使用多边形复制Mats之外,我还需要将这些多边形复制到图像上。您可以在下面找到我的MWE。

按照上面提到的答案,在这种情况下我加载了一个名为bg的附加图像(以及100x100px)。我认为在inRange上再次使用result给了我mask所有多边形(正在运行)。而不是使用copyTo复制掩码中的所有内容。它复制了“背景图像”中的像素,但将多边形着色为黑色,并以其常规颜色为主。

在这种情况下我忘记考虑的任何想法?

PS:无法将多边形直接绘制到图像上。下面的代码只是一个MWE,在下面的代码中,出于可读性的原因,我省略了一个循环。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main(int argc, char **argv)
{
    cv::Mat bg = imread("bg.png");
    cv::Mat m1(100, 100, CV_8UC4, cv::Scalar(0, 0, 0, 0));


    cv::Mat m2(m1);
    cv::Mat m3(m1);
    cv::Mat m4(m1);

    cv::polylines(m1, std::vector<cv::Point>{cv::Point{ 100, 20 }, cv::Point{ 0, 40 }}, true, cv::Scalar(6, 6, 255, 255));
    cv::polylines(m2, std::vector<cv::Point>{cv::Point{ 100, 100 }, cv::Point{ 0, 0 }}, true, cv::Scalar(192, 112, 0, 255));
    cv::polylines(m3, std::vector<cv::Point>{cv::Point{ 0, 50 }, cv::Point{ 100, 50 }}, true, cv::Scalar(0, 228, 0, 255));
    cv::polylines(m4, std::vector<cv::Point>{cv::Point{ 20, 0 }, cv::Point{ 20, 100 }}, true, cv::Scalar(0, 228, 255, 0 ));


    cv::Mat mask;
    cv::Mat result(m1.clone());


    cv::inRange(m2, cv::Scalar(0, 0, 0, 0), cv::Scalar(0, 0, 0, 0), mask);
    mask = 255 - mask; // invert the mask
    m2.copyTo(result, mask);

    cv::inRange(result, cv::Scalar(0, 0, 0, 0), cv::Scalar(0, 0, 0, 0), mask);
    m3.copyTo(result, mask);

    cv::inRange(result, cv::Scalar(0, 0, 0, 0), cv::Scalar(0, 0, 0, 0), mask);
    m4.copyTo(result, mask);

    cv::inRange(result, cv::Scalar(0, 0, 0, 0), cv::Scalar(0, 0, 0, 0), mask);
    bg.copyTo(result, mask);


    namedWindow("result", cv::WINDOW_AUTOSIZE);
    imshow("result", result);
}

0 个答案:

没有答案