2012-10-19 17 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; 
} 

変更されたコード(アスターの提案): (問題は今:?この引き分けはフィルパラメータで輪郭を設立した後、-1方法drawContoursを使用して、どのように出力を滑らかん)

#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

あなたは最大の輪郭ANを検出するために、findContoursを使用する必要があります。有用なリンク:http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

+0

ありがとうございました!私は目的の出力に近い出力を得ました。私は出力の端をどのようにスムーズにすることができるか尋ねることができますか? –

+1

スムージングやブラーリングをお試しください。 OpenCVにはこれらの機能があります。 – ArtemStorozhuk

+0

pyrMeanShiftFiltering()関数を使って、より滑らかに見えるようにしました。 –