Python: Print only one time inside a loop

Question:

I have a code where I want capture a video from a camera. I want to use Logging library of Python to get messages on the shell or export them to a text file.

Here is a part of my code where inside the while loop I want to print Camera Opened Successfully

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)

but what I get in the shell is this:

until I terminated the running script. Any idea on how to make it print only once.

Asked By: Tes3awy

||

Answers:

You must break out of the loop

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
Answered By: Matt Cremeens
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

If you want to break out of the loop after printing, follow Matt’s answer. This option will continue in the loop and only print once.

Add an extra boolean to track whether you have printed it out before:

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
Answered By: matt.condit

Assuming you want to use your main loop to handle your application logic, and it doesn’t make sense to have one loop for detecting if it is opened and another for working with it then I think what you want is to set a variable to determine if the state has changed.

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
Answered By: IronSean

You need to break the while loop, also since you would like to break out of the loop as soon as you get ret True you can use:

ret = False
while not ret:

    ret, image = cap.read()

    if ret:
        log.warning('Camera Opened Successfully')
    # any other code
Answered By: dnit13

Set a flag to trigger the log and then make it false. ret is to be made False when you are ready to exit the loop so that it will exit

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 
Answered By: sabbahillel

Another possibility is to take advantage of default mutable parameters in Python:

def print_once(string, bucket=[]):
    """
    Print only one time

    >>> print_once("foo")
    foo
    >>> print_once("foo")
    """
    if string not in bucket:
        print(string)
        bucket.append(string)
Answered By: guhur
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.