为了用深度方法训练一个睁闭眼模型,这里不需要再提取特征,而是需要用到眼睛的原图,第一步就是把眼睛区域裁剪下来。
本文用的是opencv的检测库shape_predictor_68_face_landmarks.dat,得到68特征点后,根据特征点来裁剪眼睛ROI区域。
代码:
# _*_ coding:utf-8 _*_
from numpy import *
import numpy as np
import cv2
import dlib
import osdef draw_point(img,save):# cv2读取图像img = cv2.imread(img)img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)# 人脸数rectsrects = detector(img_gray, 0)for i in range(len(rects)):#68点的集合landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[i]).parts()])for idx, point in enumerate(landmarks):# 68点的坐标pos = (point[0, 0], point[0, 1])# 利用cv2.circle给每个特征点画一个圈,共68个cv2.circle(img, pos, 5, color=(0, 255, 0))# 利用cv2.putText输出1-68font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(idx), pos, font, 0.8, (0, 0, 255), 1,cv2.LINE_AA)cv2.imwrite(save,img)def get_roi(img,save1,save2):# cv2读取图像img = cv2.imread(img)img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)# 人脸数rectsrects = detector(img_gray, 0)for i in range(len(rects)):#68点的集合landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[i]).parts()])point=np.array(landmarks)# print(save1)#左眼ROI区域left1_x=point[17][0]left1_y=point[17][1]right1_x=point[21][0]right1_y=point[28][1]# 把眼睛区域裁剪出来left_eye_cut = img[left1_y:right1_y, left1_x:right1_x]# left_roi=cv2.resize(left_eye_cut, (200, 108), interpolation=cv2.INTER_CUBIC)cv2.imwrite(save1,left_roi)#右眼ROI区域left2_x=point[22][0]left2_y=point[22][1]right2_x=point[26][0]right2_y=point[28][1]# # 把眼睛区域裁剪出来right_eye_cut = img[left2_y:right2_y, left2_x:right2_x]# right_roi=cv2.resize(right_eye_cut, (200, 108), interpolation=cv2.INTER_CUBIC)cv2.imwrite(save2,right_roi)detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('class/shape_predictor_68_face_landmarks.dat')path='E:/000/pic/'
save_path1='E:/000/0/'
save_path2='E:/000/1/'
files=os.listdir(path)
n=0
for file in files:img=path+filename=file.split('.')[0]save1=save_path1+name+'-left_eye.jpg'save2=save_path2+name+'-right_eye.jpg'get_roi(img,save1,save2) #获取眼睛区域# draw_point(img,save) #把68点画出来n=n+1print('已裁剪第'+str(n)+'张照片:'+img)
这里分了左右眼,根据需要来定,得到结果: