【问题标题】:OpenCV Skin DetectionOpenCV 皮肤检测
【发布时间】:2012-10-09 17:35:45
【问题描述】:

我一直在做一些皮肤检测,但无法得到一个平滑的。下图包含使用以下代码的输入(左)和输出(右)。现在,所需的输出应该是最底部的图像(边缘平滑且内部没有孔的图像)。我如何实现这个输出?关于从哪里开始的示例代码会很有帮助。

输入(左)和错误输出(右):

期望的输出:

生成错误输出的代码:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main(){
    Mat src = imread("qq.jpg");
    if (src.empty())
        return -1;
    blur( src, src, Size(3,3) );
    Mat hsv;
    cvtColor(src, hsv, CV_BGR2HSV);
    Mat bw;
    inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
    imshow("src", src);
    imshow("dst", bw);
    waitKey(0);
    return 0;
}

修改后的代码(根据 Astor 的建议): (现在的问题是:如何平滑输出?)

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int findBiggestContour(vector<vector<Point> >);

int main(){
    Mat src = imread("qq.jpg");
    if (src.empty())
        return -1;
    blur( src, src, Size(3,3) );

    Mat hsv;
    cvtColor(src, hsv, CV_BGR2HSV);

    Mat bw;
    inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
    imshow("src", src);
    imshow("dst", bw);

    Mat canny_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    findContours( bw, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
    int s = findBiggestContour(contours);

    Mat drawing = Mat::zeros( src.size(), CV_8UC1 );
    drawContours( drawing, contours, s, Scalar(255), -1, 8, hierarchy, 0, Point() );

    imshow("drw", drawing);
    waitKey(0);
    return 0;
}

int findBiggestContour(vector<vector<Point> > contours){
    int indexOfBiggestContour = -1;
    int sizeOfBiggestContour = 0;
    for (int i = 0; i < contours.size(); i++){
        if(contours[i].size() > sizeOfBiggestContour){
            sizeOfBiggestContour = contours[i].size();
            indexOfBiggestContour = i;
        }
    }
    return indexOfBiggestContour;
}

【问题讨论】:

    标签: c++ opencv skin flood-fill


    【解决方案1】:

    您应该使用findContours 检测最大轮廓,然后使用方法drawContours 使用填充参数-1 绘制创建轮廓。这是有用的链接:http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

    【讨论】:

    • 谢谢!我得到了一个更接近所需输出的输出。请问如何才能平滑输出的边缘?
    • 尝试使用平滑或模糊。 OpenCV 有这些功能。
    • 我使用 pyrMeanShiftFiltering() 函数让它看起来更平滑。
    • Protip:findContours 之前的阈值以获得最一致的结果。
    【解决方案2】:

    要提高输出的平滑度,或者换句话说,要减少检测区域中的黑洞,请尝试对生成的图像执行形态学操作。 以下文档解释了 opencv 中的腐蚀和膨胀函数。 http://docs.opencv.org/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2018-05-11
      相关资源
      最近更新 更多