2012-10-19 53 views
8

我一直在做一些皮肤检测,但不能得到一个光滑的。下面的图片使用下面附加的代码包含输入(左)和输出(右)。现在,所需的输出应该是最底部的图像(边缘平滑并且内部没有孔)。我如何实现这个输出?从哪里开始的示例代码将非常有帮助。OpenCV皮肤检测

输入(左)和不正确的输出(右):

enter image description here

希望的输出:

enter image description here

代码,以生成Incorect输出:

#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; 
} 

修改后的代码(之后阿斯特的建议): (现在的问题是:你怎么理顺输出)

#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; 
} 

回答

9

您应该使用findContours检测最大轮廓的后这场平局成立轮廓与填充参数-1使用方法drawContours?以下是有用的链接:http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

+0

谢谢!我得到了一个更接近所需输出的输出。请问我可以如何平滑输出的边缘? –

+1

尝试使用平滑或模糊。 OpenCV具有这些功能。 – ArtemStorozhuk

+0

我使用pyrMeanShiftFiltering()函数使它看起来更顺畅。 –