眼睛ROI区域裁剪

为了用深度方法训练一个睁闭眼模型,这里不需要再提取特征,而是需要用到眼睛的原图,第一步就是把眼睛区域裁剪下来。

本文用的是opencv的检测库shape_predictor_68_face_landmarks.dat,得到68特征点后,根据特征点来裁剪眼睛ROI区域。

代码:

# _*_ coding:utf-8 _*_
from numpy import *
import numpy as np
import cv2
import dlib
import os

def draw_point(img,save):
    # cv2读取图像
    img = cv2.imread(img)
    img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 人脸数rects
    rects = 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-68
            font = cv2.FONT_HERSHEY_SIMPLEX
            cv2.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)

    # 人脸数rects
    rects = 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+file
    name=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+1
    print('已裁剪第'+str(n)+'张照片:'+img)
    

这里分了左右眼,根据需要来定,得到结果:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值