【问题标题】:Why I can't do threshold opencv for skin segmentation provementin my android project?为什么我不能在我的android项目中为皮肤分割证明做阈值opencv?
【发布时间】:2015-05-07 08:41:07
【问题描述】:

我正在使用 android 和 opencv 进行实时手势识别的最终项目。我正在对其进行皮肤分割,方法是将图片从相机帧(RGB)转换为 YCrCb 颜色,并从指向皮肤颜色的矩形中获取 Cr 和 Cb 值(范围)(看起来像颜色选择器)。现在,我想通过我的安卓手机上的选项菜单按钮使用阈值功能来证明它(皮肤分割)。但是,它不起作用,没有效果。我该怎么办 ?这是我的阈值代码:

    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;

【问题讨论】:

  • 你的意思是按下菜单按钮没有效果,或者阈值没有发生?
  • @GáborBakos 阈值不起作用。你能帮帮我吗?
  • 向我们展示阈值处理前后的mask 图像。
  • 掩码图像是从rgba图像(来自相机的图像输入帧)克隆的,然后我将其转换为灰度图像。这样做对吗?
  • 掩码实际上是inRange函数输出的目的地。它必须是CV_8U 并且与inRange( ) 的输入大小相同,即与rgbaInnerWindow 的大小相同。通过使用克隆,您正在做额外的工作(复制源数据)并使mask 大于您正在执行inRange 的区域。它比源图像大的事实可能是一个问题。您不能将mask 分配为适当大小的新CV_8U 矩阵吗?

标签: java android opencv skin threshold


【解决方案1】:

我认为你的阈值方法没有正确指定

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

来自文档

特殊值 THRESH_OTSU 也可以与上述值之一组合

我认为您可能需要尝试:

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

例如

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2018-10-24
    • 2020-08-05
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多