2016-01-13 3 views
0

Я начал со следующим изображением, названный rgbaMat4Mask.bmp:Почему моя функция copyTo Не копирует маску на правильный Mat?

enter image description here

Тогда я преобразовал его в HSV, а затем сделал inRange() найти контуры, и получили следующие Mat имени maskedMat:

enter image description here

Затем я продолжил рисовать первый контур (более крупный), на вновь созданной пустой Mat с именем newMatWithMask, который был дан в такой же размер, как и у первого изображения я начал с:

enter image description here

До сих пор так хорошо, но проблема начинается сейчас. Я создал новый 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*/ 
    } 

ответ

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) Преобразование rgbaMat4Mask на 4 канала (если это не уже), с cvtColor(..., COLOR_BGR2BGRA), давайте назовем это rgba

5) Скопировать rgba в newMatwithMaskFinished с маской newMat4Mask.

6) Обрезка newMatwithMaskFinished на box, используя метод submat

+0

Oh. Моя цель заключалась в том, чтобы иметь только матов большего красного круга. Конечным результатом, который я получаю, является обрезка 'rgbaMat', так что остается только большая красная капля, а все остальное (т. Е. Фон, а также меньшая красная капля) отбрасываются. Разве это невозможно? – Solace

+1

Да, см. Это обновление. – Miki

+0

«Если вы хотите иметь матов большего круга, с обычным фоном». - Мне нужен больший круг с _no_ фоном. Мне нужен только большой круг – Solace

Смежные вопросы