@Perfect-Demo
2018-12-17T01:31:24.000000Z
字数 1461
阅读 1453
opencv+dlib
同样,这里用到了opencv以及dlib库,并且还有一点,用到了一个已经训练好了68特征点标注模型,所以先要导入该模型。
下面贴出该模型的链接:模型链接
然后就可以导入模型开始跑了。具体实现将直接贴出代码,然后代码意义在注释中讲得也比较清楚。
import dlibimport cv2import sysimport 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行,他可能由于笔误用错了变量,我这里更正了。