-
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()
결과값
'Data Science' 카테고리의 다른 글
Machine Learning with Python - Regression(Simple, Multiple, Non-linear regression) (0) 2022.08.19 Machine Learning with Python - Intro (0) 2022.08.18 Data Analysis with Python - Module Evaluation & Learning Objectvies (0) 2022.08.13 Data Analysis with Python - Model Development (0) 2022.08.13 Data Analysis with Python - Exploratory Data Analysis (0) 2022.08.13