我必须循环遍历图像文件夹并对每个图像进行编码。但每当我添加新图像时我都无法编码并收到错误

问题描述 投票:0回答:1

所以在这里我必须循环遍历文件 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

无法真正理解如何解决错误,我认为索引会动态增加。

python opencv computer-vision face-recognition
1个回答
0
投票

您遇到的错误“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中。

请记住根据您的要求处理图像中未检测到人脸的情况,无论您是想跳过此类图像还是以其他方式处理它们。

© www.soinside.com 2019 - 2024. All rights reserved.