영상인식실습2-1

Yk Lee·2022년 5월 29일
0

AI영상인식실습

목록 보기
12/16

얼굴이미지 세부 분석(1)

얼굴인식 알고리즘을 통해 얼굴이미지에서 동공 인식 및 다양한 추가 기능을 실습할 수 있다.

###OpenCV 기반 동공 위치 기반
얼굴과 눈의 위치는 OpenCV의 기능을 활용해 추출하나 동공 위치 인식은 코딩이 필요하다.

  • 동공은 눈 이미지 내에서 진한 검정색을 갖고 있는 위치임을 활용한다.
  • 일부 공개 코드가 있으나 구동하지 않아 새로 구현해야 한다.

Contour : 같은 값을 가진 곳을 연결한 선을 의미한다.

OpenCV에서는 binary 이미지에서 실행해야함
Cv2.findContours(): 픽셀 이미지 내에서 contour를 추출한다. 파이썬의 컨투어 추출 함수중 속도가 빠른 함수다.

Bound Rectangle 함수 : 어떤 형상을 전부 포함하는 최소 직사각형을 추출하는 기능

Cv2.boundingRect: 픽셀 이미지를 포함하는 직사각형 영역을 추출 후 직사각형의 좌표를 리턴한다.

convexHull()
이미지에서 convex Hull을 추출함

이미지 안에 있는 점들을 모두 포함하는 외곽을 만드는 기술이다.

Convex Hull과 Convexity Defects

convexityDefects()
Convex Hull을 추출하여 가장 크게 defect가 발생한 위치를 찾는다.

실습

import cv2

# Haar Cascade 로 생성된 분류기 파일 읽기
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

# 분석에 사용할 이미지를 gray scale 로 읽기
img = cv2.imread('000008.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# gray2 = cv2.equalizeHist(gray)

# 이미지에서 얼굴부분 인식
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

for (x,y,w,h) in faces:

    # 얼굴의 위치를 사각형(or 원형)으로 표시 
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    # cv2.circle(img,(x+int(w*0.5),y+int(h*0.5)),int(0.5*h),(255,0,0),2) # circle(image, center, radius, color, thickness)

    # 얼굴 인식 영역 내부에서만 눈 인식함
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray, 1.3, 5)

    # 눈이 검출된 회수만큼 눈 좌표 읽기
    for (ex,ey,ew,eh) in eyes:
        # 원본 이미지에 눈의 위치 표시
        # cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
        cv2.circle(roi_color,(ex+int(ew*0.5),ey+int(eh*0.5)),int(0.5*eh),(255,0,0),2) # circle(imae, center, radius, color, thickness)
        
        eye_gray = gray[y+ey:y+ey+eh, x+ex:x+ex+ew]
        eye_color = img[y+ey:y+ey+eh, x+ex:x+ex+ew]
        #gray 이미지에서 밝기가 30 이하인 부분만 추출한 것(동공이라고 보면된다.)
        _, threshold = cv2.threshold(eye_gray, 30, 255, cv2.THRESH_BINARY)
    
        cv2.imshow('img_gray',eye_gray)
        cv2.imshow('img_color',eye_color)
        cv2.imshow('img_threshold',threshold)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
       
        contours, _ = cv2.findContours(threshold, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
        
        for contour in contours:
            ratio_area = cv2.contourArea(contour)/eh/ew
            # print(ratio_area)
            if ratio_area > 0.003 and ratio_area < 0.009:
                # print(ratio_area)
                # contour = cv2.convexHull(contour)
                xc, yc, wc, hc = cv2.boundingRect(contour)
                # cv2.rectangle(img,(x+ex+xc, y+ey+yc),(x+ex+xc+, y+ey+yc+hc), (0,255,0),2 )
                cv2.circle(eye_color,(xc+int(wc*0.5),yc+int(hc*0.5)),int(0.5*wc),(0,255,0),2)
                # cv2.imshow('img',img)
                # cv2.waitKey(0)
                # cv2.destroyAllWindows()       

# 얼굴 및 눈 인식 결과를 이미지에 표
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

결과

profile
AR개발자지망생

0개의 댓글