本文主要是介绍人脸检测:正脸侧脸、是否仰头低头判断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 鼻子与两眼的向量正交时,设交点为a,理想情况下两眼到a距离的比值应该为1。
- 考虑到大脸和小脸,我们设m为两眼中心点,则判断是否是正脸侧脸式子为: d i s = ( a − m ) 2 ( x 1 − x 2 ) 2 dis = \frac{(a-m)^2}{(x1-x2)^2} dis=(x1−x2)2(a−m)2
- 设b为鼻子到嘴角向量正交时的交点,则鼻子到a的距离和到b的距离在不仰头低头情况下存在一定比例关系,并且应该在[1,2]之间。
- 数值越大,头越低。
def is_front_face(keypoints):# keypoints: 人脸关键点(左眼、右眼、鼻子、左嘴角、右嘴角)# 侧脸判断a = orthogonal_point(keypoints[0], keypoints[1], keypoints[2])# dis_front = abs(np.log(np.linalg.norm(keypoints[0] - a) / np.linalg.norm(keypoints[1] - a)))m = (keypoints[0] + keypoints[1]) / 2dis_front = np.linalg.norm(a - m) / np.maximum(np.linalg.norm(keypoints[0] - keypoints[1]), 1e-10)if dis_front > 0.5:return False# 抬头低头判断b = orthogonal_point(keypoints[3], keypoints[4], keypoints[2])dis_bow = np.linalg.norm(keypoints[2] - a) / np.maximum(np.linalg.norm(keypoints[2] - b), 1e-10)if dis_bow > 2.2 or dis_bow < 0.7:return Falsereturn Truedef orthogonal_point(x1, x2, x3):x1, y1 = x1[0], x1[1]x2, y2 = x2[0], x2[1]x3, y3 = x3[0], x3[1]# conb, lambdax = np.linalg.solve(np.array([[1, x1], [1, x2]]), np.array([y1, y2]))lambdax = (y2 - y1) / np.maximum((x2 - x1), 1e-10)conb = y1 - lambdax * x1ax = (x3 * (x2 - x1) + y3 * (y2 - y1) - (y2 - y1) * conb) / np.maximum((x2 - x1) + (y2 - y1) * lambdax, 1e-10)ay = lambdax * ax + conbreturn np.array([ax, ay])
这篇关于人脸检测:正脸侧脸、是否仰头低头判断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!