这是怎么回事?我不明白

问题描述 投票:0回答:2
import cv2 as cv
import datetime
import numpy as np

def rescaleFrame(frame,scale=0.9):
    width=int(frame.shape[1]*scale)
    height=int(frame.shape[0]*scale)
    dimension=(width,height)
    return cv.resize(frame,dimension,interpolation=cv.INTER_AREA)

haar_cascade=cv.CascadeClassifier(r'C:\Users\Parth\Desktop\Project-III\faces.xml')
people = ['Parth Parlikar', 'Pradnya Parlikar','Rajiv Parlikar']
face_recognizer=cv.face.LBPHFaceRecognizer_create()
face_recognizer.read(r'C:\Users\Parth\Desktop\Project-III\face_trained.yml')

file = open(r'C:\Users\Parth\Desktop\face.txt', 'a')

capture = cv.VideoCapture(1)
while True:
    isTrue,frame=capture.read()
    haar_cascade=cv.CascadeClassifier('faces.xml')
    faces_rect=haar_cascade.detectMultiScale(frame, scaleFactor=1.1, minNeighbors=8)
    gray=cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    #print(f"Number of faces found = {len(faces_rect)}")
    cnt = len(faces_rect)

    for (x,y,w,h) in faces_rect:
        faces_roi=gray[y:y+h, x:x+h]
        label, confidence = face_recognizer.predict(faces_roi)
        print(f'Label={people[label]} with a confidence of {confidence}')
        for i in range (0,cnt):
          cv.putText(frame, str(people[label]),(i*400,40), cv.FONT_HERSHEY_COMPLEX, 1.0, (0,255,0), thickness=2)
        cv.rectangle(frame,(x,y), (x+w, y+h), (0,255,0), thickness=2)
        cv.imshow('video',frame)

    file.write(people[label])
    file.write(str(confidence))
    file.write(str(datetime.datetime.now()))
    file.write("\n")



    if cv.waitKey(20) & 0xFF==ord('d'):
        break

cv.imshow('Detected faces', frame)

file.close()


cv.waitKey(0)

在代码中我收到以下错误:

发生异常:NameError 名称“标签”未定义 文件“C:\Users\Parth\Desktop\Project-III ace_recog_video_PROTOTYPE.py”,第 41 行,位于 file.write(人物[标签]) ^^^^^ 名称错误:名称“标签”未定义

标签在上面已经定义了,怎么可能没有被定义呢?而且几分钟前代码运行得非常好。

python opencv nameerror
2个回答
0
投票

    for (x,y,w,h) in faces_rect:
        faces_roi=gray[y:y+h, x:x+h]
        label, confidence = face_recognizer.predict(faces_roi)
        print(f'Label={people[label]} with a confidence of {confidence}')
        for i in range (0,cnt):
          cv.putText(frame, str(people[label]),(i*400,40), cv.FONT_HERSHEY_COMPLEX, 1.0, (0,255,0), thickness=2)
        cv.rectangle(frame,(x,y), (x+w, y+h), (0,255,0), thickness=2)
        cv.imshow('video',frame)

    file.write(people[label])
    file.write(str(confidence))
    file.write(str(datetime.datetime.now()))
    file.write("\n")

label 是在 for 循环内部定义的,可能没有

faces_rect
,所以 label 最终没有被定义。

添加打印语句并检查。


0
投票

您遇到的错误是由于 label 变量未在 file.write 语句的范围内定义。看起来标签变量是在检测面部的循环内定义的,但如果没有找到面部,则可能并不总是定义它。要解决此问题,您应该在循环之前初始化标签变量,可能使用默认值,因此它始终在您尝试使用它之前定义。以下是修改代码的方法:

label = -1  # Initialize label with a default value
while True:
    isTrue, frame = capture.read()
    # ... (rest of your code)

    for (x, y, w, h) in faces_rect:
        faces_roi = gray[y:y+h, x:x+h]
        label, confidence = face_recognizer.predict(faces_roi)
        print(f'Label={people[label]} with a confidence of {confidence}')
        for i in range(0, cnt):
            cv.putText(frame, str(people[label]), (i*400, 40), cv.FONT_HERSHEY_COMPLEX, 1.0, (0, 255, 0), thickness=2)
        cv.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), thickness=2)
        cv.imshow('video', frame)

    # ... (rest of your code)

通过在循环之前使用默认值初始化标签,可以确保它始终被定义,即使在当前帧中没有检测到人脸也是如此。这应该可以解决您面临的 NameError 问题。

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