OpenCV皮肤检测

11
我一直在做皮肤检测,但无法得到平滑的结果。下面的图像包含了输入(左侧)和使用下面附加的代码生成的输出(右侧)。现在,期望的输出应该是最下面的图像(边缘平滑且没有孔洞)。如何实现这个输出?提供一个开始的示例代码将会非常有帮助。
输入(左侧)和错误的输出(右侧): enter image description here 期望的输出: enter image description here 生成错误输出的代码:
#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;
}
2个回答

11

谢谢!我得到了一个更接近期望输出的结果。请问如何使输出的边缘更加平滑? - Og Namdik
1
尝试使用平滑或模糊处理。OpenCV有这些功能。 - ArtemStorozhuk
我使用了pyrMeanShiftFiltering()函数使其看起来更平滑,顺便说一下。 - Og Namdik
专业提示:在查找轮廓之前设置阈值,以获得最一致的结果。 - 1''

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接