@Perfect-Demo
2018-12-17T01:31:24.000000Z
字数 1461
阅读 1342
opencv+dlib
同样,这里用到了opencv以及dlib库,并且还有一点,用到了一个已经训练好了68特征点标注模型,所以先要导入该模型。
下面贴出该模型的链接:模型链接
然后就可以导入模型开始跑了。具体实现将直接贴出代码,然后代码意义在注释中讲得也比较清楚。
import dlib
import cv2
import sys
import os
# shape_predictor_68_face_landmarks.dat是进行人脸标定的模型,它是基于HOG特征的,这里是他所在的路径
current_path = os.getcwd() #获取当前路径
model_path = current_path + "/model/shape_predictor_68_face_landmarks.dat"
img_path = current_path + "/face/"
detector = dlib.get_frontal_face_detector() #获取人脸分类器
predictor = dlib.shape_predictor(model_path) #获取人脸检测器
#传入命令参数
for f in sys.argv[1:]:
face_path = img_path + f #获取人脸图片的路径加上文件名
#用opencv读取图片
img = cv2.imread(face_path, cv2.IMREAD_COLOR)
# 摘自官方文档:
# image is a numpy ndarray containing either an 8bit grayscale or RGB image.
# opencv读入的图片默认是bgr格式,我们需要将其转换为rgb格式;都是numpy的ndarray类。
b, g, r = cv2.split(img) #分离是三颜色通道
img = cv2.merge([r, g, b]) #把三种颜色组合成rgb新图片
dets = detector(img, 1) #调用dlib库对图片进行识别
print("这张图识别到 {} 张人脸".format(len(dets)))
for index, face in enumerate(dets):
#left()、top()、right()、bottom()都是dlib.rectangle类的方法,对应矩形四条边的位置
print("人脸{}的框位置为left:{} , top:{} , right:{} , bottom{}".format(index, face.left(), face.top(), face.right(), face.bottom()))
#这里不需要加框框了,需要检查那68个点
point_68 = predictor(img, face) #寻找那68个标定点
#现在需要将其显示出啦
for index, pt in enumerate(point_68.parts()):
print("Part {} 的位置是: {}".format(index, pt))
pt_pos = (pt.x, pt.y)
cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)
#现在将其显示出来
# 在新窗口中显示
cv2.namedWindow(face_path, cv2.WINDOW_AUTOSIZE)
cv2.imshow(face_path, img)
# 等待按键,随后退出,销毁窗口
k = cv2.waitKey(0)
cv2.destroyAllWindows()
最后进行一下勘误,我参考学习的博主代码中,对应我代码的44,45行,他可能由于笔误用错了变量,我这里更正了。