【问题标题】:Opencv - mask image results in black imageOpencv - 蒙版图像导致黑色图像
【发布时间】: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有什么关系??

标签: java opencv image-processing


【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 2020-05-13
      • 2012-05-15
      • 1970-01-01
      • 2023-03-04
      • 2010-11-11
      • 2020-10-24
      相关资源
      最近更新 更多