2012-10-19 20 views
8

मैं कुछ त्वचा का पता लगा रहा हूं लेकिन एक चिकनी नहीं हो सकता। नीचे दी गई छवि में नीचे दिए गए कोड का उपयोग करके इनपुट (बाएं) और आउटपुट (दाएं) शामिल हैं। अब, वांछित आउटपुट सबसे अधिक छवि (जो किनारों पर चिकनी है और इसमें छेद नहीं है) होना चाहिए था। मैं इस आउटपुट को कैसे प्राप्त करूं? शुरू करने के लिए एक नमूना कोड बहुत मददगार होगा।ओपनसीवी त्वचा का पता लगाने

इनपुट (बाएं) और गलत उत्पादन (दाएं):

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

चिकनाई या धुंधला उपयोग करने का प्रयास करें। ओपनसीवी में ये कार्य हैं। – ArtemStorozhuk

+0

मैंने pyrMeanShiftFiltering() फ़ंक्शन का उपयोग इस तरह से चिकनी दिखने के लिए किया था। –

1

आउटपुट की चिकनीता में सुधार करने के लिए, या दूसरे शब्दों में पता चला क्षेत्र में काले छेद को कम करने के परिणामस्वरूप छवि पर मोर्फोलॉजिकल ऑपरेशंस करने का प्रयास करें। निम्नलिखित दस्तावेज ओपनसीवी में एरोडिंग और फैलाने वाले कार्यों को बताते हैं। http://docs.opencv.org/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

संबंधित मुद्दे