我从下面的图片开始,名为rgbaMat4Mask.bmp
:
然后我将其转换为HSV,然后inRange()
找到轮廓,并得到以下名为Mat
的{{1}}:
然后我继续在一个名为maskedMat
的新创建的空Mat
上绘制第一个轮廓(较大的轮廓),其中与相同的大小第一张图片我以开头:
到目前为止一切都那么好,但问题现在就开始了。我创建了一个新的newMatWithMask
并给它与第一个轮廓相同的大小(更大的一个) ,然后将其背景颜色设置为Mat
。然后我使用new Scalar(120, 255, 255)
函数将newMat4MaskFinished
复制到它。 但结果copyTo
的大小与轮廓的大小相同,其背景颜色也不是Mat
蓝色。
它是一个尺寸与整个面具相同的图像,并且具有黑色背景。为什么? 我做错了什么?
new Scalar(120, 255, 255)
答案 0 :(得分:1)
您的newMatwithMaskFinished
应与rgbaMat4Mask
和newMat4Mask
的尺寸相同。
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)使用rgbaMat4Mask
将cvtColor(..., COLOR_BGR2BGRA)
转换为4个频道(除非它已经存在),让我们称之为rgba
5)将rgba
复制到newMatwithMaskFinished
,屏蔽newMat4Mask
。
6)使用newMatwithMaskFinished
方法
box
上裁剪submat