Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन में OpenCV से लाइन डिटेक्शन (हफ़ ट्रांसफॉर्म)

हफ़ ट्रांसफॉर्म (Hough Transform) एक फीचर एक्सट्रैक्शन तकनीक है जो गणितीय रूप में प्रस्तुत सरल आकृतियों (रेखा, वृत्त) का पता लगाती है, भले ही वे टूटी या विकृत हों।

रेखा का गणितीय प्रतिनिधित्व

पैरामीट्रिक फॉर्म: ρ = x·cos(θ) + y·sin(θ)

  • ρ (रो): मूल बिंदु से रेखा की लंबवत दूरी
  • θ (थीटा): लंबवत रेखा और क्षैतिज अक्ष के बीच कोण (काउंटर-क्लॉकवाइज़)

एक्युमुलेटर (Accumulator)

2D ऐरे जहां पंक्तियां ρ और स्तंभ θ दर्शाते हैं। प्रत्येक एज पिक्सेल के लिए, संभावित (ρ, θ) जोड़े की गणना करके एक्युमुलेटर में वोट बढ़ाया जाता है। सर्वाधिक वोट वाली सेल रेखा दर्शाती है।

OpenCV में हफ़ लाइन ट्रांसफॉर्म

cv2.HoughLines() - स्टैंडर्ड (ρ, θ) लौटाता है

cv2.HoughLinesP() - प्रोबेबलिस्टिक (x1, y1, x2, y2) लौटाता है, तेज और व्यावहारिक

पूरा उदाहरण: पार्किंग लॉट में लाइन डिटेक्शन

import cv2
import numpy as np

# इमेज लोड
img = cv2.imread('parkingLot1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# एज डिटेक्शन (Canny)
edges = cv2.Canny(gray, 75, 150)

# प्रोबेबलिस्टिक हफ़ लाइन ट्रांसफॉर्म
# rho=1 पिक्सेल, theta=1 डिग्री, threshold=30, maxLineGap=250
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, maxLineGap=250)

# डिटेक्टेड लाइन्स ड्रॉ करें
if lines is not None:
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(img, (x1, y1), (x2, y2), (0, 0, 128), 2)

# परिणाम दिखाएं
cv2.imshow('Edges', edges)
cv2.imshow('Lines Detected', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

पैरामीटर्स समझाया

पैरामीटरविवरणसामान्य मान
rhoदूरी रिज़ॉल्यूशन (पिक्सेल्स)1
thetaकोण रिज़ॉल्यूशन (रेडियन)np.pi/180 (1°)
thresholdन्यूनतम वोट्स रेखा के लिए30-100
minLineLengthन्यूनतम रेखा लंबाई10-100
maxLineGapअधिकतम गैप रेखा जोड़ने के लिए10-250

स्टैंडर्ड हफ़ लाइन्स (HoughLines)

lines = cv2.HoughLines(edges, 1, np.pi/180, 100)

if lines is not None:
    for line in lines:
        rho, theta = line[0]
        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(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

सर्कल डिटेक्शन (HoughCircles)

circles = cv2.HoughCircles(
    gray, 
    cv2.HOUGH_GRADIENT, 
    dp=1, 
    minDist=20,
    param1=50, 
    param2=30, 
    minRadius=10, 
    maxRadius=100
)

if circles is not None:
    circles = np.uint16(np.around(circles))
    for circle in circles[0, :]:
        cv2.circle(img, (circle[0], circle[1]), circle[2], (0, 255, 0), 2)
        cv2.circle(img, (circle[0], circle[1]), 2, (0, 0, 255), 3)

ट्यूनिंग टिप्स

  1. Canny थ्रेशोल्ड्स एडजस्ट करें (लोअर/अपर) एज क्वालिटी के लिए
  2. threshold कम करें अधिक रेखाओं के लिए, बढ़ाएं कम शोर के लिए
  3. minLineLength बढ़ाएं छोटे सेगमेंट्स हटाने के लिए
  4. maxLineGap बढ़ाएं टूटी रेखाएं जोड़ने के लिए
  5. ROI (Region of Interest) उपयोग करें प्रोसेसिंग क्षेत्र सीमित करने के लिए

ROI उदाहरण: केवल सड़क क्षेत्र

height, width = img.shape[:2]

# ट्रैपेजॉइड मास्क (सड़क क्षेत्र)
mask = np.zeros_like(gray)
roi_vertices = np.array([[
    (0, height),
    (width//2 - 50, height//2 + 50),
    (width//2 + 50, height//2 + 50),
    (width, height)
]], dtype=np.int32)

cv2.fillPoly(mask, roi_vertices, 255)
masked_edges = cv2.bitwise_and(edges, mask)

# फिर masked_edges पर HoughLinesP लागू करें

आवश्यक इंस्टॉलेशन

pip install opencv-python numpy

निष्कर्ष: HoughLinesP अधिकांश व्यावहारिक अनुप्रयोगों के लिए बेहतर है - यह सीधे लाइन सेगमेंट्स (एंडपॉइंट्स के साथ) देता है, अनंत रेखाओं के बजाय।

  1. Python OpenCV मॉड्यूल का उपयोग करके हिस्टोग्राम इक्वलाइज़ेशन Python OpenCV मॉड्यूल का उपयोग करके हिस्टोग्राम इक्वलाइज़ेशन

    यह इमेज प्रोसेसिंग में एक विधि है जो इमेज के हिस्टोग्राम का उपयोग करके कंट्रास्ट एडजस्टमेंट करती है। वास्तव में यह विधि आमतौर पर कई इमेजेस के ग्लोबल कंट्रास्ट को बढ़ाती है, विशेष रूप से जब इमेज का उपयोग योग्य डेटा क्लोज कंट्रास्ट वैल्यूज़ द्वारा दर्शाया जाता है और इस एडजस्टमेंट के माध्यम से, इंटेंसि

  1. पायथन OpenCV मॉड्यूल का उपयोग करके छवियों पर ज्यामितीय आकृतियाँ बनाना पायथन OpenCV मॉड्यूल का उपयोग करके छवियों पर ज्यामितीय आकृतियाँ बनाना

    OpenCV के बुनियादी संचालन में छवियों पर ड्राइंग करना शामिल है। रेखाएँ, वृत्त और आयत आदि जैसी विभिन्न ज्यामितीय आकृतियों को जोड़ने की क्षमता। अक्सर छवि विश्लेषण के साथ काम करते समय, हम छवि के एक हिस्से को हाइलाइट करना चाहते हैं, उदाहरण के लिए उस हिस्से को परिभाषित करने वाला एक आयत जोड़कर। साथ ही किस

  1. पायथन OpenCV का उपयोग करके वीडियो को रिवर्स मोड में चलाना पायथन OpenCV का उपयोग करके वीडियो को रिवर्स मोड में चलाना

    OpenCV का पूरा नाम ओपन सोर्स कंप्यूटर विजन है, इस लाइब्रेरी का उपयोग करके हम छवियों, वीडियो पर विभिन्न ऑपरेशन कर सकते हैं। OpenCV के अनुप्रयोग क्षेत्र चेहरा पहचान प्रणाली मोशन ट्रैकिंग कृत्रिम तंत्रिका नेटवर्क डीप न्यूरल नेटवर्क वीडियो स्ट्रीमिंग आदि। विंडोज पर स्थापित करने के लिए हम इस कमांड लाइ