2011-12-18 12 views
9

मेरे पास 2 ए और बी समोच्च हैं और मैं यह जांचना चाहता हूं कि वे अंतर करते हैं या नहीं। दोनों ए और बी प्रकार सीवी की :: प्वाइंट वैक्टर हैं और विभिन्न आकारोंओपनसीवी समरूप चौराहे का पता लगाता है

के हैं चौराहे के लिए जाँच करने के लिए, मैं एक bitwise_and करने का प्रयास किया गया था। यह एक अपवाद फेंक रहा है क्योंकि इनपुट विभिन्न आकार के हैं। मैं यह कैसे तय करुं ?

संपादित करें:

संलग्न छवि मुद्दे के बारे में एक बेहतर विचार देना चाहिए। कार को नीली समोच्च और गुलाबी समोच्च द्वारा बाधा से ट्रैक किया जाता है। मुझे चौराहे की जांच करने की ज़रूरत है। enter image description here

उत्तर

11

एक सरल लेकिन शायद नहीं सबसे कुशल (??) जिस तरह से drawContours उपयोग करने के लिए दो चित्र बनाने के लिए किया जाएगा: एक कार की समोच्च और एक बाधा के समोच्च के साथ साथ।

फिर and उन्हें एक साथ, और जो भी बिंदु अभी भी सकारात्मक है, वह चौराहे के बिंदु होंगे।

कुछ स्यूडोकोड (मैं अजगर इंटरफ़ेस उपयोग करती हैं इसलिए सी ++ वाक्य रचना सही नहीं मिलेगा, लेकिन यह काफी सरल आप कन्वर्ट करने के लिए होना चाहिए):

import numpy as np # just for matrix manipulation, C/C++ use cv::Mat 
# find contours. 
contours,h = findContours(img, mode=RETR_LIST, method=CHAIN_APPROX_SIMPLE) 
# Suppose this has the contours of just the car and the obstacle. 

# create an image filled with zeros, single-channel, same size as img. 
blank = np.zeros(img.shape[0:2]) 

# copy each of the contours (assuming there's just two) to its own image. 
# Just fill with a '1'. 
img1 = drawContours(blank.copy(), contours, 0, 1) 
img2 = drawContours(blank.copy(), contours, 1, 1) 

# now AND the two together 
intersection = np.logical_and(img1, img2) 

# OR we could just add img1 to img2 and pick all points that sum to 2 (1+1=2): 
intersection2 = (img1+img2)==2 

अगर मैं intersection देखो मैं मिल जाएगा एक छवि जो 1 है जहां समोच्च छेड़छाड़ करते हैं और 0 हर जगह।

वैकल्पिक रूप से आप पूरे समोच्च में भरने (न केवल समोच्च लेकिन बहुत अंदर भरें) drawContours(blank.copy(), contours, 0, 1, thickness=-1) साथ और फिर intersection छवि आकृति के बीच चौराहे के क्षेत्र में शामिल होंगे सकता है।

+0

धन्यवाद! बहुत बढ़िया काम करने लगता है। – Madman

0

यदि आप पहले अपने वैक्टर को सॉर्ट करते हैं, तो आप किसी भी सुसंगत सॉर्टिंग मानदंड का उपयोग करके बहुत अधिक उपयोग कर सकते हैं, तो आप सीधे वेक्टरों पर std::set_intersection का उपयोग कर सकते हैं। छवि आकार की तुलना में समोच्च कम होने पर यह स्वीकार किए गए उत्तर से तेज़ हो सकता है।

0

मुझे इस प्रकार के प्रयोजनों के लिए Clipper लाइब्रेरी काफी उपयोगी मिली है। (यह cv::Point के वैक्टर को क्लिपर Path ऑब्जेक्ट्स में बदलने के लिए सीधा है।)

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