ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Line detection, findContours(), drawContours()
    AI\ML\DL/Computer Vision 2023. 8. 8. 20:31
    λ°˜μ‘ν˜•

    ✣

    Background

    μ•žμ„  ν¬μŠ€νŠΈμ—μ„œ κ²€μΆœν•œ 에지 λ§΅μ—μ„œ 에지 ν™”μ†ŒλŠ” 1, 에지가 μ•„λ‹Œ ν™”μ†ŒλŠ” 0으둜 ν‘œμ‹œλ˜μ—ˆλ‹€. μ‚¬λžŒ λˆˆμ—λŠ” 에지가 μ—°κ²°λœ μ„ λΆ„μœΌλ‘œ λ³΄μ΄λŠ”λ°, 에지 λ§΅μ—λŠ” μ—°κ²° 관계가 μ•”μ‹œμ μœΌλ‘œ λ‚˜νƒ€λ‚˜ μžˆμ„ 뿐 λͺ…μ‹œμ μœΌλ‘œ ν‘œν˜„λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. 

    이듀을 μ—°κ²°ν•˜μ—¬ κ²½κ³„μ„ μœΌλ‘œ λ³€ν™˜ν•˜κ³  경계선을 μ§μ„ μœΌλ‘œ λ³€ν™˜ν•˜λ©΄ 이후 단계인 물체 ν‘œν˜„μ΄λ‚˜ 인식에 무척 μœ λ¦¬ν•˜λ‹€. 

     

    경계선 μ°ΎκΈ°

    OpenCV의 findContours ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜λ©΄ 에지 λ§΅μ—μ„œ 경계선을 μ°Ύμ•„ μ—°μ†λœ μ λ“€μ˜ 집합을 리슀트둜 ν‘œν˜„ν•  수 μžˆλ‹€. 

    findCountours ν•¨μˆ˜μ— 경계선을 찾을 에지 μ˜μƒμ„ 첫번째 μΈμˆ˜μ— μž…λ ₯ν•˜λ©΄, 경계선을 μ°Ύμ•„μ„œ 객체에 μ €μž₯을 ν•΄μ€€λ‹€. 

     

    또 OpenCV의 drawContours ν•¨μˆ˜λŠ” μ˜μƒμ— 경계선을 κ·Έλ¦°λ‹€. 첫 번째 μΈμˆ˜λŠ” 경계선을 κ·Έλ € 넣을 μ˜μƒμ΄κ³ , 두 번째 μΈμˆ˜λŠ” 경계선을 μ €μž₯ν•œ 객체이닀. μ„Έ 번째 인수λ₯Ό -1둜 μ„€μ •ν•˜λ©΄ λͺ¨λ“  경계선을 κ·Έλ €μ£Όλ©° μ–‘μˆ˜λ‘œ μ„€μ •ν•˜λ©΄ ν•΄λ‹Ή λ²ˆν˜Έμ— ν•΄λ‹Ήν•˜λŠ” 경계선 ν•˜λ‚˜λ§Œ κ·Έλ €μ€€λ‹€. λ„€ 번째 μΈμˆ˜λŠ” 색과 λ‘κ»˜λ₯Ό μ§€μ •ν•œλ‹€. 

    import cv2 as cv
    import numpy as np
    
    img = cv.imread('light.jpg')
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    canny = cv.Canny(gray, 30,100)
    
    contour, hierarchy = cv.findContours(canny, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
    lcontour = []
    for i in range(len(contour)):
        if contour[i].shape[0] > 100:
            lcontour.append(contour[i])
    cv.drawContours(img, lcontour, -1, (0, 255, 0), 3)
    cv.imshow('Original with contours', img)
    cv.imshow('Canny', canny)
    cv.waitKey()
    cv.destroyAllWindows()

Designed by Tistory.