2014-09-11 4 views
0

В моем андроид приложения, которое я получаю изображение из галереи в виде битового массива с чем-то вроде этогоImgproc.drawContours (....) не показывая вверх

Bitmap bitm = getMyImage("Thanks!"); 

и у меня есть коврик называется мат объявленным, как это :

Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3); 

Я пытаюсь получить контур области от образа, который я успешно получил затем сделать его обратно на исходное изображение с:

Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0), 2); 
displayMat(mat); 

Если я использую его так, он работает, но контуры рисуются на пустом изображении, которого я не хочу. Я хочу, чтобы это было нарисовано на исходном изображении. Если я использую

Utils.bitmapToMat(bitm, mat); 

перед предыдущим фрагментом кода, отображаемое изображение только preprossed изображения без «Ничьих» контуров. Зачем?

+1

Я еще не работал с android opencv, но я думаю, что где-то читал, что они используют изображения 8UC4?!? поэтому «новый Scalar (200,200,0)» нуждается в альфа-значении. В противном случае он использует значение alpha по умолчанию, которое будет прозрачным, я думаю. Поэтому поставьте 'Utils.bitmapToMat (битm, мат);' перед вашим кодом и измените на «Scalar (200,200,0,255)» или «Scalar (200,200,0,0)», что бы означало быть непрозрачным значением альфа. – Micka

+0

@ Мичка Спасибо! Именно по этой причине он не появлялся. Если вы оставите свой комментарий в качестве ответа, я обязательно его примечу :) – Olumide

ответ

2

Asfaik Android использует изображения с альфа-значениями, поэтому CV_8UC4 - это правильный тип данных.

Так

Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3); 

Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0), 2); 

displayMat (мат);

правильно рисует контуры на пустой/пустой картинке 8UC3 (если память пуста).

Но если вы хотите нарисовать входное изображение, сначала преобразуя Utils.bitmapToMat(bitm, mat);, вы перезапишите свою 8UC3 память и замените ее на данные 8UC4. После этого вы нарисуете Scalar(200,200,0), который будет использовать 4-й канал, но cv::Scalar автоматически добавляет эти каналы с default zero values, поэтому вы рисуете свои контуры прозрачным. Поэтому используйте Scalar(200,200,0,255) вместо этого, и он должен дать ожидаемые результаты.

Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3); 

Utils.bitmapToMat(bitm, mat); 

Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0,255), 2); 

displayMat (mat);

Другим способом было бы преобразовать растровое изображение в 8UC3, но я не уверен, как это сделать.

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