dlib唇部Landmark索引越界问题:如何获取唇部最后一个关键点?
问题原因与解决方法
错误原因
- Python切片的左闭右开特性:
shape[61:68]只会提取索引61到67的元素(不包含68),因此lip数组长度为7,索引范围是0-6。尝试访问lip[7]必然触发索引越界错误。 - 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
相关产品推荐
相关产品推荐

