为什么我的copyTo函数没有将掩码复制到正确的Mat?

时间:2016-01-13 16:26:54

标签: android opencv image-processing opencv3.0 opencv4android

我从下面的图片开始,名为rgbaMat4Mask.bmp

enter image description here

然后我将其转换为HSV,然后inRange()找到轮廓,并得到以下名为Mat的{​​{1}}:

enter image description here

然后我继续在一个名为maskedMat的新创建的空Mat上绘制第一个轮廓(较大的轮廓),其中相同的大小第一张图片我以开头:

enter image description here

到目前为止一切都那么好,但问题现在就开始了。我创建了一个新的newMatWithMask并给它与第一个轮廓相同的大小(更大的一个) ,然后将其背景颜色设置为Mat。然后我使用new Scalar(120, 255, 255)函数将newMat4MaskFinished复制到它。 但结果copyTo的大小与轮廓的大小相同,其背景颜色也不是Mat蓝色。

enter image description here

它是一个尺寸与整个面具相同的图像,并且具有黑色背景。为什么? 我做错了什么?

new Scalar(120, 255, 255)

1 个答案:

答案 0 :(得分:1)

您的newMatwithMaskFinished应与rgbaMat4MasknewMat4Mask的尺寸相同。

Mat newMatwithMaskFinished = new Mat(rgbaMat4Mask.rows(), rgbaMat4Mask.cols(), CvType.CV_8UC3);

如果您只想使用透明背景的Mat更大的圆圈,那么您需要:

1)创建newMatwithMaskFinished

类型的CV_8UC4
Mat newMatwithMaskFinished = new Mat(rgbaMat4Mask.rows(), rgbaMat4Mask.cols(), CvType.CV_8UC4);

2)设置透明背景:

newMatwithMaskFinished.setTo(new Scalar(0, 0, 0, 0));

3)使用box计算您感兴趣的轮廓的边界框boundingRect

4)使用rgbaMat4MaskcvtColor(..., COLOR_BGR2BGRA)转换为4个频道(除非它已经存在),让我们称之为rgba

5)将rgba复制到newMatwithMaskFinished,屏蔽newMat4Mask

6)使用newMatwithMaskFinished方法

box上裁剪submat