【问题标题】:Python TypeError: UMat() missing required argument 'ranges' (pos 2)Python TypeError:UMat()缺少必需的参数“范围”(位置2)
【发布时间】:2019-06-14 13:06:27
【问题描述】:

我正在编写一个面部识别程序,但我一直收到此错误,我很困惑我在网络上没有看到其他示例,其中人们在转换为 UMat 时包含范围

    Traceback (most recent call last):
  File "test.py", line 48, in <module>
    test_photos()
  File "test.py", line 40, in test_photos
    face, rect = detect_face(test_photo)
  File "test.py", line 15, in detect_face
    imgUMat = cv2.UMat(img)
TypeError: UMat() missing required argument 'ranges' (pos 2)

我的代码是

def detect_face(img):   
    imgUMat = cv2.UMat(img)
    gray = cv2.cvtColor(imgUMat, cv2.COLOR_BGR2GRAY)
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
    if (len(faces)==0):
        return None, None
    (x, y, w, h) = faces[0]
    gray = gray.get()
    return gray[y:y+h,x:x+w], faces[0]

def prepare_training_data():
    faces = []
    labels = []
    for img in photo_name_list: #a collection of file locations as strings
        image = cv2.imread(img)
        face, rect = detect_face(image)
        if face is not None:
            faces.append(face)
            labels.append(me)
    return faces, labels

def test_photos():
    face_recognizer = cv2.face.LBPHFaceRecognizer_create()
    faces, labels = prepare_training_data()
    face_recognizer.train(np.array(faces), np.array(labels))
    face, rect = detect_face(test_photo)
    label = face_recognizer.predict(face)
    if label == me:
        print("it's me")
    else:
        print("it's not me")


test_photos()

如果我不使用 UMat() 则会收到此错误:

Traceback (most recent call last):
  File "test.py", line 48, in <module>
    test_photos()
  File "test.py", line 40, in test_photos
    face, rect = detect_face(test_photo)
  File "test.py", line 16, in detect_face
    gray = cv2.cvtColor(imgUMat, cv2.COLOR_BGR2GRAY)
TypeError: Expected cv::UMat for argument 'src'

我使用的是 OpenCV 4.0.0,老实说我很困惑,因为据我所知,没有其他人必须使用 UMat 才能使用 cvtColor(),更不用说在 UMat() 中使用范围了。任何帮助将不胜感激。

【问题讨论】:

    标签: python python-3.x numpy opencv facial-identification


    【解决方案1】:

    不要使用cv2.Umat() 转换为UMat,只需将其传递给np.float32()。两者在所有意图和目的上都是相同的。

    您的代码如下所示:

    def detect_face(img):   
        imgUMat = np.float32(img)
        gray = cv2.cvtColor(imgUMat, cv2.COLOR_BGR2GRAY)
    

    【讨论】:

    • 如果img是PIL Image,那么imgUMat = np.array(img)
    【解决方案2】:

    我认为这与作为 cv2 函数输入的数组的数据类型有关。我也遇到了错误,当我执行arr.dtype 时,它显示为float16,当转换为float32 时,错误得到了解决。

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 2020-06-13
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多