- 코너의 특징
- 평탄한 영역(flat) & 에지(edge) 영역은 고유한 위치를 찾기 어려움
- 코너(corner)는 변별력이 높은 편이며, 영상의 이동, 회전 변환에 강인함
- 다양한 코너 검출 방법
- 해리스 코너 응답 함수 계산
cv2.cornerHarris(src,blockSize,ksize,k,dst=None,borderType=None) -> dst
• src: 입력 단일채널 8 비트 또는 실수형 영상
• blockSize : 코너 응답 함수 계산에서 고려할 이웃 픽셀 크기 . 보통 2~5.
• ksize : ( 미분을 위한 ) 소벨 연산자를 위한 커널 크기 . 보통 3.
• k: 해리스 코너 검출 상수 보통 0.04~0.06)
• dst : 해리스 코너 응답 계수 . src 와 같은 크기의 행렬 (numpy.ndarray)
dtype=numpy.float32
• borderType : 가장자리 픽셀 확장 방식 . 기본값은 cv2.BORDER_DEFAULT.
- 추적하기 좋은 특징 코너 검출
cv2.goodFeaturesToTrack(image,maxCorners,qualitylevel,minDistance,corners=None,mask=None
blockSize=None,useHarrisDetector=None,k=None) -> corners
• image: 8 비트 또는 32 비트 실수 , 단일채널 영상
• maxCorners : 최대 코너 개수 . maxCorners <=0 이면 무제한 .
• qualityLevel : 코너점 결정을 위한 값 . 보통 0.01 ~ 0.1.
• minDistance : 코너점 사이의 최소 거리
• corners: 검출된 코너점 좌표 . numpy.ndarray shape=shape=(N, 1, 2) dtype=numpy.float32
• mask: 마스크 영상
• blockSize 코너 검출을 위한 블록 크기 . 기본값은 3.
• useHarrisDetector : 해리스 코너 방법 사용 여부 . 기본값은 False.
• k: 해리스 코너 검출 시 사용할 k 값
- FAST 코너 검출
cv2.FastFeatureDetector_create(threshold=None, nonmaxSuppression=None, type=None) -> retval
cv2.FastFeatureDetector.detect(image) -> keypoints
• threshold: 중심 픽셀 값과 주변 픽셀 값과의 차이 임계값 . 기본값은 10.
• nonmaxSuppression : 비최대 억제 수행 여부 . 기본값은 True.
• type: 코너 검출 방법 . 기본값은 cv2.FAST_FEATURE_DETECTOR_TYPE_9_16.
• retval FastFeatureDetector 객체
• image: (입력) 그레이스케일 영상
• keypoints : (출력) 검출된 코너점 정보 . cv2.KeyPoint 객체를 담은 리스트
cv2.KeyPoint 의 pt 멤버를 이용하여 코너 좌표 추출
pt [0] 은 x 좌표 , pt [1] 은 y 좌표 .
- GFTT 와 FAST 코너 검출 예제
import sys
import numpy as np
import cv2
src = cv2.imread('building.jpg', cv2.IMREAD_GRAYSCALE)
if src is None:
print('Image load failed!')
sys.exit()
tm=cv2.TickMeter()
# GFTT
tm.start()
corners=cv2.goodFeaturesToTrack(src,400,0.01,10)
tm.stop()
print('GFTT: {}ms'.format(tm.getTimeMilli()))
dst1=cv2.cvtColor(src,cv2.COLOR_GRAY2BGR)
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(dst1,pt,5,(0,0,255),2)
# FAST
tm.reset()
tm.start()
fast=cv2.FastFeatureDetector_create(60)
keypoints=fast.detect(src) #keypoints 라고 하는 opencv의 객체 (리스트)
tm.stop()
print('FAST: {}ms'.format(tm.getTimeMilli()))
dst2=cv2.cvtColor(src,cv2.COLOR_GRAY2BGR)
for kp in keypoints:
pt=(int(kp.pt[0]),int(kp.pt[1])) # (x,y)좌표
cv2.circle(dst2,pt,5,(0,0,255),2)
cv2.imshow('src',src)
cv2.imshow('dst1',dst1)
cv2.imshow('dst2',dst2)
cv2.waitKey()
cv2.destroyAllWindows()
- 코너 검출 방법 성능 비교
- FAST 방법의 반복 검출률이 대체로 높음
- 다만 FAST 방법은 노이즈에 민감함
'Computer Vision > opencv(python)' 카테고리의 다른 글
[57] 3) 특징점 기술자 (0) | 2021.03.25 |
---|---|
[56] 2) 특징점 검출 (0) | 2021.03.25 |
[54] 7) 간단 스노우앱 (0) | 2021.03.24 |
[53] 6) HOG 보행자 검출 (0) | 2021.03.24 |
[52] 5)캐스케이드 분류기: 얼굴 검출 (0) | 2021.03.24 |