m0_65704642 2023-05-21 19:18 采纳率: 0%
浏览 883

cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'train'


import os 
import cv2
from PIL import Image
import numpy as np

def getImageAndLabels(path):
    #储存人脸数据
    facesSamples=[]#将图片信息存储在数组当中
    #储存姓名数据
    ids=[]
    #储存图片信息
    imagePaths=[os.path.join(path,f) for f in os.listdir(path) ]
    face_detector= cv2.CascadeClassifier("C:\\Python\\pythonkku\\data\\haarcascade_frontalface_alt.xml")
#遍历图片,进行对照
    for imagePath in imagePaths:#把图片信息进行遍历将身份信息进行保存
    #打开图片,灰度化,PIL有五种不同模式1,L,RGB,RGBA,CMYK,YCbCr,I,F
        PIL_img=Image.open(imagePath).convert("L")#l方式打开,灰度图像
        PIL_img= cv2.cvtColor(np.array(PIL_img), cv2.COLOR_RGBA2BGRA) # PIL转cv2
        #将图片转化数组,以黑白深浅,灰度图片用数组来表示
        img_numpy=np.array(PIL_img,"uint8")#现在是一个列表
        #获取图片人脸特征提取特征
        faces=face_detector.detectMultiScale(img_numpy)
        #获取每张图片的姓名与id
        id=str(os.path.split(imagePath)[1].split(",")[0])
        #预防无面容照片
        for x,y,w,h in faces:
            ids.append(id)
            facesSamples.append(img_numpy[y:y+h,x:x+w])
        #打印脸部特征和id
        print("id",id)
        print("fs",facesSamples)#同一个人向量下面的特征
        return facesSamples,ids


if __name__=='__main__':
    path='C:\\Python\\Python38\\facerecord'
    #获取图像的数组和标签ids 与姓名
    faces,ids=getImageAndLabels(path)
    #加载识别器,在进行训练整合
    recognizer=cv2.face.LBPHFaceRecognizer_create()
    #训练
    recognizer.train(faces,np.array(ids))
    #保存文件
    recognizer.write("C:\\Python\\Python38\\trainer\\trainer.yml")

上述代码运行之后出现

img


这种提示bug:

Traceback (most recent call last):
File "C:\Users\午饭\Documents\Visual Studio 2022\练习\图像识别基本框架\图像识别基本框架.py", line 242, in
recognizer.train(faces,np.array(ids))
cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'train'

Overload resolution failed:

  • labels data type = 19 is not supported
  • Expected Ptrcv::UMat for argument 'labels'
  • 写回答

1条回答 默认 最新

  • 技术宅program 2023-05-21 19:30
    关注

    以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

    这是一个OpenCV的错误,原因是您传入的labels(ids)数据类型不支持。

    OpenCV的人脸识别器LBPHFaceRecognizer_create()中的train()方法需要传入labels为numpy数组或OpenCV的UMat类型。

    而您传入的ids是list类型,导致错误:

    python
    recognizer.train(faces,np.array(ids))  
    
    

    解决方法很简单,只需要将ids转换为numpy数组或UMat传入即可:

    python 
    ids = np.array(ids)
    recognizer.train(faces,ids)
    或者
    python
    ids = cv2.UMat(np.array(ids)) 
    recognizer.train(faces,ids)
    

    所以正确的代码应该是:

    python
    import os
    import cv2
    from PIL import Image
    import numpy as np
    
    # ...
    
    if __name__=='__main__':
        path='C:\\Python\\Python38\\facerecord'
        #获取图像的数组和标签ids 与姓名
        faces,ids=getImageAndLabels(path)
        
        # 将ids转换为numpy数组
        ids = np.array(ids)  
        
        #加载识别器,在进行训练整合
        recognizer=cv2.face.LBPHFaceRecognizer_create()
        #训练
        recognizer.train(faces,ids) 
        #保存文件
        recognizer.write("C:\\Python\\Python38\\trainer\\trainer.yml")
    
    

    这么简单的一个类型转换错误,编译时却无法提示,运行时才会报错,这也是Python开发需要注意的地方。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月21日

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络