Почему я не могу сделать пороговое значение opencv для проверки сегментации кожи в моем проекте Android?

Я делаю окончательный проект о распознавании жестов рук в реальном времени с использованием Android и opencv. Я делаю на нем сегментацию кожи, конвертируя изображение из кадра камеры (RGB) в цвет YCrCb и получая значение Cr и Cb (диапазон) из прямоугольника, который направлен на цвет кожи (похоже на палитру цветов). Теперь я хочу доказать это (сегментацию кожи), используя функцию порогового значения с помощью кнопки меню параметров на моем телефоне Android. Но это не работа, никакого эффекта. Что я должен делать ? Это мой пороговый код:

    case MainActivity.VIEW_MODE_THRES:
    mask = rgba.clone();
    rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);

    Imgproc.cvtColor(rgbaInnerWindow, rgbaInnerWindow, Imgproc.COLOR_BGR2YCrCb);
    Imgproc.cvtColor(mask, mask, Imgproc.COLOR_BGR2GRAY);

    Core.inRange(rgbaInnerWindow, new Scalar(0, Cr_low, Cb_low), new Scalar (255, Cr_high, Cb_high), mask);

    image = mask.clone(); //save the image segmentation output
    Imgproc.blur(mask, mask, new Size(5,5));

    Imgproc.threshold(mask, mask, 13, 255, Imgproc.THRESH_OTSU);
    Core.inRange(mask, new Scalar(30), new Scalar(255), mask);
    rgbaInnerWindow.release();
    mask.release();
    break;

person ichaka    schedule 07.05.2015    source источник
comment
Вы имеете в виду, что нажатие кнопки меню не имеет никакого эффекта или пороговое значение не происходит?   -  person Gábor Bakos    schedule 07.05.2015
comment
@GáborBakos пороговое значение не сработало. Не могли бы вы помочь мне?   -  person ichaka    schedule 07.05.2015
comment
Покажите нам изображение mask до и после пороговой обработки.   -  person cyriel    schedule 07.05.2015
comment
изображение маски клонируется из изображения rgba (кадр ввода изображения с камеры), затем я конвертирую его в изображение в градациях серого. Правильно ли это делать?   -  person ichaka    schedule 08.05.2015
comment
Маска на самом деле является местом назначения для вывода функции inRange. Он должен быть CV_8U и того же размера, что и ввод для inRange( ), то есть того же размера, что и rgbaInnerWindow. Используя клон, вы выполняете дополнительную работу (копируете исходные данные) и делаете mask больше, чем область, на которой вы выполняете inRange. Тот факт, что оно больше, чем исходное изображение, может быть проблемой. Разве вы не можете просто выделить mask в качестве новой матрицы CV_8U подходящего размера?   -  person Dave Durbin    schedule 08.05.2015
comment
@DaveDurbin спасибо за вашу помощь, это решается с помощью функции inRange.   -  person ichaka    schedule 15.06.2015


Ответы (1)


Я думаю, что ваш метод treshold не указан должным образом

Imgproc.threshold(mask, mask, 13, 255, Imgproc.THRESH_OTSU);

Из документов

Также специальное значение THRESH_OTSU может сочетаться с одним из указанных выше значений.

Я думаю, вам может понадобиться попробовать:

Imgproc.threshold(mask, mask, 13, 255, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);

Например

person Dave Durbin    schedule 08.05.2015