You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dlib唇部Landmark索引越界问题:如何获取唇部最后一个关键点?

问题原因与解决方法

错误原因

  1. Python切片的左闭右开特性:shape[61:68]只会提取索引61到67的元素(不包含68),因此lip数组长度为7,索引范围是0-6。尝试访问lip[7]必然触发索引越界错误。
  2. dlib地标索引误解:dlib的68点面部地标采用0-based索引,所有点的索引范围是0到67,不存在索引68的地标点。你混淆了1-based和0-based的计数方式,误以为存在68号点。

正确获取唇部地标的方法

1. 修正切片与索引对应关系

如果目标是提取内唇部地标(61到67),保持(mStart, mEnd) = (61, 68)的切片范围即可,同时调整距离计算的索引:

def lips_aspect_ratio(shape):
    # 内唇部地标索引:61-67(0-based),切片左闭右开所以用68作为结束
    (mStart, mEnd) = (61, 68)
    lip = shape[mStart:mEnd]
    
    # 索引对应:lip[0]=61,lip[1]=62,...,lip[6]=67
    A = dist.euclidean(lip[1], lip[6])  # 对应62和67(原错误的68不存在)
    B = dist.euclidean(lip[3], lip[5])  # 对应64和66
    C = dist.euclidean(lip[0], lip[4])  # 对应61和65

    mar = (A + B) / (2.0 * C)
    return mar

2. 确认唇部地标范围

标准dlib 68点地标中,唇部相关索引范围:

  • 嘴唇外轮廓:49-60(0-based)
  • 嘴唇内轮廓:61-67(0-based)
    如果你的需求需要包含外轮廓,可将切片范围改为(49, 61)提取外唇地标。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:57:08