SyntaxError: name ‘bboxes’ is assigned to before global declaration
  出现这个报错的原因,可能是在同一个函数中,重复使用global声明导致报错,一般应在函数开头直接使用global声明,无需每次使用变量前都进行函数声明。

全局变量使用注意1

  global变量声明出现了问题,刚开始的时候我是这么写的:

def demo():
	global box
	...
if __name__ == '__main__':
	global box
	if not box:
		...

  这样写会一直出现“变量box未定义“的报错,正确的语法应该是,我们将主函数中的声明去掉,直接在全局变量定义一个box,然后再去在各个函数中使用global声明该变量。

box = []
def demo():
	global box
	...
if __name__ == '__main__':
	if not box:
		...

  这样写的话仍然有问题,我们发现再使用cv2.putText()函数时,会出现字体打印重影,原因是我们未在显示后及时清空box变量,正确写法如下:

 for x, y, w, h in face:
       cv2.rectangle(img, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=2)
       # cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)
       # 人脸识别
       ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
       global bboxes
       bboxes = []  # 这里必须进行变量清空操作,否者结果中会出现字体无法清空现象,字体叠加
       bboxes.append([x,y,x+w,x+h])  # bounding box 的坐标
       # print(x,y,x+w,x+h)
       # print('标签id:',ids,'置信评分:', confidence,数值越小,越可信)
       if confidence > 80:
           global warningtime
           warningtime += 1
           if warningtime > 100:
              warning()
              warningtime = 0
           cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 0), 1)
       else:
           # 以左上顶角为原点,向下向右为正方向
           cv2.putText(img, str(names[ids - 1]) + ' ' + 'with no mask', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 0), 1)

  我们可以看到bboxes变量(上面所说的box变量),在每次经过for循环确定人脸的位置后,是将四个角点变量存储在变量中,没循环一次,都应先将变量做一次清空操作,可以保证后续打印字体没有重影。

全局变量使用注意2

UnboundLocalError: local variable ‘names’ referenced before assignment
  在局部函数中更改全局变量,就会出现此错误。
  对于全局变量的修改:

  • 如果全局变量是int或者str,那么如果想要在函数中对函数变量进行修改,则需要先在函数内,声明其为global,再进行修改
  • 如果是list或者dict则可以直接修改
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