ursobad
ursobad
ursobad
전체 방문자
오늘
어제
  • 분류 전체보기 (116)
    • Emotion (35)
      • 파이썬 (10)
      • 문제 (10)
      • 인공지능 기초 (15)
    • Best of the Best (3)
    • Hacking (58)
      • HackCTF (12)
      • DreamHACK (7)
      • Webhacking.kr (19)
      • Root Me (6)
      • HTB (5)
      • 기타 (7)
      • 리버싱 소수전공 (2)
    • 기능반 (16)
      • 2과제 (14)
      • 3과제 (2)
    • 기록 (3)
    • 짧은 글들 (0)
    • 기타 (1)
    • Zombie (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BoB 면접
  • BoB 자소서
  • BoB 자기소개서
  • Python
  • 얼굴검출
  • BoB 자기소개
  • 머신러닝
  • 구독자 전용 다시보기
  • 파이썬
  • 123
  • 백준
  • 의사결정트리
  • Bob
  • OpenCV
  • 함수
  • BoB 11기
  • 앙상블
  • BoB 필기
  • KNN
  • BoB 질문

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ursobad

ursobad

Opencv 얼굴 인식(사진)
Emotion/인공지능 기초

Opencv 얼굴 인식(사진)

2020. 11. 27. 12:54

간단하게 opencv에서 제공하는 xml파일로 사진에서 얼굴, 눈, 상체 인식을 해봤다.

import cv2

face_classifier = cv2.CascadeClassifier('C:\\Users\\gotti\\AppData\\Local\\Programs\\Python\\Python38\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('C:\\Users\\gotti\\AppData\\Local\\Programs\\Python\\Python38\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml')

opencv를 불러온 후 opencv에서 제공하는 xml파일을 불러온다.

CascadeClassifier는 opencv에서 제공하는 가장 대표적인 api이다.

 

src = cv2.imread('face.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

imread를 이용하여 이미지를 불러온다.

그 후 cvtColor로 이미지를 흑백으로 바꾼다.

흑백으로 바꾸는 이유는 노이즈를 없애고 연산처리 속도를 빠르게 하면서 정확도를 향상시키기 위함이다.

(나는 상대경로로 불러왔지만 안되는 경우 절대경로를 이용하는 것을 추천한다)

 

faces = face_classifier.detectMultiScale(src_gray,1.1,3, minsize = (100,100))

xml과 내가 불러온 흑백 이미지 파일을 비교하여 얼굴을 검출한다.

.detectMultiScale(검출하고자 하는 이미지, 
		  이미지에서 얼굴 크기가 서로 다른 것을 보상해주는 값, 
                  오브젝트사이의 최소 간격,
                  오브젝트의 최소 크기
                  )

detectMultiScale는 오브젝트를 사각형으로 검출하는데 이때 사각형 좌측 상단의 좌표와 우측 하단의 좌표를 반환한다.

 

for (x,y,w,h) in faces:
    cv2.rectangle(src, (x,y), (x+w, y+h), (255,0,0),2)
    roi_gray = src_gray[y:y+h, x:x+w]
    roi_color = src[y:y+h, x:x+w]
.rectangle(이미지, (시작점 X,Y), (끝나는점 X,Y), 윤곽선 색, 선 굵기)

rectangle로 얼굴에 박스를 그린후 눈은 얼굴이 검출된 영역 안에서만 검출할 것이기 때문에 ROI를 생성한다.

 

  eyes = eye_cascade.detectMultiScale(roi_gray)
      for (ex, ey, ew, eh) in eyes:
          cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh),(0,255,0),2)

눈도 마찬가지로 한다.

 

cv2.imshow('Image view', src)
cv2.waitKey(0)
cv2.destroyAllWindows()

마지막으로 이미지를 띄운다.

만약 이미지가 너무 커서 잘릴경우 

a = 0.3
src = cv2.resize(src,(int(src.shape[1]*a), int(src.shape[0]*a)))

resize를 이용하여 이미지 크기를 줄여준다.

 

나름 잘 검출된 것을 볼 수 있다.

이 사진을 저장하고 싶다면

cv2.imwrite('face_cascade.jpg', src)

이 코드를 추가 하면 된다. 

 

전체 코드

import cv2

face_classifier = cv2.CascadeClassifier('C:\\Users\\gotti\\AppData\\Local\\Programs\\Python\\Python38\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('C:\\Users\\gotti\\AppData\\Local\\Programs\\Python\\Python38\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml')

src = cv2.imread('face.jpg')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_classifier.detectMultiScale(src_gray,1.1,3)

a = 0.3

for (x,y,w,h) in faces:
    cv2.rectangle(src, (x,y), (x+w, y+h), (255,0,0),2)
    roi_gray = src_gray[y:y+h, x:x+w]
    roi_color = src[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh),(0,255,0),2)

cv2.imwrite('face_cascade.jpg', src)
src = cv2.resize(src,(int(src.shape[1]*a), int(src.shape[0]*a)))
cv2.imshow('Image view', src)
cv2.waitKey(0)
cv2.destroyAllWindows()
저작자표시 (새창열림)

'Emotion > 인공지능 기초' 카테고리의 다른 글

Dlib을 이용하여 얼굴 랜드마크 찍기  (0) 2020.12.01
Opencv 얼굴 인식(영상)  (0) 2020.11.27
앙상블 학습법(Ensemble Learning)  (0) 2020.09.29
로지스틱 회귀(Logistic Regression)  (0) 2020.09.29
SVM(Support Vector Machine) 알고리즘  (0) 2020.09.24
    'Emotion/인공지능 기초' 카테고리의 다른 글
    • Dlib을 이용하여 얼굴 랜드마크 찍기
    • Opencv 얼굴 인식(영상)
    • 앙상블 학습법(Ensemble Learning)
    • 로지스틱 회귀(Logistic Regression)
    ursobad
    ursobad

    티스토리툴바