更新1
我知道inRange
函数的作用,但我不想应用掩模并显示肤色的新图像。我想知道的是图像是否包含肤色并覆盖更大的区域。
我想要做什么
我想在检测到手指在一个边界内时捕获一张照片。它的尺寸已知。
困扰的地方
- 在本地代码中操作图像数据。
- 在实时相机中检测皮肤,所以每当焦点集中在特定区域且检测到皮肤时,应该拍摄快照。
我已经做了什么
我正在使用JNI层来执行操作。我能够使用这个教程从图像数据中获取Mat
,但不知道如何操作poutPixels
。格式为NV21
,我不确定如何对其进行操作。
我需要裁剪图像,然后检测图像中是否存在肤色。我已经成功将图像裁剪到所需的尺寸,但不知道如何继续检测肤色。我希望这个方法返回true
或false
。
以下是代码:
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
函数,但我不知道如何检查是否有皮肤。
问题
- 我在继续进行的正确路径上吗?
- 我得到的图像格式是
NV21
。它是8UC1
还是可以是8UC3
? - 从这里开始如何进行皮肤检测?
任何帮助都将不胜感激。