Python

[Python] openCV : Corner Detect

SangRok Jung 2022. 11. 17. 12:14
반응형

Corner Detect(코너 검출)


▶ 특징 (Feature)

  • 영상으로부터 추출한 유용한 정보
  • 밝기 평균, 히스토그램, 에지, 코너
  • 전역 특징, 지역 특징

▶ 코너 검출 방법

  • 에지 방향이 급격히 변하는 부분
  • 꼭지점, 튀어나온 부분.
  • 코너는 다른 지역 특징에 비해 분별력이 높고 영상 전체에 분포

 

 

 

 

코너점 검출


▶ cv2.preCornerDetect(src, ksize)

  • dst의 local optima 값으로 검출
  • 미분 연산자의 의한 에지 방향 이용

 

▶ cv2.preCornerEigenValsAndVecs(src, blackSize, ksize)

  • src : input
  • blocksize : 이웃 윈도우 크기
  • ksize : sobel filter mask 
  • 영상 내 각 이웃의 covariance matrix M의 eigenvalue, eigenvector를 계산하여 코너 검출eigenvalue λ1,λ2λ1,λ2가 모두 작은 값: 평평한 영역에 있는 점
  • eigenvalue λ1,λ2λ1,λ2 둘 중 하나는 크고 하나는 작은 값: 에지
  • eigenvalue λ1,λ2λ1,λ2 두 값이 모두 큰 값: 코너

 

 

 

▶ findLocalMaxima()

  • 지격 극대값의 좌표를 points 배열에 검출하여 반환.
  • 결국 코너점 검출하는 방식을 사용하면 하나의 point가 출력되는 것이 아니라 코너점 Point에서 주변의 point까지 전부 출력하는 것을 알 수 있다.
  • 즉, 특정 크기의 지역내의 극대점을 하나로서 표현함으로써 코너점을 하나로 만들기 위한 Method.

▶ 계산 순서

  1. LocalMaxima를 dilate로서 계산
  2. LocalMaxima를 erode로서 계산
  3. LocalMaxima2는 LocalMinima보다 큰 값으로 계산
  4. LocalMaxima & LocalMinima2를 통하여 최대값 계산
  5. x,y 위치를 바꿔서 반환

 

 

 

 

 

 

해리스 코너 검출


1988년 해리스(C. Harris)가 개발한 코너 검출 방법은 코너 점 구분을 위한 기본적인 아이디어를 수학적으로 잘 정의하였다는 점에서 큰 의미가 있음. (Harris88)

코너 검출 연구는 1970년대 후반 부터 활발하게 진행.

영상의 특정 위치(x,y) 에서 Δx와 Δy만큼 떨어진 픽셀과의 밝기 차이를 다음 수식으로 표현.

 

w(x, y) : 균일한 값 도는 가우시안 형태의 가중치를 갖는 윈도우

E(Δx, Δy) 함수가 모든 방향으로 값이 크게 나타난다면 점(x, y)는 코너라고 간주 할 수 있음.

해리스는 수학적 기법을 적용하여 코너 응답 함수 R을 유도함.

  • K : 보통 0.01~0.06
  • R이 0보다 충분히 큰 양수 : 코너
  • R이 0에 가까운 실수 : 평탄한 영역
  • R이 0보다 작은 음수 : 에지

 

 

 

 

 

 

FAST 코너 검출 방법


  • 16개의 주변 픽셀과 밝기를 비교하여 코너 여부 판별
    • p점 주변 1번부터 16번 픽셀과의 밝기 비교
    • 주변 16개의 픽셀 중에서 점 p보다 충분히 밝거나 또는 충분히 어두운 픽셀이 9개 이상 연속으로 존재하면 코너로 정의 (원 논문은 12개)

다른 코너 탐지 보다 몇배 더 빠른 성능.

노이즈에 견고하지 못하며 Threshold에 결과 의존.

 

 

 

 

▶ FAST 코너 검출 방법

  1. cv2.FastFeatureDetector
  2. detect
  3. setNonmaxSuppression
  4. cv2.drawKeypoints

 

 

 

 

 

 

체스 보드 코너점 검출


▶ cv2.findChessboardCorners(img, patternSize, corners, flags]])

체스보드 패턴 코너점 검출

카메라 캘리브레이션에 자주 사용되는 체스보드 패턴 검출

  • image : input(chessboard)
  • patternSize : 체스보드 안의 한 칸 column, row size
  • corners : output
  • flag : 0이거나 다양한 값의 조합이 될 수 있음

▶ cv2.drawChessboardCorners(img, patternSize, corners, patternWasFound)

  • 검출된 코너점 배열
  • corners를 8비트 컬러 image에 표시
  • image : Destination lmage
  • patternSize : number of inner corners per a chessboard row and colummn
  • corner : 검출한 코너점
  • patternWasFound : Pattern을 검출하였나 안 하였나 판단하는 Flag

▶ cv2.findCirclesGrid(image, patternSize, centers, flags)

원형태의 격자에서 원의 중심점을 검출한다.

 

 

 

 

 

 

반응형

'Python' 카테고리의 다른 글

[Python] openCV : Moments  (0) 2022.11.17
[Python] openCV : Hough Transformation  (0) 2022.11.17
[Python] openCV : Canny Edge Detection  (0) 2022.11.17
[Python] openCV : Labeling  (0) 2022.11.17
[Python] openCV : Morphology  (0) 2022.11.17