간단하게 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 |