Python中未定义全局名称'camera'

6
在这个脚本中:-
camera_port = 0
ramp_frames = 400
camera = cv2.VideoCapture(camera_port) 
def get_image():
  global camera
  retval, im = camera.read()
  return im

def Camera():
    global camera
    for i in xrange(ramp_frames):
     temp = get_image()
    print("Taking image...")
    camera_capture = get_image()
    file = "opencv.png"
    cv2.imwrite(file, camera_capture)
    del(camera)

def Sendmail():
    loop_value = 1
    while loop_value==1:
        try:
            urllib2.urlopen("https://google.com")
        except urllib2.URLError, e:
            print "Network currently down." 
            sleep(20)
        else:
            print "Up and running." 
            loop_value = 0
def Email():
    loop_value = 2
    while loop_value==2:
        try:
            Camera()
            Sendmail()
            yag = yagmail.SMTP('email',   'pass')
            yag.send('amitaagarwal565@gmail.com', subject = "This is    opencv.png", contents = 'opencv.png')
            print "done"
        except smtplib.SMTPAuthenticationError:
            print 'Retrying in 30 seconds'
            sleep(30)
        else:
            print 'Sent!'
            sleep(20)
            loop_value = 2

我收到了这个错误:

我做错了什么?我甚至全局定义了相机,而且是两次。请有人指出我的代码错误在哪里?我使用Python 2.7和Opencv模块。

File "C:\Python27\Scripts\Servers.py", line 22, in Camera
    temp = get_image()
  File "C:\Python27\Scripts\Servers.py", line 16, in get_image
    retval, im = camera.read()
NameError: global name 'camera' is not defined

更新 请查看上面的更新代码


你不需要在函数中传递“全局相机”以便使用它。 - Nf4r
@HellfireCharchitPb:我注意到错误信息中的行号与您代码中的行号不对应。因此,还有一些其他的代码!另外,请注意,如果您曾经调用过Camera(),则会删除对camera(最后一行)的引用。从这一点开始,它不应该被定义。 - M. Wymann
@M.Wymann 还有一些其他的代码,但我认为它不会有影响,不过我会更新它。 - Hellfire Charchit Pb
如果您调用Email(),应该发生以下情况。在第一次迭代中,当loop_value == 2时,将调用函数Camera()并删除camera。在第二次迭代中,当遇到相同的调用时,camera不再被定义(因为它已经被del(camera)删除)。也许您应该通过将loop_value设置为非2的值来避免第二次迭代。 - M. Wymann
@M.Wymann 像是 loop_value == 1 - Hellfire Charchit Pb
显示剩余3条评论
1个回答

5
你需要在方法的外部定义camera。使用 global 关键字告诉 Python 你将修改在外部定义的变量。如果你没有这样做,会返回错误信息。 编辑: 我没有注意到你已经在外部声明了camera。然而,当你尝试再次修改变量时,你在Camera() 方法内删除了该变量,这几乎有相同的效果。 编辑2: 现在我可以看到你的代码实际上是什么以及你打算做什么,我觉得你根本不应该使用全局的 camera,而是将其作为参数传递。这应该可以解决问题:
camera_port = 0
ramp_frames = 400

def get_image(camera):
    retval, im = camera.read()
    return im

def Camera(camera):
    for i in xrange(ramp_frames):
        temp = get_image(camera)
    print("Taking image...")
    camera_capture = get_image(camera)
    file = "opencv.png"
    cv2.imwrite(file, camera_capture)

def Sendmail():
    loop_value = 1
    while loop_value==1:
        try:
            urllib2.urlopen("https://google.com")
        except urllib2.URLError, e:
            print "Network currently down." 
            sleep(20)
        else:
            print "Up and running." 
            loop_value = 0

def Email():
    loop_value = 2
    while loop_value==2:
        try:
            camera = cv2.VideoCapture(camera_port) 
            Camera(camera)
            Sendmail()
            yag = yagmail.SMTP('email',   'pass')
            yag.send('amitaagarwal565@gmail.com', subject = "This is    opencv.png", contents = 'opencv.png')
            print "done"
        except smtplib.SMTPAuthenticationError:
            print 'Retrying in 30 seconds'
            sleep(30)
        else:
            print 'Sent!'
            sleep(20)
            loop_value = 2

是的,但是它被删除在 Camera 内部。我忘记将其添加到我的答案中,抱歉。 - lucasnadalutti
@HellfireCharchitPb 是的,但我没有注意到你已经这样做了。我已经更新了我的答案来解决实际问题。 - lucasnadalutti
我现在遇到了这个错误 File "C:\Python27\Scripts\Servers.py", line 16, in get_image retval, im = camera.read() AttributeError: 'NoneType' object has no attribute 'read' - Hellfire Charchit Pb
@MooingRawr 这是正确的,并且返回了我期望的结果(经过双重检查)。 - Hellfire Charchit Pb
是的,因为您将camera变量转换为None(在Camera方法的最后一行)然后您尝试在get_image中调用read()。恐怕我不能再提供更多帮助,因为我不知道您在Camera()方法的末尾对camera变量有什么期望。 - lucasnadalutti
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接