newMatwithMaskFinished

newMatwithMaskFinished

我从以下图像开始,命名为rgbaMat4Mask.bmp:

android - 为什么我的copyTo功能不能将蒙版复制到正确的Mat?-LMLPHP

然后我将其转换为HSV,然后使用inRange()查找轮廓,并获得以下名为MatmaskedMat:

android - 为什么我的copyTo功能不能将蒙版复制到正确的Mat?-LMLPHP

然后,我继续在新创建的名为Mat的空newMatWithMask上绘制第一个轮廓(较大的轮廓),该的大小与我开始的第一个图像的大小相同:

android - 为什么我的copyTo功能不能将蒙版复制到正确的Mat?-LMLPHP

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

android - 为什么我的copyTo功能不能将蒙版复制到正确的Mat?-LMLPHP

它是具有与整个蒙版相同大小的图像,并且具有黑色背景。为什么? 我在做什么错?

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应该具有与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)使用掩码rgbanewMatwithMaskFinished复制到newMat4Mask

6)使用newMatwithMaskFinished方法在box上裁剪submat

09-29 19:48