|
|
import cv2
|
|
|
import numpy as np
|
|
|
import dlib
|
|
|
from matplotlib import pyplot as plt
|
|
|
|
|
|
def idCardPicGenerate(img, type):
|
|
|
detector = dlib.get_frontal_face_detector() # 返回人脸的矩形框
|
|
|
# 返回人脸重要的68个点的位置
|
|
|
landmark_predictor = dlib.shape_predictor('E:/Digital_Image_Process-master/function/IdCardPicGenerate/shape_predictor_68_face_landmarks.dat')
|
|
|
print("11111")
|
|
|
if img.shape[2] == 4:
|
|
|
img = cv2.cvtColor(img,cv2.COLOR_RGBA2BGR)
|
|
|
imgg = img.copy()
|
|
|
t = img.shape
|
|
|
faces = detector(img, 1)
|
|
|
print(faces)
|
|
|
mask = np.zeros(img.shape[:2], np.uint8)
|
|
|
bgdModel = np.zeros((1, 65), np.float64)
|
|
|
fgdModel = np.zeros((1, 65), np.float64)
|
|
|
if (len(faces) > 0):
|
|
|
for k, d in enumerate(faces):
|
|
|
left = max(int((3 * d.left() - d.right()) / 2), 1)
|
|
|
top = max(int((3 * d.top() - d.bottom()) / 2) - 50, 1)
|
|
|
right = min(int((3 * d.right() - d.left()) / 2), t[1])
|
|
|
bottom = min(int((3 * d.bottom() - d.top()) / 2), t[0])
|
|
|
rect = (left, top, right, bottom)
|
|
|
rect_reg = (d.left(), d.top(), d.right(), d.bottom())
|
|
|
# shape = landmark_predictor(img, d)
|
|
|
shape = landmark_predictor(img, d)
|
|
|
print(shape)
|
|
|
else:
|
|
|
exit(0)
|
|
|
# mask会保存明显的背景像素为0,明显的前景像素为1,可能的背景像素为2,可能的前景像素为3
|
|
|
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 100,
|
|
|
cv2.GC_INIT_WITH_RECT) # 函数返回值为mask,bgdModel,fgdModel
|
|
|
# 利用mask做模板
|
|
|
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8') # 0和2做背景
|
|
|
|
|
|
# 背景颜色
|
|
|
bg_color = [(225, 166, 23), (0, 0, 255), (255, 255, 255)]
|
|
|
img = img * mask2[:, :, np.newaxis] # 使用蒙板来获取前景区域
|
|
|
erode = cv2.erode(img, None, iterations=1) # 腐蚀操作
|
|
|
dilate = cv2.dilate(erode, None, iterations=1) # 膨胀操作
|
|
|
for i in range(t[0]): # 高、
|
|
|
for j in range(t[1]):
|
|
|
if max(dilate[i, j]) <= 0:
|
|
|
dilate[i, j] = bg_color[type]
|
|
|
img = img[rect[1]:rect[3], rect[0]:rect[2]]
|
|
|
dilate = dilate[rect[1]:rect[3], rect[0]:rect[2]]
|
|
|
output_im = cv2.resize(dilate, (361, 381))
|
|
|
return output_im |