Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ciexyz/cielab检测肤色?_Java_Opencv_Image Processing - Fatal编程技术网

Java 如何使用ciexyz/cielab检测肤色?

Java 如何使用ciexyz/cielab检测肤色?,java,opencv,image-processing,Java,Opencv,Image Processing,我是opencv新手,我一直在使用CIEXYZ进行皮肤检测。但我得到了将RGB转换到CIE实验室以获得肤色面积的问题,我根据RGB做了一些计算 原始图像 结果是一个黑色的框架。它从RGB到CIEXYZ 这是二值图像 但我想这样展示它 以下是我的源代码: Mat img_color_space = new Mat(); Mat mask = new Mat(); Imgproc.cvtColor(src, img_color_space, colorBgr2hsv); Imgcodecs

我是opencv新手,我一直在使用CIEXYZ进行皮肤检测。但我得到了将RGB转换到CIE实验室以获得肤色面积的问题,我根据RGB做了一些计算

原始图像

结果是一个黑色的框架。它从RGB到CIEXYZ

这是二值图像

但我想这样展示它

以下是我的源代码:

Mat img_color_space = new Mat();
Mat mask = new Mat();

Imgproc.cvtColor(src, img_color_space, colorBgr2hsv);
Imgcodecs.imwrite(path+"CIELAB/hsv.jpg",img_color_space);
Imgproc.blur(img_color_space, img_color_space, new Size(3,3));
Mat canny_output = new Mat();

Scalar minValues = new Scalar(0,10,60);
Scalar maxValues = new Scalar(20,150,255);
// show the current selected HSV range
String valuesToPrint = "Hue range: " + minValues.val[0] + "-" + maxValues.val[0]
        + "\tSaturation range: " + minValues.val[1] + "-" + maxValues.val[1] + "\tValue range: "
        + minValues.val[2] + "-" + maxValues.val[2];
//System.out.println("tresholding:"+valuesToPrint);

Core.inRange(img_color_space, minValues, maxValues, mask);
Imgcodecs.imwrite(path+"CIELAB/mask.jpg",mask);
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();

Imgproc.findContours(mask, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE,new Point(0,0));
int s = findBiggestContour(contours);

Mat drawing = Mat.zeros(mask.size(), CvType.CV_8UC3);
Imgproc.drawContours(drawing, contours, s, new Scalar(255, 255, 255), -1,8,hierarchy,0,new Point(0,0));
Imgproc.blur(drawing, drawing, new Size(3,3));
Imgcodecs.imwrite(path+"CIELAB/biggest.jpg",drawing);
Mat img_color_space=new Mat();
Mat mask=新Mat();
cvtColor(src,img_color_space,colorBgr2hsv);
Imgcodecs.imwrite(路径+“CIELAB/hsv.jpg”,img\u颜色空间);
模糊(img_颜色空间,img_颜色空间,新尺寸(3,3));
Mat canny_输出=新Mat();
标量最小值=新标量(0,10,60);
标量最大值=新标量(20150255);
//显示当前选定的HSV范围
字符串valuesToPrint=“色调范围:”+minValues.val[0]+“-”+maxValues.val[0]
+\t饱和范围:“+minValues.val[1]+”-“+maxValues.val[1]+”\t值范围:
+minValues.val[2]+“-”+maxValues.val[2];
//System.out.println(“tresholding:+valuesToPrint”);
Core.inRange(img_color_space、minValues、maxValues、mask);
Imgcodecs.imwrite(路径+“CIELAB/mask.jpg”,mask);
列表等高线=新的ArrayList();
Mat层次结构=新Mat();
Imgproc.findContours(掩码、轮廓、层次、Imgproc.RETR_树、Imgproc.CHAIN_近似、简单、新点(0,0));
int s=findBiggestContour(等高线);
材料图纸=材料零点(mask.size(),CvType.CV_8UC3);
Imgproc.drawContours(绘图,等高线,s,新标量(255,255),-1,8,层次,0,新点(0,0));
Imgproc.blur(图纸,图纸,新尺寸(3,3));
Imgcodecs.imwrite(路径+“CIELAB/maxist.jpg”,绘图);

我的代码有问题吗?提前谢谢

您可以用更简单的方法分割手

按原样阅读CIELAB图像,并将其分为三个不同的通道。分别分析每个通道,看哪一个通道最适合分割手。在此之后,应用阈值

以下代码是python代码,可以转换为java:

import cv2

filename = 'hand.jpg'
img = cv2.imread(filename)
blue_channel, green_channel, red_channel = cv2.split(img)
cv2.imshow('green_channel', green_channel)
这是图像的绿色通道:


现在,你可以找到最大的轮廓并单独分割手了

@FebryFairuz很高兴我能帮忙
#---I split the image in blue, green and red channels because the image I saved is in BGR format  ---#

#---I applied binary threshold to the green channel---#
ret, thresh = cv2.threshold(g, 152, 255, 1)
cv2.imshow('thresh', thresh)
#--- I got the following----#