我正在通过
cv2.imshow
操作员运行视频源。大多数时候,当我在命令行中调用代码时,代码会运行,但偶尔会出现以下 NameError:
NameError: name 'masked' is not defined
但是,'masked' 在 cv2.imshow 中被调用之前是绝对定义的:
image = frame.array
miniframe = image
masked = cv2.bitwise_and(image, image, mask=circle_img)
cv2.imshow("frame", masked)
以这种方式定义“屏蔽”时会发生同样的事情:
image = frame.array
miniframe = image
M = np.float32([[1,0,x+w/2],[0,1,y+h/2]])
masked = cv2.warpAffine(image, M, (x+w, y+h))
cv2.imshow("frame", masked)
当
print masked
插入到 cv2.imshow
行上方时,它会导致数组打印为数字 - 当代码运行时。当它不工作时,它会导致 NameError traceback 指向 print masked
.
要明确的是,在任何一种情况下,NameError 似乎都是随机发生的,无需修改代码。所以,我可以运行它一次或 20 次就好了,但是它会突然在命令行中不起作用,并回溯到
cv2.imshow
行。有时,复制粘贴以前版本中的相同代码块会使它再次运行,但经过几次未经修改的尝试后,又回到了NameError
。
我已经阅读了Python NameError when var IS most defined,并使用
cat -A filename.py
检查不可见的控制字符。在取消和重新缩进之后,它又工作了 2 次,然后又回到了 NameError。
任何帮助将不胜感激!
找到解决方案。我的问题与未满足的“屏蔽”条件有关。这是一个依赖人脸检测的程序,但对于任何必须满足的随机、持续的条件,我的问题都是一样的。
故障排除步骤包括: - 回顾我的回溯 - 通过在开始时将脸放在镜头前来测试 IRL,然后在开始时将手放在镜头上。这证实了如果在启动时检测到人脸,程序将运行,但如果没有人脸则不会。
为了解决这个问题,我对
cv2.imshow("frame", masked)
使用了 try/except 条件,导致代码看起来像:
image = frame.array
miniframe = image
M = np.float32([[1,0,x+w/2],[0,1,y+h/2]])
masked = cv2.warpAffine(image, M, (x+w, y+h))
try:
cv2.imshow("frame", masked)
except NameError:
cv2.imshow("frame", image)
我是 rank 初学者,这真的教会了我测试和审查回溯的价值!
请导入谷歌补丁,代码是-
from google.colab.patches import cv2_imshow
完整的导入行应该是
导入cv2 将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt
从 google.colab.patches 导入 cv2_imshow