我从以下图像开始,命名为rgbaMat4Mask.bmp
:
然后我将其转换为HSV,然后使用inRange()
查找轮廓,并获得以下名为Mat
的maskedMat
:
然后,我继续在新创建的名为Mat
的空newMatWithMask
上绘制第一个轮廓(较大的轮廓),该的大小与我开始的第一个图像的大小相同:
到目前为止很好,但是问题现在开始。 我创建了一个新的Mat
,并将其的大小设置为与第一个轮廓(较大的)相同的大小,然后将其背景色设置为new Scalar(120, 255, 255)
。然后,我使用newMat4MaskFinished
函数将copyTo
复制到它。 但是结果Mat
的大小与轮廓的大小都不相同,其背景色也未设置为蓝色的new Scalar(120, 255, 255)
。
它是具有与整个蒙版相同大小的图像,并且具有黑色背景。为什么? 我在做什么错?
public void doProcessing(View view) {
// READING THE RGBA MAT
Mat rgbaMat4Mask = Highgui.imread("/mnt/sdcard/DCIM/rgbaMat4Mask.bmp");
// CONVERTING TO HSV
Mat hsvMat4Mask = new Mat();
Imgproc.cvtColor(rgbaMat4Mask, hsvMat4Mask, Imgproc.COLOR_BGR2HSV);
Highgui.imwrite("/mnt/sdcard/DCIM/hsvMat4Mask.bmp", hsvMat4Mask);//check
// CREATING A FILTER/MASK FOR RED COLORED BLOB
Mat maskedMat = new Mat();
Core.inRange(hsvMat4Mask, new Scalar(0, 100, 100), new Scalar(10, 255, 255), maskedMat);
Highgui.imwrite("/mnt/sdcard/DCIM/maskedMat.bmp", maskedMat);// check
// COPYING THE MASK TO AN EMPTY MAT
// STEP 1:
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(maskedMat, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);
//STEP 2:
Mat newMat4Mask = new Mat(rgbaMat4Mask.rows(), rgbaMat4Mask.cols(), CvType.CV_8UC1);
newMat4Mask.setTo(new Scalar(0));
Imgproc.drawContours(newMat4Mask, contours, 0, new Scalar(255), -1);//TODO Using -1 instead of CV_FILLED.
Highgui.imwrite("/mnt/sdcard/DCIM/newMatWithMask.bmp", newMat4Mask);// check
//STEP 3
Log.i(TAG, "HAPPY rows:"+contours.get(0).rows()+" columns:"+contours.get(0).cols());
Mat newMatwithMaskFinished = new Mat(contours.get(0).rows(), contours.get(0).cols(), CvType.CV_8UC3);
newMatwithMaskFinished.setTo(new Scalar(120, 255, 255));
rgbaMat4Mask.copyTo(newMatwithMaskFinished, newMat4Mask);
Highgui.imwrite("/mnt/sdcard/DCIM/newMatwithMaskFinished.bmp", newMatwithMaskFinished);//check*/
}
最佳答案
您的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