Java 为什么我能';在我的android项目中,是否使用阈值opencv进行皮肤分割验证?

Java 为什么我能';在我的android项目中,是否使用阈值opencv进行皮肤分割验证?,java,android,opencv,skin,threshold,Java,Android,Opencv,Skin,Threshold,我正在做关于使用android和opencv实时识别手势的最后一个项目。我正在对它进行皮肤分割,通过将图片从相机帧(RGB)转换为YCrCb颜色,并从指向皮肤颜色的矩形中获得Cr和Cb值(范围)(类似于颜色选择器)。现在,我想通过android手机上的选项菜单按钮使用阈值功能来证明这一点(皮肤分割)。但是,这不是工作,没有效果。我该怎么办?这是我的阈值代码: case MainActivity.VIEW_MODE_THRES: mask = rgba.clone(); r

我正在做关于使用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;

我认为您的treshold方法没有正确指定

Imgproc.threshold(mask, mask, 13, 255, Imgproc.THRESH_OTSU);
来自文档

此外,特殊值THRESH_OTSU可与上述值之一组合

我认为您可能需要尝试:

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

例如

您的意思是按下菜单按钮无效,或者阈值设置没有发生?@GáborBakos阈值设置没有工作。你能帮我吗?给我们看阈值化前后的
遮罩
图像。遮罩图像是从rgba图像(相机的图像输入帧)克隆出来的,然后我将其转换为灰度图像。这样做对吗?掩码实际上是
inRange
函数输出的目标。它需要是
CV_8U
并且与
inRange()
的输入大小相同,即与
rgbainerWindow
的大小相同。通过使用克隆,您正在做额外的工作(复制源数据),并使
掩码
大于您在范围上执行的区域。它比源图像大这一事实可能是个问题。难道你不能将
掩码
分配为一个大小合适的新CV_8U矩阵吗?