OpenCV 응용: 명함 검출과 인식

JERRY·2025년 5월 24일
0

Deep Learning

목록 보기
32/35
post-thumbnail

1. 명함 검출과 인식 개요

일반적인 명함 사진의 조건

  • 명함은 흰색이고, 배경은 충분히 어둡다.
  • 명함은 각진 사각형 모양이고, 가로, 세로 비율을 9:5 이다.
  • 명함은 충분히 크게 촬영되었다

명함 검출과 인식 수행 과정

컬러 영상을 그레이스케일 영상으로 변환하여 사용

  • 컬러 정보가 크게 중요하지 않은 경우, 그레이스케일 영상으로 변환하여 처리하는 것이 메모리 사용량, 연산 시간 측면에서 유리함
  • OpenCV의 cv2.imread() 함수에서 그레이스케일 형식으로 영상을 불러오거나 또는 cv2.cvtColor() 함수를 사용하여 그레이스케일 형식으로 변경 가능

2. 영상의 이진화

영상의 이진화(binarization)

  • 영상의 픽셀 값을 0 또는 1(255)로 만드는 연산
    • 배경(background) vs. 객체(object)
    • 관심 영역 vs. 비관심 영역

그레이스케일 영상의 이진화

자동 임계값 결정 방법: 오츠(Otsu) 방법

  • 입력 영상이 배경(background)과 객체(object) 두 개로 구성되어 있다고 가정
    → bimodal histogram
  • 두 픽셀 분포의 분산의 합이 최소가 되는 임계값을 선택
  • 효과적인 수식 전개와 재귀식을 이용하여 빠르게 임계값을 결정

OpenCV 이진화(임계값) 함수

오츠 방법을 이용한 명함 영상의 자동 이진화 [namecard1.py]


3. 객체의 외곽선 검출

객체 단위 분석

객체의 외곽선 검출

외곽선 검출이란?

  • 객체의 외곽선 좌표를 모두 추출하는 작업. Boundary tracking. Contour tracing.
  • 바깥쪽 & 안쪽(홀) 외곽선 → 외곽선의 계층 구조도 표현 가능

외곽선 객체 하나의 표현 방법

  • numpy.ndarray
  • shape=(K, 1, 2) (K는 외곽선 좌표 개수)
  • dtype=numpy.int32

여러 객체의 전체 외곽선 표현 방법

  • "객체 하나의 외곽선(numpy.ndarray)"을 원소로 갖는 리스트
  • len(리스트) = 전체 외곽선 개수(N)

외곽선 검출 함수

외곽선 검출 함수 (con’t)

외곽선 그리기

이진화된 명함 영상에서 외곽선 검출 및 표현 [namecard2.py]


4. OpenCV 외곽선 함수

OpenCV 외곽선 함수

OpenCV 주요 외곽선 관련 함수

외곽선 길이 구하기

면적 구하기

외곽선 근사화

외곽선을 이용한 명함 검출

명함 영역 구하기 [namecard3.py]

  • 명함 객체는 충분히 크다.
  • 명함 객체는 사각형으로 근사화될 수 있다.

명함 영역 구하기 [namecard3.py]

  • 명함 객체는 충분히 크다.
  • 명함 객체는 사각형으로 근사화될 수 있다.

5. 명함 똑바로 펴기 (1)

영상의 기하학적 변환

영상의 기하학적 변환(geometric transformation)이란?

  • 영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체 영상의 모양을 바꾸는 작업
  • 영상의 크기 변환, 대칭 변환, 회전 변환 등

투시 변환 행렬 구하기

영상의 투시 변환

명함 똑바로 펴기 (수동)

사각형 꼭지점 좌표쌍을 이용한 투시 변환 [namecard4.py]


6. 명함 똑바로 펴기 (2)

cv2.approxPolyDP() 함수가 반환한 approx 좌표의 문제점

  • approx.shape=(4, 1, 2)
  • approx.dtype=int32
  • 저장된 점들의 순서가 임의의 순서이기 때문에 순서를 재조정해야 함

shape, dtype 변경하기

  • cv2.getPerepectiveTransform() 함수에 전달하기 위해 shape=(4, 2), dtype=float32로 변경해야 함
    corners = approx.reshape(4, 2).astype(np.float32)

꼭지점 순서 변경하기

명함 영역 사각형 똑바로 펴기 [namecard5.py]

0개의 댓글