2012-10-19 14 views
8

Wykonywałem wykrywanie skóry, ale nie mogę uzyskać gładkiej. Poniższy obrazek zawiera dane wejściowe (po lewej) i dane wyjściowe (po prawej) za pomocą kodu również dołączonego poniżej. Teraz pożądany wynik powinien być najbardziej na dole obrazu (ten, który jest gładki na krawędziach i nie ma w nim otworów). Jak mogę osiągnąć ten wynik? Przykładowy kod, od którego należy zacząć, byłby bardzo pomocny.Wykrywanie skóry OpenCV

wejściowe (z lewej) i wyjście Niewłaściwe (po prawej):

enter image description here

Pożądany wyjściowa:

enter image description here

kod, aby wygenerować wyjście 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; 
} 

Zmodyfikowany kod (po sugestia Astor): (obecnie problemem jest: jak można wygładzić wyjście)

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

Odpowiedz

9

Należy użyć findContours wykryć największy konturu after ten remis założony kontur z parametrem napełnienia -1 stosując metodę drawContours?. Oto przydatny link: http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

+0

dziękuję! Mam wyjście, które jest bliższe pożądanej wydajności. czy mogę zapytać, jak mogę wygładzić krawędzie wyjścia? –

+1

Spróbuj użyć wygładzania lub blaknięcia. OpenCV ma te funkcje. – ArtemStorozhuk

+0

Użyłem funkcji pyrMeanShiftFiltering(), aby wyglądało gładko przy okazji. –

Powiązane problemy