Opencv - 掩模图像导致黑色图像

时间:2017-01-16 13:38:00

标签: java opencv image-processing

我想掩盖彩色图像,但我得到的结果是一个完全黑色的图像,我的代码是:

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

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

我的面具是单通道(CV_8U)黑/白图像。 我的面具: enter image description here

2 个答案:

答案 0 :(得分:0)

注意,如何使用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();

答案 1 :(得分:0)

应用遮罩时,应注意src和原始图像的通道数相同,否则copyTo将无缝地重新分配新的黑色图像。从opencv doc:

  

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

     

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);