Я начал со следующим изображением, названный rgbaMat4Mask.bmp
:Почему моя функция copyTo Не копирует маску на правильный Mat?
Тогда я преобразовал его в 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*/
}
Oh. Моя цель заключалась в том, чтобы иметь только матов большего красного круга. Конечным результатом, который я получаю, является обрезка 'rgbaMat', так что остается только большая красная капля, а все остальное (т. Е. Фон, а также меньшая красная капля) отбрасываются. Разве это невозможно? – Solace
Да, см. Это обновление. – Miki
«Если вы хотите иметь матов большего круга, с обычным фоном». - Мне нужен больший круг с _no_ фоном. Мне нужен только большой круг – Solace