2012-10-19 7 views
8

Ich habe einige Haut-Erkennung gemacht, kann aber keine glatte Haut bekommen. Das Bild unten enthält die Eingabe (links) und Ausgabe (rechts) mit dem unten angehängten Code. Jetzt sollte die gewünschte Ausgabe das unterste Bild sein (dasjenige, das an den Rändern glatt ist und keine Löcher darin hat). Wie erreiche ich diese Ausgabe? Ein Beispielcode für den Start wäre eine große Hilfe.OpenCV Skin Detection

Input (links) und fehlerhafte Ausgabe (rechts):

enter image description here

gewünschter Ausgang:

enter image description here

-Code die incorect Ausgabe zu erzeugen:

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

Modifizierter Code (nach Astor Vorschlag): (das Problem ist jetzt: Wie beurteilen Sie die Ausgabe glätten)

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

Antwort

9

Sie findContours verwenden sollte die größte Kontur ein zu erkennen, nachdem diese Kontur mit fill Parameter gegründet draw -1 mit der Methode drawContours?. Hier ist ein nützlicher Link: http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

+0

danke! Ich habe eine Ausgabe, die näher an der gewünschten Ausgabe ist. Darf ich fragen, wie ich die Ränder der Ausgabe glätten kann? –

+1

Versuchen Sie, Glättung oder Bluring zu verwenden. OpenCV hat diese Funktionen. – ArtemStorozhuk

+0

Ich habe die Funktion pyrMeanShiftFiltering() benutzt, um sie glatter aussehen zu lassen. –