我正在使用 opencv 制作人脸检测器,我制作了两个检测器,分别检测两个正面的哈拉卡斯卡特。然后,我编写了一段代码,只有当两个检测器检测到同一区域时,才会显示矩形。这样做效果很好,但当我把同样的代码放到函数中时,它就会返回非类型。如果我将矩形绘制放在函数内,它就会工作,但放在函数外就不行。
import numpy as np
import cv2 as cv #type:ignore
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
def findsimilar(f1, f2, error):
for (x, y, w, h) in f1:
for (x1, y1, w1, h1) in f2:
if x1 < x+error and x1 > x-error and y1 < y+error and y1 > y-error and w1 < w+error and w1 > w-error and h1 < h+error and h1 > h-error:
#cv.rectangle(frame, (x, y), (x + w, y + h), (0, 128, 255), 4) #在此处输入矩形代码使其工作(表明在此代码工作时存在 x、y、w、h 变量)
return x, y, w, h #但返回相同的值表示非etype
face_classifier = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_default.xml")
face_classifier_2 = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_alt.xml")
错误 = 25
while True:
ret, frame = cap.read()
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
face = face_classifier.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(40, 40))
face2 = face_classifier_2.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=15, minSize=(40, 40))
x、y、w、h = findsimilar(face2、face、错误)
print(x, y, w, h)# 由于某些原因,x、y、w、h 变量是 Nonetype 变量,因此这一行和下一行不起作用
frame.rectangle(frame, (x, y), (x + w, y + h), (0, 128, 255), 4)
show = cv.flip(frame, 1)
cv.imshow('frame', show)
如果 cv.waitKey(1) == ord('q'):
断开
cap.release()
cv.destroyAllWindows()
<即使我将矩形绘制代码放在函数内部,它也能正常工作,并显示出显示我的脸的正确矩形,表明 x、y、w、h 这些变量存在。运行上述代码时的错误信息
Traceback (most recent call last):
File "c:\Users\adhri\OneDrive\Documents\Adhrit\Python\opencv.py", line 30, in <module>;
x, y, w, h = findsimilar(face2, face, error)
TypeError:无法解包不可迭代的 NoneType 对象
代码中的问题在于,如果
findsimilar
函数没有找到匹配的矩形,它就不会返回任何内容。在 Python 中,如果一个函数没有明确返回值,它会隐式地返回
None
。因此,当尝试解包
x, y, w, h = findsimilar(face2, face, error)
中的
None
时,就会出现
TypeError
错误。
为了解决这个问题,需要确保的
findsimilar
函数总是有一个返回值。一种方法是在函数的最后添加一个默认返回值,例如
None
或一个表示未找到匹配的元组:
def findsimilar(f1, f2, error):
for (x, y, w, h) in f1:
for (x1, y1, w1, h1) in f2:
if x1 < x+error and x1 > x-error and y1 < y+error and y1 > y-error and w1 < w+error and w1 > w-error and h1 < h+error and h1 > h-error:
return x, y, w, h
return None # 如果没有找到匹配项,则返回 None
然后,需要在调用
findsimilar
函数后检查返回值是否为
None
:
result = findsimilar(face2, face, error)
if result is not None:
x, y, w, h = result
cv.rectangle(frame, (x, y), (x + w, y + h), (0, 128, 255), 4)
这样,代码只有在找到匹配的矩形时才会绘制矩形,从而避免了
TypeError
错误。