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()
결과값