无法检测皮肤

时间:2015-05-24 11:04:27

标签: java opencv feature-detection

我正在尝试使用opencv(新的)来检测图像上的皮肤,但我设法让某些皮肤被检测到,但其余部分似乎会在图像上产生一些噪音。这是原始图片:

original

我的代码的结果是:

result

产生此代码的代码:

Mat image = Imgcodecs.imread(name);

Imgproc.pyrMeanShiftFiltering(image, image, 10, 20);
Imgproc.blur(image, image, new Size(3, 3));

Mat hsv = new Mat();
Imgproc.cvtColor(image, hsv, Imgproc.COLOR_BGR2HSV);

Mat bw = new Mat();
Core.inRange(hsv, new Scalar(0, 10, 60), new Scalar(20, 150, 255), bw);

List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(bw, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_NONE, new Point(0, 0));
int s = findBiggestContour(contours);

Mat drawing = new Mat(image.size(), CvType.CV_8UC1);
Imgproc.drawContours(drawing, contours, s, new Scalar(255), -1, 8, hierarchy, 0, new Point(0, 0));

Imgcodecs.imwrite(rename(name), drawing);

如何修复代码以检测图像上的剩余皮肤并消除噪音?

我正在使用Java和OpenCV 3.0.0。

2 个答案:

答案 0 :(得分:1)

因为你正在使用findBiggestConour()我认为你只画了最大的匹配,而不是全部。由于最大的轮廓恰好是第二张图像上仅显示的轮廓。

答案 1 :(得分:0)

为了补充JanSLO在上面所说的内容,我尝试了你的代码而不是绘制最大的轮廓,我绘制了所有的轮廓并获得了以下结果。

//c++ code, not java
Mat drawing = Mat::zeros(img.size(), CV_8UC1 );
for(int i=0; i < contours.size(); ++i) {
    drawContours(drawing, contours, i, Scalar(255), 3, 8, hierarchy, 0, Point(0, 0));
}
imwrite("data/skin_detect_out.jpg", drawing);

skin_detect_out.jpg

我对结果感到惊喜,因为这是一段简单的代码。更高级的基于像素的皮肤检测方法涉及使用训练数据制作皮肤像素的概率模型,并使用该模型来分类给定像素是否是皮肤。