HSV 皮肤检测器 openCV android 的颜色 space 是什么颜色?
Which is color space for HSV Skin detector openCV android?
我是计算机视觉方面的新手。
我根据 http://www.pyimagesearch.com/2014/08/18/skin-detection-step-step-example-using-python-opencv/
在 Android 上做了一个皮肤检测器
但是我在选择颜色时遇到了问题space。
http://imgur.com/DxNOXd9(Sr,没有 10 个声望我无法 post 图片)
我在 Internet 和本网站上尝试了很多 space,但都是错误的。
这是我的代码:
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat hsv = new Mat();
//H,S,V area
Scalar lower = new Scalar(0, 0.28*255, 0);
Scalar upper = new Scalar(25, 0.68*255, 255);
//Skin detector HSV-based
Imgproc.cvtColor(inputFrame.rgba(), hsv, Imgproc.COLOR_RGBA2RGB);
Imgproc.cvtColor(hsv, hsv, Imgproc.COLOR_RGB2HSV_FULL);
Mat result = new Mat(hsv.rows(), hsv.cols(), CvType.CV_8U);
Core.inRange(hsv, lower, upper, result);
// Perform and decrease noise
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(2, 2));
Imgproc.erode(result, result, kernel);
Imgproc.dilate(result, result, kernel);
Imgproc.GaussianBlur(result, result, new Size(3,3), 0);
// Output
Imgproc.cvtColor(result, result, Imgproc.COLOR_GRAY2RGB);
Imgproc.cvtColor(result, result, Imgproc.COLOR_RGB2RGBA);
return result;
}
更新 1:
我尝试通过面部检测示例获取皮肤 space:
for (int i = 0; i < facesArray.length; i++) {
Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(),
FACE_RECT_COLOR, 3);
Mat hsv = new Mat(inputFrame.rgba(), facesArray[i]);
Imgproc.cvtColor(hsv, hsv, Imgproc.COLOR_RGB2HSV_FULL);
List<Mat> hsv_channel = new ArrayList<Mat>();
Core.split(hsv, hsv_channel);
Log.w("Color: ", "H: " + hsv_channel.get(0) + "S: " + hsv_channel.get(1) + "V: " + hsv_channel.get(2));
}
并输出:
H: Mat [ 261*261*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffb8b15658, dataAddr=0xffffffffb983d5f0 ]
S: Mat [ 261*261*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffb8b15698, dataAddr=0xffffffffb984e030 ]
V: Mat [ 261*261*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffb8b156d8, dataAddr=0xffffffffb985ea60 ]
如何将这些应用到我的代码中?
这些 HSV 颜色范围应该可以用于皮肤检测。
我已经使用这张图片进行测试:
http://www.dance-classes.ca/photos/faces/faces_2004W_comp1.jpg
发现于 https://fashionisrael.wordpress.com/2010/03/08/fashion-battle-royale-castro-vs-hm/
和此代码(C++ 简化为 hsv 转换和 inRange 测试:
int main()
{
cv::Mat input = cv::imread("../inputData/faces2.jpg");
cv::Mat hsv;
cv::cvtColor(input,hsv,CV_BGR2HSV);
double scaleSatLower = 0.28;
double scaleSatUpper = 0.68;
//double scaleSatLower = 0.18; // maybe better
//double scaleSatLower = 0.08; // maybe too much
//double scaleSatUpper = 0.78;
cv::Scalar lower = cv::Scalar(0, scaleSatLower*255, 0);
cv::Scalar upper = cv::Scalar(25, scaleSatUpper*255, 255);
cv::Mat result;
cv::inRange(hsv, lower, upper, result);
cv::imshow("result", result);
cv::imshow("input",input);
cv::imwrite("../outputData/HSV_skin.png", result);
cv::waitKey(0);
return 0;
}
给我这个结果:
这对于简单的皮肤检测器来说是可以的。
你能用你的代码验证这个测试图像的结果吗?
我是计算机视觉方面的新手。 我根据 http://www.pyimagesearch.com/2014/08/18/skin-detection-step-step-example-using-python-opencv/
在 Android 上做了一个皮肤检测器但是我在选择颜色时遇到了问题space。 http://imgur.com/DxNOXd9(Sr,没有 10 个声望我无法 post 图片)
我在 Internet 和本网站上尝试了很多 space,但都是错误的。
这是我的代码:
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat hsv = new Mat();
//H,S,V area
Scalar lower = new Scalar(0, 0.28*255, 0);
Scalar upper = new Scalar(25, 0.68*255, 255);
//Skin detector HSV-based
Imgproc.cvtColor(inputFrame.rgba(), hsv, Imgproc.COLOR_RGBA2RGB);
Imgproc.cvtColor(hsv, hsv, Imgproc.COLOR_RGB2HSV_FULL);
Mat result = new Mat(hsv.rows(), hsv.cols(), CvType.CV_8U);
Core.inRange(hsv, lower, upper, result);
// Perform and decrease noise
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(2, 2));
Imgproc.erode(result, result, kernel);
Imgproc.dilate(result, result, kernel);
Imgproc.GaussianBlur(result, result, new Size(3,3), 0);
// Output
Imgproc.cvtColor(result, result, Imgproc.COLOR_GRAY2RGB);
Imgproc.cvtColor(result, result, Imgproc.COLOR_RGB2RGBA);
return result;
}
更新 1: 我尝试通过面部检测示例获取皮肤 space:
for (int i = 0; i < facesArray.length; i++) {
Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(),
FACE_RECT_COLOR, 3);
Mat hsv = new Mat(inputFrame.rgba(), facesArray[i]);
Imgproc.cvtColor(hsv, hsv, Imgproc.COLOR_RGB2HSV_FULL);
List<Mat> hsv_channel = new ArrayList<Mat>();
Core.split(hsv, hsv_channel);
Log.w("Color: ", "H: " + hsv_channel.get(0) + "S: " + hsv_channel.get(1) + "V: " + hsv_channel.get(2));
}
并输出:
H: Mat [ 261*261*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffb8b15658, dataAddr=0xffffffffb983d5f0 ]
S: Mat [ 261*261*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffb8b15698, dataAddr=0xffffffffb984e030 ]
V: Mat [ 261*261*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffb8b156d8, dataAddr=0xffffffffb985ea60 ]
如何将这些应用到我的代码中?
这些 HSV 颜色范围应该可以用于皮肤检测。
我已经使用这张图片进行测试:
http://www.dance-classes.ca/photos/faces/faces_2004W_comp1.jpg
发现于 https://fashionisrael.wordpress.com/2010/03/08/fashion-battle-royale-castro-vs-hm/
和此代码(C++ 简化为 hsv 转换和 inRange 测试:
int main()
{
cv::Mat input = cv::imread("../inputData/faces2.jpg");
cv::Mat hsv;
cv::cvtColor(input,hsv,CV_BGR2HSV);
double scaleSatLower = 0.28;
double scaleSatUpper = 0.68;
//double scaleSatLower = 0.18; // maybe better
//double scaleSatLower = 0.08; // maybe too much
//double scaleSatUpper = 0.78;
cv::Scalar lower = cv::Scalar(0, scaleSatLower*255, 0);
cv::Scalar upper = cv::Scalar(25, scaleSatUpper*255, 255);
cv::Mat result;
cv::inRange(hsv, lower, upper, result);
cv::imshow("result", result);
cv::imshow("input",input);
cv::imwrite("../outputData/HSV_skin.png", result);
cv::waitKey(0);
return 0;
}
给我这个结果:
这对于简单的皮肤检测器来说是可以的。
你能用你的代码验证这个测试图像的结果吗?