2011-12-14 12 views
7

में एक समोच्च को नेस्टेड/एम्बेडेड किया गया है या नहीं, मेरे पास दो रूपरेखा हैं और मैं उनके बीच संबंध जांचना चाहता हूं (यदि उनमें से एक नेस्टेड है)। आम तौर पर, मैं findContours फ़ंक्शन का उपयोग CV_RETR_TREE पुनर्प्राप्ति मोड के साथ करता हूं। हालांकि, मैंने एक अलग स्रोत से contours प्राप्त किया (MSER विधि का उपयोग कर)। मैं वास्तव में न केवल contours है, बल्कि क्षेत्र मुखौटा भी अगर मदद करता है। उदाहरण के लिए, की सुविधा देता है मैं खंड अक्षर 'O', तो मैं निम्नलिखित मास्क या आकृति होता हैं:ओपनसीवी

1)

0 0 0 0 0 0 
0 1 1 1 1 0 
0 1 0 0 1 0 
0 1 0 0 1 0 
0 1 1 1 1 0 
0 0 0 0 0 0 

2)

0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 1 1 0 0 
0 0 1 1 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 

मैं आसानी से कैसे जांच सकता हूं कि दूसरा वाला पहला समोच्च है? मैंने बाध्यकारी बक्से के बीच संबंध की जांच करने के बारे में सोचा, लेकिन इसमें सभी संभावित मामलों को शामिल नहीं किया गया है।

उत्तर

6

cv::pointPolygonTest(InputArray contour, Point2f pt, bool measureDist) का उपयोग यह जानने के लिए करें कि एक समोच्च से एक बिंदु दूसरे के अंदर है या नहीं।

आप सीमा मामलों (पहला बिंदु आप चुनते हैं, दोनों बहुभुज के लिए आम है आदि) के लिए जाँच करने के लिए है

if(pointPolygonTest(contour, pointFromOtherContour, false) > 0) 
{ 
    // it is inside 
} 

समारोह निर्धारित करता है कि बिंदु, बाहर एक समोच्च के अंदर है, या एक सीमा पर बसा (या एक कशेरुक के साथ मेल खाता है)। यह सकारात्मक (अंदर), ऋणात्मक (बाहरी), या शून्य (किनारे पर) मान देता है, संगत रूप से।

measureDist=false, वापसी मूल्य क्रमश: +1, -1, और 0 है। अन्यथा, वापसी मूल्य बिंदु और निकटतम समोच्च किनारे के बीच एक हस्ताक्षरित दूरी है।

1

यदि आप जानते हैं कि समोच्च बंद हैं (4-कनेक्टेड भावना में), तो आप शायद रे-टू-इन्फिनिटी टेस्ट का उपयोग कर सकते हैं, जिसका परीक्षण आमतौर पर बंद बहुभुज के अंदर होते हैं या नहीं। (यह भी मानते हुए कि समोच्च पार नहीं करते हैं, जो संभवतः वे नहीं कर सकते हैं।)

उम्मीदवार समोच्च पर कोई बिंदु लें, और वहां से किसी भी दिशा में 'अनंतता' तक आगे बढ़ें (एक अक्ष को गठबंधन करें, के लिए कार्यान्वयन में आसानी): यदि आप अपनी छवि के किनारे पर सभी तरह से पहुंचते हैं और बाहरी समोच्च को की एक विषम संख्या को पार करते हैं तो आपके द्वारा शुरू किया गया समोच्च उस समोच्च के अंदर है।

'पार' बाहरी समोच्च वास्तव में थोड़ी मुश्किल है, उदाहरण के लिए:

. 1 1 1 1 1 1 1 
    . 1 . . X X X 1 
    . 1 . . X . X 1 
<-.-1-1-.-X X X 1 : here a naiive implementation counts two crossings 
    . . 1 1 1 1 1 1 

तो अगर एक किरण 'पार' एक बिंदु तुम सच में 3x3 पड़ोसी बिंदुओं पर विचार करने की जरूरत है पर एक समोच्च है परीक्षण करने के लिए। मुझे लगता है कि आप उन मामलों को कुछ इस तरह दिखाई का एक सेट के साथ खत्म हो जाएगा:

. . . 
<-1-1 1 // not crossing 
    . . . 

    1 . 1 
<-1-1 1 // not crossing 
    . . . 

    . . 1 
<-1-1 1 // crossing 
    . . . 

    1 . . 
<-1-1 1 // crossing 
    . . . 

मैं 100% यकीन है कि यह 3x3 के आधार पर क्रॉसिंग के लिए एक 4 जुड़े समोच्च एक सुसंगत परीक्षण का निर्माण संभव है नहीं कर रहा हूँ पड़ोस, लेकिन ऐसा लगता है कि यह है।

यह सब बाहरी रूप से बंद होने पर निर्भर करता है।