Dlib检测器
Dlib检测器包括Dlib人脸特征点检测器和Dlib人脸检测器 ;
1: Dlib人脸检测器:
先创建Dlib人脸检测器 , 返回的是个列表,用于存储矩形,有多少人脸就存储多少个矩形;
再创建Dlib人脸特征点检测器,根据矩形获得每个人脸的68个特征点的坐标,返回的是个列表,列表里存储的是元组,存储的是每个特征点的二维坐标;
import cv2
import dlib
img = cv2.imread('1.jpg') #格式为h , w , chanel
dlib_face_dector = dlib.get_frontal_face_detector() #创建人脸检测器;
list_box = dlib_face_dector(img , 1) #返回的是列表,用于存储矩形,有多少人脸就有多少矩形
#接下来我们可以利用矩形来创建人脸特征点
dlib_face_landmark_predictor = dlib.shape_predictor('官方训练好的.dat文件')#创建人脸特征点检测器
#接下来利用矩形并结合人脸特征点检测器来获得每个人脸的特征点的坐标
for box in list_box:
landmark_68 = dlib_face_landmark_predictor(img , box).parts()#返回的是68个特征点的二维坐标;返回的是个列表,里面存储68个元组,代表每个特征点的二维坐标;
#接下来可以利用opencv在图片上画出这些特征点
list_landmark_68 = [[p.x, p.y] for p in landmark_68] #将其转换为二维列表
for list in list_landmark_68:
tu = (list[0], list[1])
cv2.circle(img, tu, 2, color=(256, 0, 0))#在该图片上画出特征点;
cv2.imshow("name_photo", img) #显示该图片;
关于dlib检测器在3DDFA论文中的应用:(主要就是为了获得roi_box参数,此后,我们便可利用roi_box参数精确的从图片中剪切出人脸照片)
其中获得roi_box参数的方法一共有两种;
1:利用人脸特征点获得roi_box参数 ;先生成人脸特征点检测器,然后获得68个特征点的二维坐标;然后便可利用特征点坐标获得roi_box参数;
2:利用矩形获得roi_box参数;先利用人脸检测器获得矩形,然后将矩形变成bbox边界框,之后利用边界框获得roi_box参数 ;
三:关于区别用plt 和 opencv画图的区别:
用plt画图的说明:
from PIL import Image
import matplotlib as plt
img = Image.open(".jpg")#打开图片,返回的是个PIL类型的图片
#接下来可以操作torchvision.transform.toTensor或者toPilimage()等其他数据变化操作
plt.imshow(pil或者numpy)#形成一个热图,方便在该图上添加东西,但并不显示该图,在调用show函数后才会显示该图 ;注意该Numpy的维度只能是h,w,c
plt.show()#即可显示该图片;
用opencv画图:
import cv2
img = cv2.imread('.jpg')#读取图片后的形式为numpy , h,w,c;
#之后可以在该图上画各种东西,并不需要形成热图
cv2.circle(img, tuple, size, color)
#然后直接显示该图
cv2.imshow("name",img)