【发布时间】:2018-05-11 20:22:06
【问题描述】:
更新 1
我知道inRange 函数的作用。但我不想应用蒙版并用肤色显示新图像。我想要做的是知道图像是否包含肤色并覆盖更大的区域。
我想做的事
只要在边界内检测到手指,我就想拍摄一张照片。它的尺寸是已知的。
困难点
- 在本机代码中处理图像数据。
- 在实时摄像头中检测皮肤,因此只要聚焦特定区域并检测到皮肤,就应该拍摄快照
我做了什么
我正在使用 JNI 层来执行操作。我可以使用this tutorial 从图像数据中获取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? - 如何从这里开始检测皮肤?
感谢任何帮助。
【问题讨论】:
标签: android c opencv image-processing java-native-interface