Pan And Tilt Calibration Script

import cv2
    import time
    from picarx import Picarx
    
    px = Picarx()
    
    # Servo angle limits
    pan_range = range(-40, 41, 2)
    tilt_range = range(-30, 31, 2)
    
    # Use PiCar-X camera
    cap = cv2.VideoCapture(0)
    
    def find_red_center(frame):
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        lower_red = (0, 100, 100)
        upper_red = (10, 255, 255)
        mask = cv2.inRange(hsv, lower_red, upper_red)
        moments = cv2.moments(mask)
        if moments["m00"] != 0:
            cx = int(moments["m10"] / moments["m00"])
            cy = int(moments["m01"] / moments["m00"])
            return (cx, cy)
        return None
    
    frame_center = (320, 240)  # Assuming 640x480 frame size
    best_pan = 0
    best_tilt = 0
    min_error = float('inf')
    
    for pan in pan_range:
        px.set_cam_pan_angle(pan)
        time.sleep(0.2)
        for tilt in tilt_range:
            px.set_cam_tilt_angle(tilt)
            time.sleep(0.2)
    
            ret, frame = cap.read()
            if not ret:
                continue
    
            center = find_red_center(frame)
            if center:
                error = abs(center[0] - frame_center[0]) + abs(center[1] - frame_center[1])
                if error < min_error:
                    min_error = error
                    best_pan = pan
                    best_tilt = tilt
    
    cap.release()
    
    print(f"Best pan: {best_pan}, best tilt: {best_tilt}")
    px.set_cam_pan_angle(best_pan)
    px.set_cam_tilt_angle(best_tilt)