在使用plib检测人脸特征点的过程中由于各种原因难免会遇到特征点定位不准确的情况。这时,如果能够手动修改来移动特征点的位置,后续工作则可以更好地得以完成。
由于openCV的画图工具会覆盖原来的图片,这里我通过手动保存被修改像素的办法实现移动定位点而不损害原来图像。
代码思路:先获得每个landmark的坐标,将坐标对应的点的像素(一个7 * 7 * 3的array矩阵)保存在IniPointColor
数组中。
在鼠标左键单击时,如果单击位置与某个点足够接近,那么该点被选中,LButtonFirstAction
与MovingPoint
设为真。
鼠标移动时,若LButtonFirstAction
为真,则将IniPointColor
中对应点的像素覆盖移动前位置的像素,否则庸PreviousPointColor
中的数值覆盖。之后再将新点的像素值保存在PreviousPointColor
中,并在新的位置绘制点。
import sys
import cv2
import dlib
import numpy as np
#定义全局变量
LButtonFirstAction = False
MovingPoint = False
PreviousPosition = (-1, -1)
PreviousPointColor = np.zeros([7, 7, 3])
MovingPNum = -1
IniPointColor = np.zeros([68, 7, 7, 3])
#获取训练模型
predictor_path = "shape_predictor_68_face_landmarks.dat"
#使用官方提供的模型构建特征提取器
predictor = dlib.shape_predictor(predictor_p