{"library":"pyobjc-framework-vision","title":"PyObjC Vision Framework","description":"pyobjc-framework-vision provides Python wrappers for Apple's Vision framework on macOS. It is part of the PyObjC project, a bidirectional bridge enabling Python scripts to interact with Objective-C libraries, including macOS Cocoa frameworks. The current version is 12.1 and it maintains an active release cadence, typically aligning with macOS SDK updates and Python version support.","language":"python","status":"active","last_verified":"Fri May 15","install":{"commands":["pip install pyobjc-framework-vision"],"cli":null},"imports":["import Vision","from Cocoa import NSURL","from Foundation import NSDictionary"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport Vision\nfrom Foundation import NSURL, NSDictionary\nfrom Cocoa import CIImage # Often found in Quartz, but CIImage is exposed via Cocoa as well for convenience\n\ndef recognize_text_in_image(image_path):\n    if not os.path.exists(image_path):\n        print(f\"Error: Image not found at {image_path}\")\n        return\n\n    # Convert Python path to NSURL\n    input_url = NSURL.fileURLWithPath_(image_path)\n\n    # Create CIImage from the URL\n    input_image = CIImage.imageWithContentsOfURL_(input_url)\n    if input_image is None:\n        print(f\"Error: Could not create CIImage from {image_path}\")\n        return\n\n    # Create a Vision request handler\n    vision_options = NSDictionary.dictionaryWithDictionary_({})\n    vision_handler = Vision.VNImageRequestHandler.alloc().initWithCIImage_options_(\n        input_image, vision_options\n    )\n\n    # Prepare a text recognition request\n    results = []\n    def completion_handler(request, error):\n        if error:\n            print(f\"Vision request error: {error}\")\n        else:\n            for observation in request.results():\n                if isinstance(observation, Vision.VNRecognizedTextObservation):\n                    for text_candidate in observation.topCandidates_(1):\n                        results.append(text_candidate.string())\n\n    text_request = Vision.VNRecognizeTextRequest.alloc().initWithCompletionHandler_(\n        completion_handler\n    )\n    \n    # Perform the request\n    error_ptr = None # PyObjC expects None for output pointers that aren't being used for input\n    success, error = vision_handler.performRequests_error_([text_request], error_ptr)\n\n    if not success:\n        print(f\"Failed to perform Vision request: {error}\")\n    \n    return results\n\n# Example usage:\n# Create a dummy image file for demonstration\n# In a real scenario, replace this with a path to an actual image file.\n# For a real image with text, you might create one using Pillow or similar.\ndummy_image_path = os.environ.get('VISION_TEST_IMAGE_PATH', 'dummy_image_with_text.png')\nif not os.path.exists(dummy_image_path):\n    print(f\"Please set VISION_TEST_IMAGE_PATH or create a file named '{dummy_image_path}' to run this example.\")\n    print(\"Example: create a simple PNG with some text using an image editor.\")\nelse:\n    print(f\"Analyzing image: {dummy_image_path}\")\n    detected_text = recognize_text_in_image(dummy_image_path)\n    if detected_text:\n        print(\"Detected text:\")\n        for text in detected_text:\n            print(f\"- {text}\")\n    else:\n        print(\"No text detected or an error occurred.\")","lang":"python","description":"This quickstart demonstrates how to use `pyobjc-framework-vision` to perform text recognition on an image. It showcases the typical pattern of loading an image, creating a Vision request handler, defining a request, and processing the results. A dummy image path is used for a runnable example; replace it with a path to an actual image for real-world testing.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-15","installed_version":null,"pypi_latest":"12.1","is_stale":null,"summary":{"python_range":"3.10–3.9","success_rate":0,"avg_install_s":null,"avg_import_s":null,"wheel_type":null},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":3,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":3.1,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":3,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":2.6,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyobjc-framework-vision","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":3.5,"import_time_s":null,"mem_mb":null,"disk_size":null}]}}