#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'