Computer Vision/opencv(python)

[55] 9.특징점 검출과 매칭 1) 코너 검출

jwjwvison 2021. 3. 25. 09:50
  • 코너의 특징
    • 평탄한 영역(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