2012-10-19 119 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()函數使它看起來更順暢。 –