ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • goodFeaturesToTrack method 이용해 코너 검출시 Can't parse 'center'. Sequence item with index 0 has a wrong type 에러
    Data Science 2022. 8. 14. 14:47

    OpenCV - 코너 검출 공부중 다음과 같은 에러가 떴다. 코너 검출은 코너점들이 영상이나 이미지에서 고유한 특징을 갖고 있을 경우 변별력을 두기 위해서다. 이미지 인식 등에 쓰인다.

    기존 코드

    # 23강 - 코너 검출
    import cv2
    import numpy as np
    
    src = cv2.imread("cup.webp")
    dst = src.copy()
    
    gray = cv2.cvtColor(src, cv2.COLOR_RGB2GRAY) # 하얀색 객체 검출, 배경은 검은색, 검출하려는 물체는 하얀색으로 변형
    corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 5, blockSize=3, useHarrisDetector=True, k=0.03) # 코너 검출. 코너 품질 0.01에 최댓값 100, 최소거리 값 5
    
    for i in corners:
        cv2.circle(dst, tuple(i[0]), 3, (0, 0, 255), 2) # tuple([0]) 센터 값 문제 있음
    
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    실행시키자 다음과 같은 에러가 떴다

    ---------------------------------------------------------------------------
    error                                     Traceback (most recent call last)
    Input In [3], in <cell line: 11>()
          9 corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 5, blockSize=3, useHarrisDetector=True, k=0.03) # 코너 검출. 코너 품질 0.01에 최댓값 100, 최소거리 값 5
         11 for i in corners:
    ---> 12     cv2.circle(dst, tuple(i[0]), 3, (0, 0, 255), 2) # tuple([0]) 센터 값 문제 있음
         14 cv2.imshow("dst", dst)
         15 cv2.waitKey(0)
    
    error: OpenCV(4.6.0) :-1: error: (-5:Bad argument) in function 'circle'
    > Overload resolution failed:
    >  - Can't parse 'center'. Sequence item with index 0 has a wrong type
    >  - Can't parse 'center'. Sequence item with index 0 has a wrong type

    tuple(i[0]) 이 부분이 center값인데, type이 맞지 않아 에러가 발생. goodFeaturesToTrack method는 float type을 저장하므로 int로 반환하여 사용해야 한다.

    해결방법

    # 23강 - 코너 검출 soltion 과정... goodFeaturesToTrack method
    import cv2
    import numpy as np
    import pandas as pd
    
    src = cv2.imread("cup.webp")
    dst = src.copy()
    
    gray = cv2.cvtColor(src, cv2.COLOR_RGB2GRAY)
    corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 5, blockSize=3, useHarrisDetector=True, k=0.03) # 코너 검출. 코너 품질 0.01에 최댓값 100, 최소거리 값 5
    
    if corners is not None:
        for i in range(corners.shape[0]): # 코너 갯수만큼 반복문
            pt = (int(corners[i, 0, 0]), int(corners[i, 0, 1])) # x, y 좌표 받아오기
            cv2.circle(dst, pt, 3, (0, 0, 255), 2) # 받아온 위치에 원그리기
            
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    center값을 pt로 지정하는게 필요하다.

    출력값. 코너 품질 함수를 정의-> 가장 값이 큰 순서대로 정렬하여 반환한다.

     

    FastFeatureDetector_create() 를 이용한 검출 방법도 있다. 이 방법은 특정 픽셀 주변 16개 픽셀 값들을 조사해서 그 픽셀값이 가운데 픽셀보다 충분히 어둡거나 충분히 밝은 픽셀이 9개 이상 나타나면 코너라고 판단한다.

     

    # 23강 - 코너 검출 soltion 과정...2번째 방법, Fast 코너 검출
    import cv2
    import numpy as np
    import pandas as pd
    
    src = cv2.imread("cup.webp")
    dst = src.copy()
    
    fast = cv2.FastFeatureDetector_create(60) # 임계값 60 지정
    keypoints = fast.detect(dst) # keypoint 객체를 리스트로 받음
    
    dst2 = cv2.cvtColor(dst, cv2.COLOR_RGB2GRAY)
    
    for kp in keypoints:
        pt = (int(kp.pt[0]), int(kp.pt[1])) # kp 안에 pt좌표가 있음
        cv2.circle(dst2, pt, 3, (0,0,255), 2) # 받아온 위치에 원그리기
        
            
    cv2.imshow("dst2", dst2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    결과값

Designed by Joshua Chung.