Opencv - 蒙版图像导致黑色图像

Posted

技术标签:

【中文标题】Opencv - 蒙版图像导致黑色图像【英文标题】:Opencv - mask image results in black image 【发布时间】:2017-01-16 13:38:00 【问题描述】:

我想屏蔽彩色图像,但得到的结果是全黑图像,我的代码是:

Mat maskOriginal(Mat src, Mat original, Mat mask) 

    original.copyTo(src, mask);
    return src;

我的蒙版是单通道 (CV_8U) 黑白图像。 我的面具:

【问题讨论】:

请同时上传掩码? @Zdar - 已编辑。 你能说明你在哪里使用 maskOriginal 函数吗? @Sunreef - 我的程序只是调用这个函数,然后我打印返回的 img,我现在不知道源,但我会尽快发布。 这和java有什么关系?? 【参考方案1】:

在应用蒙版时,您应该注意 src 和原始图像具有相同数量的通道,否则 copyTo 将无缝重新分配新的黑色图像。来自 opencv 文档:

该方法将矩阵数据复制到另一个矩阵。在复制数据之前,该方法调用

m.create(this->size(), this->type());

以便在需要时重新分配目标矩阵。

https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html?highlight=clone#mat-copyTo

如果这两种类型不匹配,您可以使用例如cvtColor 方法来更改颜色,例如将 CV_8UC4 转换为 CV_8UC3,您可以执行以下操作:

cvtColor(original,original,COLOR_BGRA2BGR);

【讨论】:

【参考方案2】:

注意,如何使用 maskOriginal 并注意掩码元素类型。 对于给定的图像,下面的代码将在输入图像的中间保留一个圆圈,同时用黑色填充其余部分。

cv::Mat img = cv::imread("image.png");
cv::Mat mask = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);

cv::circle(mask, cv::Point(img.cols/2, img.rows/2), 
           std::min(img.rows, img.cols)/2, cv::Scalar(255), -1);

cv::Mat result;
result = maskOriginal(result, img, mask);

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

cv::waitKey();

【讨论】:

以上是关于Opencv - 蒙版图像导致黑色图像的主要内容,如果未能解决你的问题,请参考以下文章

opencv之python版图像的读取显示保存像素遍历以及结合matplotlib使用

如何传递 RGB 信息来对图像进行阈值处理

将灰度图像中的像素转换为黑色(OpenCV)会导致意外结果?

错误:无法从名为“AppIconMask.png”的图像以 2.0 比例创建图标蒙版图像

使用python为非矩形图像添加羽毛效果

Swift - 在蒙版图像上放置阴影