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日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境