OpenCV_3

YJ·2023년 7월 5일
0

▷ 오늘 학습 계획: OpenCV 강의(6~8)

📖 Chapter 05_OpenCV 응용_1

1. 명함 검출과 인식 개요

  • 컬러 영상 → 그레이스케일 영상으로 변환
    (cv2.imread() 함수 또는 cv2.cvtColor함수)
    메모리 사용량, 연산 시간 측면에서 유리하다.

2. 영상의 이진화

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

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

OpenCV 이진화(임계값) 함수

  • cv2.threshold(src, thresh, maxval, type, dst=None)
    사용된 임계값과 입계값 영상이 반환된다.

    src: 입력 영상
    thresh: 임계값
    maxval: 결과 이진 영상에서 최대 픽셀 값(보통 255)

    type: 임계값에 의한 변환 함수 지정 또는 자동 임계값 설정 방법
    cv2.THRESH_BINARY → 이진화
    cv2.THRESH_BINARY_INV → 이진화 후 반전
    cv2.THRESH_BINARY | cv2.THRESH_OTSU → 자동 이진화

3. 객체의 외곽선 검출

객체 단위 분석

  • 레이블링: 영역 기반 모양 분석
    레이블맵, 바운딩 박스, 픽셀 개수, 무게 중심 좌표 반환

  • 외곽선 검출: 외곽선 기반 모양 분석
    외곽선 점들의 좌표와 계층 구조를 반환
    다양한 외곽선 처리 함수에서 활용 가능(면적 계산, 근사화 등)

외곽선 검출

객체의 외곽선 좌표를 모두 추출하는 작업, boundary tracking, contour traicing
바깥쪽 & 안쪽(홀) 외곽선 → 외곽선의 계층 구조도 표현 가능

  • 외곽선 객체 하나의 표현 방법
    numpy.ndarray
    shape=(K, 1, 2)(K: 외곽선 좌표 개수)
    dtype=numpy.int32

  • 여러 객체의 전체 외곽선 표현 방법
    객체 하나의 외곽선을 원소로 갖는 리스트
    len(리스트) = 전체 외곽선 개수(N)

외곽선 검출 함수

  • cv2.findContours(image, mode, method, contours=None, hierarchy=None, offset=None) → contours, hierarchy 반환

    image: 입력 영상

    mode: 외곽선 검출 모드
    cv2.RETR_EXTERNAL → 바깥쪽 외곽선만 검출
    cv2.RETR_LIST → 모든 외곽선 검출
    cv2.RETR_CCOMP → 2-레벨 계층 구조로 검출
    cv2.RETR_TREE → 전체 계층 구조로 검출

    method: 외곽선 근사화 방법(cv2.CHAIN_APPROX_NONE: 근사화X)

    contours: 검출된 외곽선 좌표(numpy.ndarray로 구성된 리스트)
    contours[i].shape = (K, 1, 2)
    contours[i].dtype = numpy.int32

    hierarchy: 외곽선 계층 정보
    offset: 좌표 값 이동(기본값: (0,0))

외곽선 그리기

  • cv2.drawContours(image, contours, countourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)

    image: 입출력 영상
    contours: cv2.findContours()로 구한 외곽선 좌표 정보
    contourIdx: 외곽선 인덱스, 음수(-1)로 지정하면 모든 외곽선
    thickness: 외곽선 두께, 0 미만이면 내부 채우기
    lineType: LINE_4, LINE_8, LINE_AA
    hierarchy: 외곽선 계층 정보
    maxLevel: 그리기를 수행할 최대 외곽선 레벨

4. OpenCV 외곽선 함수

  • cv2.arcLength(): 외곽선 길이 반환
  • cv2.contourArea(): 외곽선이 감싸는 영역의 면적 반환
  • cv2.boundingRect(): 주어진 점을 감싸는 최소 크기의 사각형 반환
  • cv2.minEnclosingCircle(): 주어진 점을 감싸는 최소 크기 원을 반환
  • cv2.minAreaRect(): 주어진 점을 감싸는 최소 크기 회전된 사각형 반환
  • cv2.minEnclosingTriangle(): 주어진 점을 감싸는 최소 크기 삼각형 반환
  • cv2.approxPolyDP(): 외곽선 근사화(단순화)

외곽선 길이

  • cv2.arcLength(curve, closed)

    curve: 외곽선 좌표
    closed: True면 폐곡선으로 간주

면적

  • cv2.contourArea(contour, oriented=None)

    contour: 외곽선 좌표
    oriented: True면 외곽선 진행 방향에 따라 부호 있는 면적 반환

