1

我们正在使用 DLIB 进行人脸检测,它被扩展到检测眼睛是睁着还是闭着。

它工作得非常好,但是对于某些图像它没有给出适当的点,眼睛完全闭上了。

例如正确的图像

在此处输入图像描述

如您所见,RED 点已正确放置。

错误检测如下图

在此处输入图像描述

如您所见,以蓝色绘制的点位置不正确。理想情况下,上下眼睑之间的距离应为零。

但这种情况并非如此。我们搜索是否可以进行任何调整,但没有运气。

替代解决方案可以是,在 dlib 处理后应用一些过滤器来检测虹膜等,但为此寻找更好的解决方案。

4

1 回答 1

1

您可以做的改进很少。首先,您需要使用灰框进行更好的跟踪:

# 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
于 2019-09-12T22:42:47.857 回答