pbj0812의 코딩 일기

[PYTHON] OpenCV로 민아누나 안경 씌우기 본문

ComputerLanguage_Program/PYTHON

[PYTHON] OpenCV로 민아누나 안경 씌우기

pbj0812 2020. 2. 14. 02:34

0. 목표

 - 신민아 누님께 안경 씌워 드리기

1. 준비물

 1) 사진

 2) OpenCV 설치

pip install opencv-python

2. 코드

 1) library 호출

import cv2

 2) 이미지 경로 입력

imgfile = '/Users/pbj0812/Desktop/jupyter_notebook/opencv/source/mina.jpg'

 3) cascade.xml 호출

  - 소스 위치(링크)

cascade_file = "/Users/pbj0812/Desktop/jupyter_notebook/opencv/opencv-master/data/haarcascades/haarcascade_eye.xml"

 4) 이미지 / xml 읽기

image = cv2.imread(imgfile)
cascade = cv2.CascadeClassifier(cascade_file)

 5) 눈 인식하기

eye_list = cascade.detectMultiScale(image, scaleFactor=1.1, minNeighbors=1, minSize=(150, 150))

 - 함수 참고(링크)

 6) 눈 표시하기

  - eye in eye_list를 통해 눈 마다의 값을 받아서 계산

  - 눈 사이의 선분을 추가하기 위해 각 위치 값을 list로 값을 저장한 뒤 for문 밖에서 계산

if len(eye_list) > 0:
  x_list = []
  y_list = []
  w_list = []
  h_list = []    
  color = (0, 0, 255)
  for eye in eye_list:
    x, y, w, h = eye
    x_list.append(x)
    y_list.append(y)
    w_list.append(w)
    h_list.append(h)
    # 원 그리기
    cv2.circle(image, (x+int(w/2), y+int(h/2)), 75, color, thickness = 8)
    print('x : ', x)
    print('y : ', y)
    print('w : ', w)
    print('h : ', h)
  print('c1 : ', (x_list[0]+int(w_list[0]/2), y_list[0]+int(h_list[0]/2)))
  print('c2 : ', (x_list[1]+int(w_list[1]/2), y_list[1]+int(h_list[1]/2)))    
  # 선분
  cv2.line(image, (x_list[0]+int(w_list[0]/2), y_list[0]+int(h_list[0]/2)), 
    (x_list[1]+int(w_list[1]/2), y_list[1]+int(h_list[1]/2)), color, thickness = 4)
  # 파일출력
  cv2.imwrite("/Users/pbj0812/Desktop/jupyter_notebook/opencv/source/test2.jpeg", image)

else:
  print("none") 

 * 안경 알고리즘

  (1) x, y 값은 좌상단을 나타내며, w, h 는 각 변의 길이를 나타냄

  (2) x와 y값에 w와 h의 절반 값 만을 더하면 눈의 중심 계산 가능 

3. 결과

 - 선분을 맞추기 위해 손으로 방정식을 풀었으나 미스 발생

4. 참고문헌

 1) OpenCV

 2) OpenCV github

 3) 참고 코드

 4) OpenCV 원 그리기

Comments