Data Science

goodFeaturesToTrack method 이용해 코너 검출시 Can't parse 'center'. Sequence item with index 0 has a wrong type 에러

Hiru_93 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()

결과값