我们正在使用 DLIB 进行人脸检测,它被扩展到检测眼睛是睁着还是闭着。
它工作得非常好,但是对于某些图像它没有给出适当的点,眼睛完全闭上了。
例如正确的图像
如您所见,RED 点已正确放置。
错误检测如下图
如您所见,以蓝色绘制的点位置不正确。理想情况下,上下眼睑之间的距离应为零。
但这种情况并非如此。我们搜索是否可以进行任何调整,但没有运气。
替代解决方案可以是,在 dlib 处理后应用一些过滤器来检测虹膜等,但为此寻找更好的解决方案。
我们正在使用 DLIB 进行人脸检测,它被扩展到检测眼睛是睁着还是闭着。
它工作得非常好,但是对于某些图像它没有给出适当的点,眼睛完全闭上了。
例如正确的图像
如您所见,RED 点已正确放置。
错误检测如下图
如您所见,以蓝色绘制的点位置不正确。理想情况下,上下眼睑之间的距离应为零。
但这种情况并非如此。我们搜索是否可以进行任何调整,但没有运气。
替代解决方案可以是,在 dlib 处理后应用一些过滤器来检测虹膜等,但为此寻找更好的解决方案。
您可以做的改进很少。首先,您需要使用灰框进行更好的跟踪:
# Load frames from the camera
while True:
_, frame = cap.read()
# Use gray frame for better tracking
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
您可以做的第二个改进是创建一个新的面部标志(眼睛的顶部中心和眼睛的底部中心),您可以使用简单数学来做到这一点:
# Create new facial landmarks
def midpoint(p1, p2):
return int((p1.x + p2.x)/2), int((p1.y + p2.y)/2)
然后你应该有位于每只眼睛顶部和底部中心的点。你可能会问:那有什么帮助呢?好吧,您可以使用这些点并在它们之间画一条线,如下所示:
# Draw line between different facial landmarks
ver_line = cv2.line(frame, center_top, center_bottom, (0, 255, 0), 2)
然后用水平线做同样的事情:
# Draw line between different facial landmarks
hor_line = cv2.line(frame, left_point, right_point, (0, 255, 0), 2)
然后计算水平和垂直线的长度,并取其比值:
# Calculating length of the lines
hor_line_lenght = hypot(
(left_point[0] - right_point[0]), (left_point[1] - right_point[1]))
ver_line_lenght = hypot(
(center_top[0] - center_bottom[0]), (center_top[1] - center_bottom[1]))
ratio = hor_line_lenght/ver_line_lenght
return ratio