如何通过掩码将Scalar添加到Mat?

时间:2015-08-18 16:00:10

标签: opencv

如何仅在掩码> 0?

的情况下将Scalar添加到Mat

此代码没有按预期工作,掩码> 0的区域是img.value +标量,但掩码= 0 us 0,但我期望img.value。

 add(image,Scalar(0,0,80),dst, mask);

按预期工作的代码是

Mat dst;
image.copyTo(dst,mask);
add(dst,Scalar(0,0,80),dst, mask);
dst.copyTo(image,mask);
dst= image;

但它不是很清楚,有没有更简单的变体?

1 个答案:

答案 0 :(得分:1)

由于您的dst图片未初始化,因此屏蔽之外的值设置为0

如果将初始化矩阵用作目标,则会获得预期的行为。它可以是你的源矩阵;

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    // Initial image
    Mat3b image(10, 10, Vec3b(0,2,0));

    // Mask
    Mat1b mask(10,10, uchar(0));
    rectangle(mask, Rect(0,0,3,4), Scalar(255), CV_FILLED);

    add(image, Scalar(0, 0, 3), image, mask);

    return 0;
}

或者,如果您需要保持源矩阵不变,您只需将源图像克隆到add之前的目标图像,例如:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    // Initial image
    Mat3b image(10, 10, Vec3b(0,2,0));

    // Mask
    Mat1b mask(10,10, uchar(0));
    rectangle(mask, Rect(0,0,3,4), Scalar(255), CV_FILLED);

    Mat3b dst = image.clone();
    add(image, Scalar(0, 0, 3), dst, mask);

    return 0;
}