title: How to call a function once in a while loop
body: <p>I have a robotic code, that does the following:</p>
  <ol>
  <li>camera starts processing and taking images</li>
  <li>Mounting Holes (hough transform) function detection is activated</li>
  <li>The holes are drawn on the image</li>
  <li>approachcirlce function moves robot towards one of the set coordinates</li>
  </ol>
  <p>I have two issues :</p>
  <ol>
  <li>The mounting holes keep getting called even after detecting the coordinates once.</li>
  <li>The robot in the approachcircle function cant move to one coordinates then onto the other. It keeps going back and forth as the x and y aren't specifically set to finish the first set of coordinates first. i.e : between two circles it does not reach either centers as expected. it never reaches the center of a detected circle if its more than one</li>
  </ol>
  <p>I want the code to call the mountingholes function once and have the robot to move to each recorded coordinates, after the intial set of coordinates is done. I will have the robot move to another area and start doing the process again. I'm assuming the problem is that the functions are in the camera processing loop which is run indefinitely
  The code is below:</p>
  <pre><code>##Def:
  def approachcircle (r,t,z):
      move = robot.Pose()*transl(r,t,z)
      robot.MoveL(move) 
  def approacharea (z):
      move = robot.Pose()*transl(0,0,z)
      robot.MoveL(move) 
  def MountingHoles(img,thresh,r):
       minR = r
       CannyHighT = 50
       min_points = 15 #param2
       img_1= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
       #img3 = cv2.inRange(img_1, thresh, 255) 
       circles = cv.HoughCircles(img_1,cv.HOUGH_GRADIENT, 1, 2*minR, param1=CannyHighT,
                               param2=min_points, minRadius=minR, maxRadius=220)
       
       return circles
  
  #Installation
  from robolink import *  # RoboDK API
  from robodk import *  # Robot toolbox
  RDK = Robolink()
  pose = eye()
  ITEM_TYPE_ROBOT
  RDK = robolink.Robolink()
  robot = RDK.Item('TM12X')
  import_install('cv2', 'opencv-python')
  import cv2 as cv
  import numpy as np
  import numpy 
  #----------------------------------
  # Settings
  PROCESS_COUNT = -1  # How many frames to process before exiting. -1 means indefinitely.
  
  CAM_NAME = &quot;Camera&quot;
  
  DISPLAY_SETTINGS = True
  WDW_NAME_PARAMS = 'RoboDK - Blob detection parameters'
  
  DISPLAY_RESULT = True
  WDW_NAME_RESULTS = 'RoboDK - Blob detections1'
  
  # Calculate absolute XYZ position clicked from the camera in absolute coordinates:
  
  cam_item = RDK.Item(CAM_NAME, ITEM_TYPE_CAMERA)
  if not cam_item.Valid():
      raise Exception(&quot;Camera not found! %s&quot; % CAM_NAME)
  cam_item.setParam('Open', 1)  # Force the camera view to open
  
  
  #----------------------------------------------
  # Create an resizable result window
  if DISPLAY_RESULT:
      cv.namedWindow(WDW_NAME_RESULTS)  #, cv.WINDOW_NORMAL)
  
  #----------------------------------------------
  
  # capture = cv.VideoCapture(0)
  # retval, image = capture.read()
  
  #----------------------------------------------
  # Process camera frames
  count = 0
  while count &lt; PROCESS_COUNT or PROCESS_COUNT &lt; 0:
      print(&quot;=============================================&quot;)
      print(&quot;Processing image %i&quot; % count)
      count += 1
  
      #----------------------------------------------
      # Get the image from RoboDK
      bytes_img = RDK.Cam2D_Snapshot(&quot;&quot;, cam_item)
      if bytes_img == b'':
          raise
      # Image from RoboDK are BGR, uchar, (h,w,3)
      nparr = np.frombuffer(bytes_img, np.uint8)
      img = cv.imdecode(nparr, cv.IMREAD_UNCHANGED)
      if img is None or img.shape == ():
          raise
  
      #----------------------------------------------
      # Detect blobs
      keypoints = MountingHoles(img,250,50)
      i = 0
     
     
  
      #----------------------------------------------
      # Display the detection to the user (reference image and camera image side by side, with detection results)
      if DISPLAY_RESULT:
  
          # Draw detected blobs and their id
      
          i = 0
          for keypoint in keypoints[0,:]:
              
             
              
              cv.putText(img, str(i), (int(keypoint[0]), int(keypoint[1])), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 1, cv.LINE_AA)
              cv.circle(img, (int(keypoint[0]), int(keypoint[1])), int(keypoint[2]), (0, 0, 255), 15)
              
  #
      i += 1
               
          # Resize the image, so that it fits your screen
      img = cv.resize(img, (int(img.shape[1] * .75), int(img.shape[0] * .75)))#
  
      cv.imshow(WDW_NAME_RESULTS, img)
      key = cv.waitKey(500)
      if key == 27:
          break  # User pressed ESC, exit
      if cv.getWindowProperty(WDW_NAME_RESULTS, cv.WND_PROP_VISIBLE) &lt; 1:
          break  # User killed the window, exit
  
  #--------------------------------------------------------------------------------------------
  # Movement functions
      r=0
      t=0
      i=0
      #approacharea(200)
      for keypoint in keypoints[0,:]:
      #print(&quot;id:%i  coord=(%0.0f, %0.0f)&quot; % (i, X, Y))
        X= int(keypoint[0])-320
        Y=int(keypoint[1])-240
        r=int(keypoint[2])
        print(&quot;id:%i  coord=(%0.0f, %0.0f)&quot; % (i, X, Y))
      if X!= 0 or Y!=0 :
           r=X*0.1
           t=Y*0.1
           approachcircle(r,t,0) 
          
           
                 
       
  i+=1
  
          
  </code></pre>