Project/일지
Opencv로 꼭짓점 코너 검출
Stick0
2024. 4. 18. 00:25
객체 인식에 필요한 물건을 하나 간단하게 만들었다. 크기는 60x60x60mm
추후에 인식률 향상을 위해 배경을 따로 구하겠지만 테스트용으로 간단하게 진행했다.
Shi-Tomasi Corner Detection
검출에 사용한 Good Feature to Track함수의 원리를 간단하게 소개하겠다. 더 자세한 것은 후에 다시 공부하고 작성하겠다.
자료는 아래에서 참고했다.
이미지 상에 작은 창(window)을 두고 전체 이미지를 스캔하며 꼭짓점을 찾는다.
이 작은 창을 어느 방향으로든 이동시키면, 특히 그 창이 꼭짓점에 위치해 있다면 외관에 큰 변화가 생긴다.
평평한 영역은 어느 방향으로도 변화가 없을 것이다.
만약 모서리가 있다면, 모서리 방향으로는 주요한 변화가 없을 것이다.
이런 원리로 코너를 찾는다고 한다. 아래는 적용 코드이다.
import cv2
import numpy as np
# 이미지를 로드한다
image = cv2.imread('/home/jm/Pictures/RED_Cube.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# goodFeaturesToTrack 함수를 사용해 꼭짓점을 검출한다
corners = cv2.goodFeaturesToTrack(gray, maxCorners=4, qualityLevel=0.1, minDistance=10)
corners = np.int0(corners) # 좌표를 정수형으로 변환
# 각 꼭짓점을 이미지에 표시하고 좌표를 이미지에 출력한다
for i in corners:
x, y = i.ravel()
cv2.circle(image, (x, y), 6, (0, 255, 0), -1)
cv2.putText(image, f"({x},{y})", (x+5, y+5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1)
# 결과 이미지를 화면에 표시한다
cv2.imshow('Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
아래는 함수 설명
corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance, mask=None, blockSize=3, useHarrisDetector=False, k=0.04)
- image: 입력 이미지로, 8비트 또는 부동 소수점 그레이스케일 이미지여야 한다.
- maxCorners: 검출할 코너의 최대 수를 정한다. 만약 0으로 설정하면, 제한 없이 코너를 검출한다.
- qualityLevel: 코너의 품질을 결정하는 매개변수로, 가능한 최대 코너 응답값 (코너 강도 측정값)의 비율을 나타낸다. 일반적으로 0.01에서 0.1 사이의 값이 사용된다.
- minDistance: 검출된 코너들 간의 최소 가능 거리를 픽셀 단위로 지정한다. 이 값은 각 코너가 서로 충분히 떨어져 있도록 보장한다.
- mask: 선택적 매개변수로, 코너를 찾기 위해 검토할 이미지의 영역을 지정하는 이진 마스크를 설정할 수 있다.
- blockSize: 코너 검출을 위한 미분 계산에 사용되는 이웃 픽셀 블록의 크기를 정한다.
- useHarrisDetector: Harris 코너 검출기를 사용할지 여부를 bool 타입으로 지정한다. 기본값은 False이며, True로 설정하면 Harris 코너 알고리즘이 사용된다.
- k: Harris 코너 검출기를 사용할 경우 Harris 파라미터를 설정한다.
※Shi-Tomasi 알고리즘은 Harris 코너 검출 알고리즘의 개선 버전이다.
실행 결과