【问题标题】:Detect Skin and Capture Image检测皮肤并捕获图像
【发布时间】:2018-05-11 20:22:06
【问题描述】:

更新 1

我知道inRange 函数的作用。但我不想应用蒙版并用肤色显示新图像。我想要做的是知道图像是否包含肤色并覆盖更大的区域。

我想做的事

只要在边界内检测到手指,我就想拍摄一张照片。它的尺寸是已知的。

困难点

  1. 在本机代码中处理图像数据。
  2. 在实时摄像头中检测皮肤,因此只要聚焦特定区域并检测到皮肤,就应该拍摄快照

我做了什么

我正在使用 JNI 层来执行操作。我可以使用this tutorial 从图像数据中获取Mat,但不知道如何操作poutPixels。格式是NV21,不知道怎么操作。

我需要裁剪图像,然后检测图像中是否存在皮肤。我已成功地将图像裁剪到所需的尺寸,但不知道继续检测皮肤。我希望这个方法返回truefalse

代码如下:

jbyte * pNV21FrameData = env->GetByteArrayElements(NV21FrameData, 0);
jint * poutPixels = env->GetIntArrayElements(outPixels, 0);

Mat mNV(height, width, CV_8UC3, (unsigned char*)pNV21FrameData);
Mat finalImage(height, width, CV_8UC3, (unsigned char*) poutPixels);

jfloat wScale = (float) width/screenWidth;
jfloat hScale = (float) height/screenHeight;

float temp = rectX * wScale;
int x = (int) temp;
temp = rectY * hScale;
int y = (int) temp;

int cW = (int) (width * wScale);
int cH =  (int) (height * hScale);

cH = cH/2;


Rect regionToCrop(x, y, cW, cH);
mNV = mNV(regionToCrop);
finalImage = finalImage(regionToCrop);

//detect skin and return true or false

我看过inRange函数,但不知道如何检查是否有皮肤。

问题

  1. 我是否在正确的道路上继续前进?
  2. 我得到的图像格式是NV21。是8UC1 还是8UC3
  3. 如何从这里开始检测皮肤?

感谢任何帮助。

【问题讨论】:

    标签: android c opencv image-processing java-native-interface


    【解决方案1】:

    我通过提取肤色范围并使所有像素等于zero 解决了我的问题。以下是步骤。

    1. 将图像转换为 HSV

    首先将图片转换为HSV

    Mat mHsv = new Mat(rows, cols, CvType.CV_8UC3);
    Imgproc.cvtColor(mRgba, mHsv, Imgproc.COLOR_RGB2HSV);
    
    1. 获取肤色范围

    肤色范围可能会有所不同,但这个适合我。

    Mat output = new Mat();
    Core.inRange(mHsv, new Scalar(0, 0.18*255, 0), new Scalar(25, 0.68*255, 255), output);
    
    1. 提取此 Skin Range 频道

    现在提取此通道,同时使皮肤像素等于zero

    Mat mExtracted = new Mat();
    Core.extractChannel(output, mExtracted, 0);
    

    现在您有了mExtracted 矩阵,其中肤色像素为0,其余为255(或肤色,我不确定)。

    1. 获取零个数

    由于0现在实际上是肤色区域,你可以做的就是定义一个适合你需要的阈值。根据我的需要,我希望皮肤覆盖一半以上的区域,所以我做了相应的逻辑。

    int n = Core.countNonZero(mExtracted);
    int check = (mExtracted.rows() * mExtracted.cols())/2;
    
    if(n >= check && isFocused) {
        //Take picture
    }
    

    【讨论】:

    • 在投反对票后发表评论真是太好了,这样其他人也可以从你的智慧中学习。
    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 2015-08-06
    • 2017-12-30
    • 2017-03-28
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多