python पायथन और ओपनसीवी-मेरे लेन का पता लगाने एल्गोरिदम सुधारना



algorithm opencv (1)

मुझे एक वीडियो से सड़क लेन का पता लगाना होगा। यह करने का मेरा तरीका है

  1. छवि टुकड़े टुकड़े करके क्षेत्रफल (आरओआई) निर्धारित करें (मध्य भाग पर ध्यान केंद्रित करें)
  2. ROI ग्रेस्केल करें
  3. cv2.equalizeHist साथ grayscaled ROI cv2.equalizeHist
  4. गाऊसी कलंक को लागू करें (3)
  5. cv2.adaptiveThreshold का उपयोग करके थ्रेशोल्ड (4)
  6. skimage.morphology.skeletonize का उपयोग करके skimage.morphology.skeletonize (5)
  7. cv2.HoughLines पर लागू करें। cv2.HoughLines (6)

cv2.HoughLines , मैं सेट अप इतना है कि:

  1. यदि rho पॉजिटिव है (जिसका मतलब है कि सीधी रेखा सही (नीचे-अप) पर rho है, यह केवल रेखा खींचती है अगर यह निश्चित कोण पर होती है (मैं कोण की सीमा निर्धारित करता हूं))
  2. यदि rho ऋणात्मक है (सीधा रेखा बाईं तरफ rho है, तो यह केवल रेखा खींचती है अगर यह निश्चित कोण पर है)

यह रेखाएं ड्राइंग के लिए मेरा कोड है:

lines = cv2.HoughLines(image_bin, 1, np.pi/180, 50)
    try:
        range = lines.shape[0]
    except AttributeError:
        range = 0

    for i in xrange(range):
        for rho, theta in lines[i]:
            if rho > 0 and (np.pi*1/10 < theta < np.pi*4/10):
                a = np.cos(theta)
                b = np.sin(theta)
                x0 = a * rho
                y0 = b * rho
                x1 = int(x0 + 1000 * (-b))
                y1 = int(y0 + 1000 * (a))
                x2 = int(x0 - 1000 * (-b))
                y2 = int(y0 - 1000 * (a))

                cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0))

            if rho < 0 and (np.pi*7/10 < theta < np.pi*9/10):
                a = np.cos(theta)
                b = np.sin(theta)
                x0 = a * rho
                y0 = b * rho
                x1 = int(x0 + 1000 * (-b))
                y1 = int(y0 + 1000 * (a))
                x2 = int(x0 - 1000 * (-b))
                y2 = int(y0 - 1000 * (a))

                cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0))

यदि मैंने cv2.HoughLines लिए ऊपर किया है, तो मैंने ऐसा नहीं किया है। cv2.HoughLines फ़ंक्शन, मेरा मानना ​​है कि बहुत सारे अनावश्यक लाइनें तैयार की जाएंगी।

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

यह मेरा परिणाम है:

मूल छवि:

आरओआई की समान हिस्टोग्राम, थ्रेसहोल्ड और कंकाल वाली छवि:

अंतिम परिणाम:


मैं आपके आवेदन के लिए संभाव्यता वाले हू रेखा रूपांतरण का उपयोग करने पर विचार करने की सलाह दूंगा। cv2.HoughLinesP के पायथन एपीआई में, यह फ़ंक्शन, cv2.HoughLinesP में लागू किया गया है। वह वास्तव में आपको लाइन सेगमेंट देगी, इसलिए आपको समापन बिंदुओं की गणना करने की आवश्यकता नहीं होगी। मानक हौग लाइन ट्रांसफ़ॉर्म की तुलना में यह बहुत तेज है।

हालांकि कुछ ट्रेड-ऑफ हैं उदाहरण के लिए, आपको लाइन खंडों को एक साथ सिलाई करने के लिए तर्क जोड़ना पड़ सकता है। दूसरी ओर, मैंने पाया है कि वास्तव में एक बुरी बात नहीं है मेरी खिलौना परियोजनाओं (एक स्व-ड्राइविंग लघु बस) में से एक ने इस दृष्टिकोण का इस्तेमाल किया, और अलग-अलग लाइन खंडों को एक साथ सिलाई करने के लिए इसे घुमावदार सड़कों से निपटना आसान बना दिया, जिसमें मानक हॉफ़ लाइन परिणत आपको कोई भी लाइन नहीं देगी ।

उम्मीद है की वो मदद करदे।

संपादित करें: रेखा खंड "सिलाई" के विवरण के बारे में, यह उस पर निर्भर करता है जिसे आप पूरा करने के लिए देख रहे हैं यदि आप बस सड़क को प्रदर्शित करना चाहते हैं, और आप लाइन सेगमेंट के बीच कुछ अंतराल के साथ संतुष्ट हैं, तो आपको कोई सिलाई करने की आवश्यकता नहीं हो सकती है - बस सभी रेखा क्षेत्रों को प्रदर्शित करें मेरे आवेदन में, मुझे लेन की वक्रता निर्धारित करने की जरूरत थी, इसलिए मैंने प्रत्येक सड़क लेन का एक मॉडल तैयार करने के लिए कुछ सिलाई की, जिसमें लेन का औसत ढलान शामिल होगा - जिसका उपयोग एक मॉड्यूल को नियंत्रित करने के लिए जिम्मेदार था सहायक के अनुसार पहियों को स्थानांतरित करने के लिए।

"सिलाई" के द्वारा मुझे विशेष रूप से परिष्कृत कुछ नहीं कहा जाता है, लेकिन मुझे यह पूरा करने के लिए किसी भी विशेष OpenCV फ़ंक्शन के बारे में पता नहीं है। मुझे उसी रेखा से संबंधित खंडों का एक तरीका चाहिए जो उसी लेन का हिस्सा था। इसलिए मैंने रेखा सेगमेंट को HoughLinesP से नीचे की ओर काम करते हुए छवि के ऊपर से वापस HoughLinesP संसाधित किया, और यह निर्धारित करने के लिए कि रेखा वर्गों का अंतर क्या होगा, प्रत्येक रेखा सेगमेंट के ढलान और वाई- HoughLinesP का उपयोग किया जाएगा।





hough-transform