Глобальное имя «камера» не определено в python

#python #python-2.7 #opencv

#python #python-2.7 #opencv

Вопрос:

В этом скрипте :-

 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:Python27ScriptsServers.py", line 22, in Camera
    temp = get_image()
  File "C:Python27ScriptsServers.py", line 16, in get_image
    retval, im = camera.read()
NameError: global name 'camera' is not defined
  

Обновить
Посмотрите выше для обновленного кода

Комментарии:

1. На самом деле вам не нужно переходить global camera к функции, чтобы использовать ее.

2. @Nf4r Но, тем не менее, это не решает проблему

3. Я не вижу здесь никакой ошибки. Это исходный код, который вы используете?

4. @HellfireCharchitPb: Я заметил, что номера строк в сообщении об ошибке не соответствуют номерам строк в вашем коде. Итак, есть еще немного кода! Кроме того, обратите внимание, что если вы когда-либо вызовете Camera() , вы удалите ссылку на camera (последнюю строку). С этого момента оно не должно быть определено.

5. @M.Wymann Есть какой-то другой код, но я не думаю, что это будет иметь значение, однако я его обновлю

Ответ №1:

Вам также необходимо определить 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
  

Комментарии:

1. Вы имеете в виду вне функций?

2. Да, но оно удаляется внутри Camera . Извините, я забыл добавить это к своему ответу.

3. Ах да. Я пропустил эту часть. Хороший улов (y)

4. @HellfireCharchitPb Да, но я не заметил, что вы уже это сделали. Я обновил свой ответ, нацеленный на реальную проблему.

5. Теперь я получаю эту ошибку File "C:Python27ScriptsServers.py", line 16, in get_image retval, im = camera.read() AttributeError: 'NoneType' object has no attribute 'read'