Python: печатать только один раз внутри цикла

У меня есть код, в котором я хочу захватить видео с камеры. Я хочу использовать библиотеку Logging Python, чтобы получать сообщения в оболочке или экспортировать их в текстовый файл.

Вот часть моего кода, где внутри цикла while я хочу напечатать Камера успешно открыта

import numpy as np
import cv2
import logging as log

cap = cv2.VideoCapture('5.mpg')

while True:

    ret, image = cap.read()

    if ret == True:
        log.warning('Camera Opened Successfully')

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    clahe = cv2.createCLAHE(clipLimit = 15.0, tileGridSize=(8,8))
    gray1 = clahe.apply(gray)

но то, что я получаю в оболочке, это:

пока я не завершил работающий скрипт. Любая идея о том, как заставить его печатать только один раз.


person Tes3awy    schedule 23.06.2016    source источник
comment
Хм, используйте оператор if.   -  person pppery    schedule 23.06.2016
comment
Примечание: никогда не используйте if ret == True:. Просто используйте if ret:; это более Pythonic (а также более лаконично и немного быстрее). Если вам действительно нужно проверить именно True, а не какое-то другое истинное значение, вам понадобится if ret is True:, который, в отличие от if ret == True:, не будет обрабатывать ret значения 1, 1.0 и т. д. как равные True. Но вы редко даже этого хотите, просто отметьте if ret:. То же самое касается ret == False; вы почти всегда хотите not ret.   -  person ShadowRanger    schedule 24.06.2016


Ответы (6)


import numpy as np
import cv2
import logging as log

cap = cv2.VideoCapture('5.mpg')
hasOpened = False

while True:

    ret, image = cap.read()

    if ret and not hasOpened:
        log.warning('Camera Opened Successfully')
        hasOpened = True

Если вы хотите выйти из цикла после печати, следуйте ответу Мэтта. Эта опция будет продолжаться в цикле и будет напечатана только один раз.

person Carl 'Subzidion' Hiltbrunner    schedule 23.06.2016

Добавьте дополнительное логическое значение, чтобы отслеживать, распечатывали ли вы его раньше:

import numpy as np
import cv2
import logging as log

cap = cv2.VideoCapture('5.mpg')
printed = False

while True:

    ret, image = cap.read()

    if ret == True and not printed:
        log.warning('Camera Opened Successfully')
        printed = True
person matt.condit    schedule 23.06.2016

Вы должны вырваться из петли

import numpy as np
import cv2
import logging as log

cap = cv2.VideoCapture('5.mpg')

while True:

    ret, image = cap.read()

    if ret == True:
        log.warning('Camera Opened Successfully')
        break
person Matt Cremeens    schedule 23.06.2016
comment
Он просто выйдет из цикла while и продолжит работу после этого. У вас есть другие операторы в цикле while, которые вы хотите выполнить? - person Matt Cremeens; 23.06.2016
comment
Да, много заявлений. Но все в порядке, ответ опубликован, и он хорошо работает для меня, спасибо за вашу заботу :). - person Tes3awy; 23.06.2016

Вам нужно разорвать цикл while, так как вы хотите выйти из цикла, как только получите ret True, вы можете использовать:

ret = False
while not ret:

    ret, image = cap.read()

    if ret:
        log.warning('Camera Opened Successfully')
    # any other code
person dnit13    schedule 23.06.2016

Установите флаг для запуска журнала, а затем сделайте его ложным. ret нужно сделать False, когда вы будете готовы выйти из цикла, чтобы он вышел

import numpy as np
import cv2
import logging as log

cap = cv2.VideoCapture('5.mpg')
ret = True
logit = True
while ret:

    ret, image = cap.read()

    if logit == True:
        log.warning('Camera Opened Successfully')
        logit = False

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    clahe = cv2.createCLAHE(clipLimit = 15.0, tileGridSize=(8,8))
    gray1 = clahe.apply(gray)
    // process remainder of situation setting 
person sabbahillel    schedule 23.06.2016

Предполагая, что вы хотите использовать свой основной цикл для обработки логики вашего приложения, и не имеет смысла иметь один цикл для определения того, открыт ли он, а другой для работы с ним, тогда я думаю, что вы хотите установить переменную для определения если состояние изменилось.

import numpy as np
import cv2
import logging as log

cap = cv2.VideoCapture('5.mpg')
old_ret = False

while True:

    ret, image = cap.read()

    if old_ret == False and ret == True:
        old_red = True
        log.warning('Camera Opened Successfully')

    if ret == True:
        # Do other things that need the camera but no log
person IronSean    schedule 23.06.2016
comment
Вы забыли установить для old_ret значение True - person Aaron; 24.06.2016