所以在这里我必须循环遍历文件 Images 并对每个图像进行编码并将编码保存在列表中。但我收到索引错误。为了精确定位,您可以检查完成编码的 findencodings 函数。以及我们存储列表路径名的 imgList。
import cv2
import face_recognition
import pickle
import os
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
from firebase_admin import storage
cred = credentials.Certificate("serviceAccountKey.json")
firebase_admin.initialize_app(cred,{
credentials
})
# Importing the student images
folderPath = 'Images'
pathList = os.listdir(folderPath)
print(pathList)
imgList = []
studentIds = []
for path in pathList:
imgList.append(cv2.imread(os.path.join(folderPath,path)))
studentIds.append(os.path.splitext(path)[0])
fileName = f'{folderPath}/{path}'
bucket = storage.bucket()
blob = bucket.blob(fileName)
blob.upload_from_filename(fileName)
#print(os.path.splitext(path)[0])
print(studentIds)
def findEncodings(imagesList):
encodeList = []
for img in imagesList:
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
encode = face_recognition.face_encodings(img)[0]
encodeList.append(encode)
return encodeList
print("encoding started...")
encodeListKnown = findEncodings(imgList)
encodingListKnowWithIds = [encodeListKnown, studentIds]
print("encoding complete")
file = open("EncodeFile.p",'wb')
pickle.dump(encodingListKnowWithIds, file)
file.close()
print("File Saved")
错误是
"Traceback (most recent call last):
File "D:\Major1\EncodeGenerator.py", line 45, in <module>
encodeListKnown = findEncodings(imgList)
File "D:\Major1\EncodeGenerator.py", line 41, in findEncodings
encode = face_recognition.face_encodings(img)[0]
IndexError: list index out of range
无法真正理解如何解决错误,我认为索引会动态增加。
您遇到的错误“IndexError:列表索引超出范围”是因为 face_recognition.face_encodings 函数在图像中找不到任何人脸,因此返回的列表中没有可访问的元素。为了避免此错误,您应该首先检查face_recognition.face_encodings函数是否检测到图像中的任何人脸,然后再尝试访问结果列表的第一个元素。您可以通过检查它返回的列表的长度来做到这一点。
这是处理这种情况的 findEncodings 函数的更新版本:
def findEncodings(imagesList): 编码列表 = [] 对于 imagesList 中的 img: img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 面部编码 = 面部识别.面部编码(img)
if len(face_encodings) > 0:
encodeList.append(face_encodings[0])
else:
# Handle the case where no face is detected in the image
print("No face detected in an image.")
# You can choose to skip this image or handle it differently.
return encodeList
通过此修改,如果图像中没有检测到人脸,它将打印一条消息并继续处理下一张图像。这应该可以帮助您避免“IndexError”并确保仅将有效的面部编码添加到encodeList中。
请记住根据您的要求处理图像中未检测到人脸的情况,无论您是想跳过此类图像还是以其他方式处理它们。