#13-1. 템플릿 매칭

템플릿 매칭

  • 가장 쉽게하는 방법 : 뺄셈 → 매칭되면 0
  • 템플릿 영상을 전체영역에 대해 이동 → 유사도, 비유사도 계산
  • 모든 위치에서 유사도 계산 → 가장 밝은 픽셀 위치가 가장 유사한 부분
  • 연산량 ⬆️

OpenCV 템플릿 매칭

  • matchTemplate(image, templ, result, method, mask=noArray())
  • method : TemplateMatchModes중 하나 지정
    • TM_CCORR_NORMED 👍

res = cv2.matchTemplate(src, templ, cv2.TM_CCOEFF_NORMED)
# 0 ~ 1 사이의 실수 0 ~ 255사이 값으로 스케일링
res_norm = cv2.normalize(res, None, 0, 255,
													cv2.NORM_MINMAX, cv2.CV_8U)
_, maxv, _, maxloc = cv2.minMaxLoc(res_norm)
(th, tw) = templ.shape[:2]
cv2.rectangle(src, maxloc, (maxloc[0] + tw, maxloc[1] + th),
							(0, 0, 255), 2)

#13-2. 캐스케이드 분류기와 얼굴 검출

얼굴검출

  • 비올라-존스 얼굴 검출 알고리즘
    • boosting 기반 캐스케이드 분류기
    • 객체도 가능. 특히 얼굴 검출에 속도, 정확도 굳
    • 영상 24x24 크기로 정규화
    • 유사-하르 필터 집합으로부터 특징 정보 추출 → 얼굴 여부 판별
  • Ensemble(앙상블) 기법
    • random forest
    • 약한 분류기(Weak learner) 여러개 결합 → 투표 제일 많이 받은 것을 결과로
  • Boosting
    • Ensemble 기법 중 하나
    • 약한 분류기 이어나가면서 성능 개선
  1. 유사-하르 필터
    • 밝은 영역, 어두운 영역 어느정도 정해져있음
  2. Boosting 기법
    • 앙상블 기법의 하나
    • Weak learning
  3. Ensemble(앙상블} 기법
    • 동일한 학습 알고리즘 여러 모델을 학습
    • Weak learnener 결합 → single learner보다 나아짐

적분 영상

  • 누적 픽셀값
  • 특정 영역 = 4영역 - 2영역 - 3영역 + 1영역 = 4영역 + 1영역 - (2영역 + 3영역)

캐스케이드 분류기

  • 얼굴이 아닌 영역 빠르게 걸러 내는 방식

  • 단계

    1단계 : 특징 한 개 사용

    2단계 : 특징 다섯 개 사용

    → 하나라도 만족 안 하면 얼굴 아님

    3단계 : 특징 20개 사용

classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
if classifier.empty():
    print('XML load failed!')
    exit()
faces = classifier.detectMultiScale(src)
for (x, y, w, h) in faces:
    cv2.rectangle(src, (x, y), (x+w, y+h), (0, 0, 255), 2)
face_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_classifier = cv2.CascadeClassifier('haarcascade_eye.xml')
if face_classifier.empty() or eye_classifier.empty():
    print('XML load failed!')
    exit()
faces = face_classifier.detectMultiScale(src)
for (x, y, w, h) in faces:
    cv2.rectangle(src, (x, y), (x+w, y+h), (0, 0, 255), 2)
    faceROI = src[y : y+h, x : x+w]
    eyes = eye_classifier.detectMultiScale(faceROI)
    for (x2, y2, w2, h2) in eyes:
        center = (int(x2 + w2/2), int(y2 + h2/2))
        cv2.circle(faceROI, center, int(w2/2),
										(255, 0, 0), 2, cv2.LINE_AA)

#13-3. HOG 알고리즘과 보행자 검출

HOG 알고리즘

  • 다랄(Datal), 트릭스(Triggs)

  • Histograms of Oriented Gradients 그래디언트 방향 히스토그램

  • 그래디언트 크기, 방향

    • 사람 서있는 형태에 대한 특징 벡터 정의
    • 방향성분 0도 ~ 180도
  • SVM(Support Vector Machine) 알고리즘 이용

    • 입력 영상에서 보행자 위치 검출
    • 머신 러닝 일종
  • 64 x 128 크기의 영상에서 계산

  • 과정

    1. 입력 영상으로부터 그래디언트 계산 (크기, 방향 성분)

    2. 8x8크기 단위로 셀(cell) 분할

      → 64x128크기 영상 : 가로 8개, 세로 16개 셀 생성

    3. 각각의 셀로부터 그래디언트 방향 성분에 대한 히스토그램 구함

      → 방향성분 20도 단위로 구분 : 9개의 빈

    4. 인접한 네 개의 셀 합침 : block

      → 9x4=36개의 실수값으로 이루어진 방향 히스토그램

      → 가로 7개, 세로 15개 블록 생성

    5. 전체 블록에서 방향 히스토그램 추출

      → 실수값 개수 : (7x15) x 36 = 3780

보행자 검출

  • 보행자 영상, 아닌 영상 → HOG 특징 벡터 추출
  • SVM 알고리즘
    • 두 개의 클래스 효과적으로 분리
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
detected,_ = hog.detectMultiScale(src)
for (x, y, w, h) in detected:
    cv2.rectangle(src, (x, y), (x+w, y+h), (0,0,255), 3)

#13-4. QR 코드 검출

QR 코드 검출

  • 3모서리의 정사각형 패턴 특징점 검출
  • 정사각형 형태로 투시변환 필요
  • 흑백 격자 무늬 해석 → 문자열 추출

QRCodeDetector

  • QR 코드 영역 검출 : detect()
  • 문자열 추출 : decode()
  • 검출, 해석 한 번에 : detectAndDecode()
detector = cv2.QRCodeDetector()
info, points, _ = detector.detectAndDecode(src)
if points is not None:
    points = np.array(points, dtype=np.int32).reshape(4, 2)
    cv2.polylines(src, [points], True, (0, 255, 255), 2)
if len(info) > 0:
    cv2.putText(src, info, (10, 30), cv2.FONT_HERSHEY_DUPLEX, 1, (0,0,255), lineType=cv2.LINE_AA)
profile
숭실대학교 컴퓨터학부 21

0개의 댓글