2011-12-11 12 views
29

contours खोजते समय, मैंने CV_RETR_CCOMP तर्क का उपयोग किया। यह दो स्तर पदानुक्रम बनाने वाला माना जाता है - पहला स्तर बाहरी रूपों के लिए होता है, दूसरा स्तर छेद की सीमाओं के लिए होता है। हालांकि, मैंने पहले कभी पदानुक्रम का उपयोग नहीं किया है इसलिए मैं इससे परिचित नहीं हूं।OpenCV में findContours() में पदानुक्रम का उपयोग करना?

क्या कोई मुझे छेद की सीमाओं तक पहुंचने के तरीके पर निर्देश दे सकता है? मैं बाहरी रूपों को नजरअंदाज करना चाहता हूं और केवल छेद सीमाएं खींचना चाहता हूं। कोड उदाहरणों की सराहना की जाएगी। मैं सी ++ इंटरफ़ेस का उपयोग नहीं कर रहा हूं, इसलिए कृपया सी फ़ंक्शंस का सुझाव न दें (यानी cvFindContours() के बजाय findContours() का उपयोग करें। hierarchy[idx][{0,1,2,3}]={next contour (same level), previous contour (same level), child contour, parent contour}

CV_RETR_CCOMP, बाहरी आकृति और छेद के एक पदानुक्रम रिटर्न:

+0

सी ++ संस्करण और सी संस्करण के बीच जाना तुच्छ है। FYI करें। –

उत्तर

36

पदानुक्रम findContours द्वारा दिया निम्नलिखित रूप है। इसका मतलब है hierarchy[idx] के तत्व 2 और 3 में इनमें से अधिकतर 1 के बराबर नहीं हैं: यानी, प्रत्येक तत्व में कोई माता-पिता या बच्चा नहीं है, या माता-पिता नहीं, लेकिन कोई बच्चा नहीं है, या कोई बच्चा नहीं है लेकिन कोई अभिभावक नहीं है।

माता-पिता के साथ एक तत्व लेकिन कोई बच्चा छेद की सीमा नहीं होगा।

इसका मतलब है कि आप मूल रूप से hierarchy[idx] से गुजरते हैं और hierarchy[idx][3]>-1 के साथ कुछ भी आकर्षित करते हैं।

कुछ की तरह (। अजगर में काम करता है, लेकिन परीक्षण नहीं किया सी ++ आइडिया हालांकि ठीक है।):

findContours(image, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); 

if (!contours.empty() && !hierarchy.empty()) { 

    // loop through the contours/hierarchy 
    for (int i=0; i<contours.size(); i++) { 

     // look for hierarchy[i][3]!=-1, ie hole boundaries 
     if (hierarchy[i][3] != -1) { 
      // random colour 
      Scalar colour((rand()&255), (rand()&255), (rand()&255)); 
      drawContours(outImage, contours, i, colour); 
     } 
    } 
} 
+1

@ फ़हराद सुनिश्चित करें कि आप कुछ परीक्षण करें। पदानुक्रम आप जो उम्मीद करते हैं वह नहीं हो सकता है। मैंने http://stackoverflow.com/questions/8449378/finding-contours-in-opencv से अपनी छवि के साथ यह कोशिश की और छवि फ्रेम एक अभिभावक था, बाहरी समोच्च एक बच्चा था, और आंतरिक समोच्च न तो था। – SSteve

+0

@ फहराद क्षमा करें, मेरा मतलब था कि छवि फ्रेम एक बच्चा था और सर्कल का बाहरी समोच्च माता-पिता था। – SSteve

+0

धन्यवाद, मुझे लगता है कि मुझे इसके चारों ओर एक रास्ता खोजना होगा। – fdh

3

AFAIK जब CV_RETR_CCOMP का उपयोग कर, सभी छेद एक ही स्तर पर कर रहे हैं।

int firstHoleIndex = hierarchy[0][2]; 
for (int i = firstHoleIndex; i >= 0 ; i = hierarchy[i][0]) 
// contours.at(i) is a hole. Do something with it. 
संबंधित मुद्दे