
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)
영상의 기하학적 변환
- 영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체 영상의 모양을 바꾸는 작업
- 영상의 크기 변환, 대칭 변환, 회전 변환 등



투시 변환 행렬 구하기

영상의 투시 변환

명함 똑바로 펴기 (수동)
사각형 꼭지점 좌표쌍을 이용한 투시 변환 [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]

