В Формате OpenCV Для Обнаружения Кожи

Я делал некоторое обнаружение кожи, но не могу получить гладкую. Изображение ниже содержит вход (слева) и выход (справа), используя код, также прилагаемый ниже. Теперь желаемым выходом должно быть самое нижнее изображение (то, которое гладкое по краям и не имеет отверстий внутри). Как достичь этого результата? Пример кода о том, с чего начать, будет очень полезен.

вход (слева) и неправильный выход (справа):

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

измененный код (после предложения Астора): (теперь проблема заключается в следующем:как вы сглаживаете вывод?)

#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 ответов


вы должны использовать findContours чтобы обнаружить самый большой контур, после этого нарисуйте контур с параметром заполнения -1, используя метод drawContours. Вот полезная ссылка: http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html


чтобы улучшить гладкость вывода, или, другими словами, уменьшить черные дыры в обнаруженной области, попробуйте выполнить морфологические операции над полученным изображением. Следующая документация объясняет функции размывания и расширения в opencv. http://docs.opencv.org/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html