외곽선 근사화

  • cv2.approxPolyDP(curve, epsilon, closed, approxCurve=None)

    curve: 입력 곡선 좌표
    epsilon: 근사화 정밀도 조절. 입력 곡선과 근사화 곡선 간의 최대 거리
    closed: True면 폐곡선으로 간주
    approxCurve: 근사화된 곡선 좌표

5. 명함 똑바로 펴기

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

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

  • 4개의 대응점 좌표를 알면 투시 변환 행렬을 구할 수 있다.

투시 변환 행렬

  • cv2.getPerspectiveTransform(src, dst, solveMethod=None)
    3×3 크기의 투시 변환 행렬 반환

    src: 4개의 원본 좌표점
    dst: 4개의 결과 좌표점

영상의 투시 변환

  • cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

    src: 입력 영상
    M: 3×3 변환 행렬
    dsize: 결과 영상의 크기. (0,0) 지정하면 src와 같은 크기
    dst: 출력 영상
    flags: 보간법(기본값 cv2.INTER_LINEAR)
    borderMode: 가장자리 픽셀 확장 방식
    borderValue: cv2.BORDER_CONSTANT일 때 사용할 상수 값(기본값 0)

cv2.approxPolyDP() 함수가 반환한 approx 좌표

  • 저장된 점들의 순서가 임의의 순서 → 순서 재조정
  • cv2.getPerspectiveTransform() 함수에 전달하기 위해
    shape(2차원), dtype 변경하기(float32)

📖 Chapter 06_OpenCV 응용_2

1. 얼굴 검출 개요

얼굴 검출

  • 인종, 조명, 표정, 가려짐 등의 변화에 매우 민감하다.
  • 얼굴 검출(face detection): 영상에서 얼굴의 위치를 검출하는 기법
  • 얼굴 인식(face recognition): 검출된 얼굴이 누구인지를 판결하는 기법
  • 얼굴 랜드마크 검출(face landmark detection): 눈, 눈썹, 코, 입 등의 형태까지 찾는 기법

얼굴 검출 응용

  • 카메라에서 얼굴 초점, 노출 맞추기
  • 얼굴(성별, 나이) 인식, 얼굴 랜드마크 검출을 위한 전처리 과정

얼굴 검출 기법의 역사

  • 1990년대: 초기 신경망 기법
    눈, 코, 입의 엣지 성분 검출 및 위치 관계 분석
    살색 영역 검출

  • 2000년대 초반: Viola-Jones 얼굴 검출기
    영상을 이용한 머신 런이 기법 도입, 빠르고 정확하게 얼굴 영역 검출
    유사 하르(Haar-like) 특징 사용
    AdaBoost에 기반한 강한 분류 성능
    cascade 방식으로 빠른 동작
    기존 얼굴 검출 방법보다 약 15배 빠르게 동작

  • 2010년대 중반 이후: 딥러닝 객체 검출 기법 응용
    Viola-Jones 방법보다 정확하고 안정적인 얼굴 검출 가능
    OpenCV에서 딥러닝 기법으로 학습된 모델을 사용하는 예제 파일 제공
    https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector

2. DNN 얼굴 검출

OpenCV DNN 모듈

  • 미리 학습된 딥러닝 모델을 이용하여 실행(forward pass, inference)

OpenCV DNN 얼굴 검출

  • SSD(Single Shot MultiBox Detector) 기반의 딥러닝 네트워크로 학습된 얼굴 검출 예제 지원
    https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector
  • 코드 작성 순서
    ⑴ net = cv2.dnn.readNet(model, config)
    ⑵ blob = cv2.dnn.blobFromImage(frame, 1, (300,300), (104,177,123))
    ⑶ net.setInput(blob)
    ⑷ out = net.forward()

3. 얼굴 검출 응용

영상의 크기 변환

  • cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

    src: 입력 영상
    dsize: 결과 영상 크기. (w, h). (0,0)이면 fx, fy 값으로 결정
    dst: 출력 영상
    fx, fy: x와 y방향 스케일 비율(scale factor).

    interpolation: 보간법 지정(기본값 cv2.INTER_LINEAR)
    cv2.INTER_NEAREST → 최근방 이웃 보간법
    cv2.INTER_LINEAR → 양선형 보간법(2×2 이웃 픽셀 참조)
    cv2.INTER_CUBIC → 3차 회선 보간법(4×4 이웃 픽셀 참조)
    cv2.INTER_LANCZOS4 → Lanczos 보간법(8×8 이웃 픽셀 참조)
    cv2.INTER_AREA → 영상 축소 시 효과적

▷ 내일 학습 계획: GPT 강의(1~3)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글