{"id":"b73cc425-c6f4-479b-9f91-ab4f7175b953","shortId":"3USQqW","kind":"skill","title":"Vision Framework","tagline":"Swift Ios Skills skill by Dpearson2699","description":"# Vision Framework\n\nDetect text, faces, barcodes, objects, and body poses in images and video using\non-device computer vision. Patterns target iOS 26+ with Swift 6.3,\nbackward-compatible where noted.\n\nSee [references/vision-requests.md](references/vision-requests.md) for complete code patterns and\n[references/visionkit-scanner.md](references/visionkit-scanner.md) for DataScannerViewController integration.\n\n## Contents\n\n- [Two API Generations](#two-api-generations)\n- [Request Pattern (Modern API)](#request-pattern-modern-api)\n- [Text Recognition (OCR)](#text-recognition-ocr)\n- [Face Detection](#face-detection)\n- [Barcode Detection](#barcode-detection)\n- [Document Scanning (iOS 26+)](#document-scanning-ios-26)\n- [Image Segmentation](#image-segmentation)\n- [Object Tracking](#object-tracking)\n- [Other Request Types](#other-request-types)\n- [Core ML Integration](#core-ml-integration)\n- [VisionKit: DataScannerViewController](#visionkit-datascannerviewcontroller)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Two API Generations\n\nVision has two distinct API layers. Prefer the modern API for new code.\n\n| Aspect | Modern (iOS 18+) | Legacy |\n|---|---|---|\n| Pattern | `let result = try await request.perform(on: image)` | `VNImageRequestHandler` + completion handler |\n| Request types | Swift types — structs and classes (`RecognizeTextRequest`, `DetectFaceRectanglesRequest`) | ObjC classes (`VNRecognizeTextRequest`, `VNDetectFaceRectanglesRequest`) |\n| Concurrency | Native async/await | Completion handlers or synchronous `perform` |\n| Observations | Typed return values | Cast `results` from `[Any]` |\n| Availability | iOS 18+ / macOS 15+ | iOS 11+ |\n\nThe modern API uses the `ImageProcessingRequest` protocol. Each request type\nhas a `perform(on:orientation:)` method that accepts `CGImage`, `CIImage`,\n`CVPixelBuffer`, `CMSampleBuffer`, `Data`, or `URL`. Most requests are\nstructs; stateful requests for video tracking (e.g., `TrackObjectRequest`,\n`TrackRectangleRequest`, `DetectTrajectoriesRequest`) are final classes.\n\n## Request Pattern (Modern API)\n\nAll modern Vision requests follow the same pattern: create a request struct,\ncall `perform(on:)`, and handle the typed result.\n\n```swift\nimport Vision\n\nfunc recognizeText(in image: CGImage) async throws -> [String] {\n    var request = RecognizeTextRequest()\n    request.recognitionLevel = .accurate\n    request.recognitionLanguages = [Locale.Language(identifier: \"en-US\")]\n\n    let observations = try await request.perform(on: image)\n    return observations.compactMap { observation in\n        observation.topCandidates(1).first?.string\n    }\n}\n```\n\n### Legacy Pattern (Pre-iOS 18)\n\nUse `VNImageRequestHandler` with completion-based requests when targeting\nolder deployment versions.\n\n```swift\nimport Vision\n\nfunc recognizeTextLegacy(in image: CGImage) throws -> [String] {\n    var recognized: [String] = []\n    let request = VNRecognizeTextRequest { request, error in\n        guard let observations = request.results as? [VNRecognizedTextObservation] else { return }\n        recognized = observations.compactMap { $0.topCandidates(1).first?.string }\n    }\n    request.recognitionLevel = .accurate\n\n    let handler = VNImageRequestHandler(cgImage: image)\n    try handler.perform([request])\n    return recognized\n}\n```\n\n## Text Recognition (OCR)\n\n### Modern: RecognizeTextRequest (iOS 18+)\n\n```swift\nvar request = RecognizeTextRequest()\nrequest.recognitionLevel = .accurate       // .fast for real-time\nrequest.recognitionLanguages = [\n    Locale.Language(identifier: \"en-US\"),\n    Locale.Language(identifier: \"fr-FR\"),\n]\nrequest.usesLanguageCorrection = true\nrequest.customWords = [\"SwiftUI\", \"Xcode\"] // domain-specific terms\n\nlet observations = try await request.perform(on: cgImage)\nfor observation in observations {\n    guard let candidate = observation.topCandidates(1).first else { continue }\n    let text = candidate.string\n    let confidence = candidate.confidence  // 0.0 ... 1.0\n    let bounds = observation.boundingBox   // normalized coordinates\n}\n```\n\n### Legacy: VNRecognizeTextRequest\n\n```swift\nlet request = VNRecognizeTextRequest()\nrequest.recognitionLevel = .accurate\nrequest.recognitionLanguages = [\"en-US\", \"fr-FR\"]\nrequest.usesLanguageCorrection = true\n```\n\n**Key differences:** Modern API uses `Locale.Language` for languages; legacy\nuses string identifiers. Both support `.accurate` (best quality) and `.fast`\n(real-time suitable) recognition levels.\n\n## Face Detection\n\nDetect face rectangles, landmarks (eyes, nose, mouth), and capture quality.\n\n```swift\n// Modern API\nlet faceRequest = DetectFaceRectanglesRequest()\nlet faces = try await faceRequest.perform(on: cgImage)\n\nfor face in faces {\n    let boundingBox = face.boundingBox   // normalized CGRect\n    let roll = face.roll                 // Measurement<UnitAngle>\n    let yaw = face.yaw                  // Measurement<UnitAngle>\n}\n\n// Landmarks (eyes, nose, mouth contours)\nvar landmarkRequest = DetectFaceLandmarksRequest()\nlet landmarkFaces = try await landmarkRequest.perform(on: cgImage)\nfor face in landmarkFaces {\n    let landmarks = face.landmarks\n    let leftEye = landmarks?.leftEye?.normalizedPoints\n    let nose = landmarks?.nose?.normalizedPoints\n}\n```\n\n### Coordinate System\n\nVision uses a normalized coordinate system with origin at the bottom-left.\nConvert to UIKit (top-left origin) before display:\n\n```swift\nfunc convertToUIKit(_ rect: CGRect, imageHeight: CGFloat) -> CGRect {\n    CGRect(\n        x: rect.origin.x,\n        y: imageHeight - rect.origin.y - rect.height,\n        width: rect.width,\n        height: rect.height\n    )\n}\n```\n\n## Barcode Detection\n\nDetect 1D and 2D barcodes including QR codes.\n\n```swift\nvar request = DetectBarcodesRequest()\nrequest.symbologies = [.qr, .ean13, .code128, .pdf417]\n\nlet barcodes = try await request.perform(on: cgImage)\nfor barcode in barcodes {\n    let payload = barcode.payloadString          // decoded content\n    let symbology = barcode.symbology            // .qr, .ean13, etc.\n    let bounds = barcode.boundingBox             // normalized rect\n}\n```\n\nCommon symbologies: `.qr`, `.aztec`, `.pdf417`, `.dataMatrix`, `.ean8`,\n`.ean13`, `.code39`, `.code128`, `.upce`, `.itf14`.\n\n## Document Scanning (iOS 26+)\n\n`RecognizeDocumentsRequest` provides structured document reading with layout\nunderstanding beyond basic OCR. Returns `DocumentObservation` objects with a\nnested `Container` structure for paragraphs, tables, lists, and barcodes.\n\n```swift\nvar request = RecognizeDocumentsRequest()\nlet documents = try await request.perform(on: cgImage)\n\nfor observation in documents {\n    let container = observation.document\n\n    // Full text content\n    let fullText = container.text\n\n    // Structured access to paragraphs\n    for paragraph in container.paragraphs {\n        let paragraphText = paragraph.text\n    }\n\n    // Tables and lists\n    for table in container.tables { /* structured table data */ }\n    for list in container.lists { /* structured list data */ }\n\n    // Embedded barcodes detected within the document\n    for barcode in container.barcodes { /* barcode data */ }\n\n    // Document title if detected\n    if let title = container.title { print(title) }\n}\n```\n\nFor simpler document camera scanning, use VisionKit's\n`VNDocumentCameraViewController` which provides a full-screen camera UI with\nauto-capture, perspective correction, and multi-page scanning.\n\n## Image Segmentation\n\n### Modern: GeneratePersonSegmentationRequest (iOS 18+)\n\n```swift\nvar request = GeneratePersonSegmentationRequest()\nrequest.qualityLevel = .accurate  // .balanced, .fast\n\nlet mask = try await request.perform(on: cgImage)\n// mask is a PersonSegmentationObservation with a pixelBuffer property\nlet maskBuffer = mask.pixelBuffer\n// Apply mask using Core Image: CIFilter.blendWithMask()\n```\n\n### Legacy: VNGeneratePersonSegmentationRequest\n\n```swift\nlet request = VNGeneratePersonSegmentationRequest()\nrequest.qualityLevel = .accurate  // .balanced, .fast\nrequest.outputPixelFormat = kCVPixelFormatType_OneComponent8\n\nlet handler = VNImageRequestHandler(cgImage: cgImage)\ntry handler.perform([request])\n\nguard let mask = request.results?.first?.pixelBuffer else { return }\n// Apply mask using Core Image: CIFilter.blendWithMask()\n```\n\nQuality levels:\n- `.accurate` -- best quality, slowest (~1s), full resolution\n- `.balanced` -- good quality, moderate speed (~100ms), 960x540\n- `.fast` -- lowest quality, fastest (~10ms), 256x144, suitable for real-time\n\n### Instance Segmentation (iOS 18+)\n\nSeparate masks per person for individual effects.\n\n```swift\n// Modern API (iOS 18+)\nlet request = GeneratePersonInstanceMaskRequest()\nlet observation = try await request.perform(on: cgImage)\nlet indices = observation.allInstances\n\nfor index in indices {\n    let mask = try observation.generateMask(forInstances: IndexSet(integer: index))\n    // mask is a CVPixelBuffer with only this person visible\n}\n```\n\n```swift\n// Legacy API (iOS 17+)\nlet request = VNGeneratePersonInstanceMaskRequest()\nlet handler = VNImageRequestHandler(cgImage: cgImage)\ntry handler.perform([request])\n\nguard let result = request.results?.first else { return }\nlet indices = result.allInstances\nfor index in indices {\n    let instanceMask = try result.generateMaskedImage(\n        ofInstances: IndexSet(integer: index),\n        from: handler,\n        croppedToInstancesExtent: false\n    )\n}\n```\n\nSee [references/vision-requests.md](references/vision-requests.md) for mask composition and Core Image filter\nintegration patterns.\n\n## Object Tracking\n\n### Modern: TrackObjectRequest (iOS 18+)\n\n`TrackObjectRequest` is a stateful request that maintains tracking context\nacross frames. Conforms to both `ImageProcessingRequest` and `StatefulRequest`.\n\n```swift\n// Initialize with a detected object's bounding box\nlet initialObservation = DetectedObjectObservation(boundingBox: detectedRect)\nvar request = TrackObjectRequest(observation: initialObservation)\nrequest.trackingLevel = .accurate\n\n// For each video frame:\nlet results = try await request.perform(on: pixelBuffer)\nif let tracked = results.first {\n    let updatedBounds = tracked.boundingBox\n    let confidence = tracked.confidence\n}\n```\n\n### Legacy: VNTrackObjectRequest\n\n```swift\nlet trackRequest = VNTrackObjectRequest(detectedObjectObservation: initialObservation)\ntrackRequest.trackingLevel = .accurate\n\nlet sequenceHandler = VNSequenceRequestHandler()\n// For each frame:\ntry sequenceHandler.perform([trackRequest], on: pixelBuffer)\nif let result = trackRequest.results?.first {\n    let updatedBounds = result.boundingBox\n    trackRequest.inputObservation = result\n}\n```\n\n## Other Request Types\n\nVision provides additional requests covered in [references/vision-requests.md](references/vision-requests.md):\n\n| Request | Purpose |\n|---|---|\n| `ClassifyImageRequest` | Classify scene content (outdoor, food, animal, etc.) |\n| `GenerateAttentionBasedSaliencyImageRequest` | Heat map of where viewers focus attention |\n| `GenerateObjectnessBasedSaliencyImageRequest` | Heat map of object-like regions |\n| `GenerateForegroundInstanceMaskRequest` | Foreground object segmentation (not person-specific) |\n| `DetectRectanglesRequest` | Detect rectangular shapes (documents, cards, screens) |\n| `DetectHorizonRequest` | Detect horizon angle for auto-leveling photos |\n| `DetectHumanBodyPoseRequest` | Detect body joints (shoulders, elbows, knees) |\n| `DetectHumanBodyPose3DRequest` | 3D human body pose estimation |\n| `DetectHumanHandPoseRequest` | Detect hand joints and finger positions |\n| `DetectAnimalBodyPoseRequest` | Detect animal body joint positions |\n| `DetectFaceCaptureQualityRequest` | Face capture quality scoring (0–1) for photo selection |\n| `TrackRectangleRequest` | Track rectangular objects across video frames |\n| `TrackOpticalFlowRequest` | Optical flow between video frames |\n| `DetectTrajectoriesRequest` | Detect object trajectories in video |\n\nAll modern request types above are iOS 18+ / macOS 15+.\n\n## Core ML Integration\n\nRun custom Core ML models through Vision for automatic image preprocessing\n(resizing, normalization, color space conversion).\n\n```swift\n// Modern API (iOS 18+)\nlet model = try MLModel(contentsOf: modelURL)\nlet request = CoreMLRequest(model: .init(model))\nlet results = try await request.perform(on: cgImage)\n\n// Classification model\nif let classification = results.first as? ClassificationObservation {\n    let label = classification.identifier\n    let confidence = classification.confidence\n}\n```\n\n```swift\n// Legacy API\nlet vnModel = try VNCoreMLModel(for: model)\nlet request = VNCoreMLRequest(model: vnModel) { request, error in\n    guard let results = request.results as? [VNClassificationObservation] else { return }\n    let topResult = results.first\n}\nlet handler = VNImageRequestHandler(cgImage: cgImage)\ntry handler.perform([request])\n```\n\nFor model conversion and optimization, see the `coreml` skill.\n\n## VisionKit: DataScannerViewController\n\n`DataScannerViewController` provides a full-screen live camera scanner for text\nand barcodes. See [references/visionkit-scanner.md](references/visionkit-scanner.md) for complete patterns.\n\n### Quick Start\n\n```swift\nimport VisionKit\n\n// Check availability (requires A12+ chip and camera)\nguard DataScannerViewController.isSupported,\n      DataScannerViewController.isAvailable else { return }\n\nlet scanner = DataScannerViewController(\n    recognizedDataTypes: [\n        .text(languages: [\"en\"]),\n        .barcode(symbologies: [.qr, .ean13])\n    ],\n    qualityLevel: .balanced,\n    recognizesMultipleItems: true,\n    isHighFrameRateTrackingEnabled: true,\n    isHighlightingEnabled: true\n)\nscanner.delegate = self\npresent(scanner, animated: true) {\n    try? scanner.startScanning()\n}\n```\n\n### SwiftUI Integration\n\nWrap `DataScannerViewController` in `UIViewControllerRepresentable`. See\n[references/visionkit-scanner.md](references/visionkit-scanner.md) for the full implementation.\n\n## Common Mistakes\n\n**DON'T:** Use the legacy `VNImageRequestHandler` API for new iOS 18+ projects.\n**DO:** Use modern struct-based requests with `perform(on:)` and async/await.\n**Why:** Modern API provides type safety, better Swift concurrency support, and cleaner error handling.\n\n**DON'T:** Forget to convert normalized coordinates before drawing bounding boxes.\n**DO:** Use `VNImageRectForNormalizedRect(_:_:_:)` or manual conversion from bottom-left origin to UIKit top-left origin.\n**Why:** Vision uses normalized coordinates (0...1) with bottom-left origin; UIKit uses points with top-left origin.\n\n**DON'T:** Run Vision requests on the main thread.\n**DO:** Perform requests on a background thread or use async/await from a detached task.\n**Why:** Image analysis is CPU/GPU-intensive and blocks the UI if run on the main actor.\n\n**DON'T:** Use `.accurate` recognition level for real-time camera feeds.\n**DO:** Use `.fast` for live video, `.accurate` for still images or offline processing.\n**Why:** Accurate recognition is too slow for 30fps video; fast recognition trades quality for speed.\n\n**DON'T:** Ignore the `confidence` score on observations.\n**DO:** Filter results by confidence threshold (e.g., > 0.5) appropriate for your use case.\n**Why:** Low-confidence results are often incorrect and degrade user experience.\n\n**DON'T:** Create a new `VNImageRequestHandler` for each frame when tracking objects.\n**DO:** Use `VNSequenceRequestHandler` for video frame sequences.\n**Why:** Sequence handler maintains temporal context for tracking; per-frame handlers lose state.\n\n**DON'T:** Request all barcode symbologies when you only need QR codes.\n**DO:** Specify only the symbologies you need in the request.\n**Why:** Fewer symbologies means faster detection and fewer false positives.\n\n**DON'T:** Assume `DataScannerViewController` is available on all devices.\n**DO:** Check both `isSupported` (hardware) and `isAvailable` (user permissions) before presenting.\n**Why:** Requires A12+ chip; `isAvailable` also checks camera access authorization.\n\n## Review Checklist\n\n- [ ] Uses modern Vision API (iOS 18+) unless targeting older deployments\n- [ ] Vision requests run off the main thread (async/await or background queue)\n- [ ] Normalized coordinates converted before UI display\n- [ ] Confidence threshold applied to filter low-quality observations\n- [ ] Recognition level matches use case (`.fast` for video, `.accurate` for stills)\n- [ ] Language hints set for text recognition when input language is known\n- [ ] Barcode symbologies limited to only those needed\n- [ ] `DataScannerViewController` availability checked before presentation\n- [ ] Camera usage description (`NSCameraUsageDescription`) in Info.plist for VisionKit\n- [ ] Person segmentation quality level appropriate for use case\n- [ ] `VNSequenceRequestHandler` used for video frame tracking (not per-frame handler)\n- [ ] Error handling covers request failures and empty results\n\n## References\n\n- Vision request patterns: [references/vision-requests.md](references/vision-requests.md)\n- VisionKit scanner integration: [references/visionkit-scanner.md](references/visionkit-scanner.md)\n- Apple docs: [Vision](https://sosumi.ai/documentation/vision) |\n  [VisionKit](https://sosumi.ai/documentation/visionkit) |\n  [RecognizeTextRequest](https://sosumi.ai/documentation/vision/recognizetextrequest) |\n  [DataScannerViewController](https://sosumi.ai/documentation/visionkit/datascannerviewcontroller)","tags":["vision","framework","swift","ios","skills","dpearson2699"],"capabilities":["skill","source-dpearson2699","category-swift-ios-skills"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/vision-framework","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under dpearson2699/swift-ios-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T05:40:39.754Z","embedding":null,"createdAt":"2026-04-18T20:34:09.163Z","updatedAt":"2026-04-22T05:40:39.754Z","lastSeenAt":"2026-04-22T05:40:39.754Z","tsv":"'/documentation/vision)':1814 '/documentation/vision/recognizetextrequest)':1822 '/documentation/visionkit)':1818 '/documentation/visionkit/datascannerviewcontroller)':1826 '0':1183,1470 '0.0':434 '0.5':1578 '0.topcandidates':355 '1':305,356,424,1184,1471 '1.0':435 '100ms':878 '10ms':884 '11':205 '15':203,1216 '17':945 '18':157,201,313,377,796,894,906,1000,1214,1240,1409,1698 '1d':605 '1s':870 '256x144':885 '26':32,91,96,663 '2d':607 '30fps':1555 '3d':1160 '6.3':35 '960x540':879 'a12':1348,1683 'accept':223 'access':714,1689 'accur':286,360,383,448,472,802,836,866,1038,1069,1526,1541,1549,1737 'across':1010,1192 'actor':1522 'addit':1096 'also':1686 'analysi':1510 'angl':1146 'anim':1110,1174,1380 'api':56,60,65,70,139,145,150,208,250,461,497,904,943,1238,1276,1405,1425,1696 'appl':1809 'appli':823,858,1722 'appropri':1579,1775 'aspect':154 'assum':1663 'async':279 'async/await':185,1422,1503,1710 'attent':1119 'author':1690 'auto':782,1149 'auto-captur':781 'auto-level':1148 'automat':1228 'avail':199,1346,1666,1759 'await':163,296,412,504,536,624,696,808,913,1046,1256 'aztec':651 'background':1499,1712 'backward':37 'backward-compat':36 'balanc':803,837,873,1369 'barcod':14,83,86,602,608,622,629,631,688,742,748,751,1333,1364,1633,1751 'barcode-detect':85 'barcode.boundingbox':645 'barcode.payloadstring':634 'barcode.symbology':639 'base':319,1416 'basic':673 'best':473,867 'better':1429 'beyond':672 'block':1514 'bodi':17,1154,1162,1175 'bottom':570,1456,1474 'bottom-left':569,1455,1473 'bound':437,644,1025,1446 'boundingbox':513,1030 'box':1026,1447 'call':263 'camera':766,778,1328,1351,1533,1688,1763 'candid':422 'candidate.confidence':433 'candidate.string':430 'captur':493,783,1180 'card':1141 'case':1583,1733,1778 'cast':195 'category-swift-ios-skills' 'cgfloat':587 'cgimag':224,278,333,364,415,507,539,627,699,811,845,846,916,952,953,1259,1305,1306 'cgrect':516,585,588,589 'check':1345,1671,1687,1760 'checklist':132,135,1692 'chip':1349,1684 'cifilter.blendwithmask':828,863 'ciimag':225 'class':176,180,246 'classif':1260,1264 'classifi':1105 'classification.confidence':1273 'classification.identifier':1270 'classificationobserv':1267 'classifyimagerequest':1104 'cleaner':1434 'cmsamplebuff':227 'code':46,153,611,1640 'code128':619,657 'code39':656 'color':1233 'common':126,129,648,1397 'common-mistak':128 'compat':38 'complet':45,168,186,318,1338 'completion-bas':317 'composit':988 'comput':27 'concurr':183,1431 'confid':432,1058,1272,1567,1575,1587,1720 'conform':1012 'contain':681,705 'container.barcodes':750 'container.lists':737 'container.paragraphs':720 'container.tables':730 'container.text':712 'container.title':760 'content':54,636,709,1107 'contentsof':1245 'context':1009,1620 'continu':427 'contour':529 'convers':1235,1312,1453 'convert':572,1441,1716 'converttouikit':583 'coordin':440,557,563,1443,1469,1715 'core':114,118,826,861,990,1217,1222 'core-ml-integr':117 'coreml':1317 'coremlrequest':1249 'correct':785 'cover':1098,1792 'cpu/gpu-intensive':1512 'creat':259,1598 'croppedtoinstancesext':981 'custom':1221 'cvpixelbuff':226,935 'data':228,733,740,752 'datamatrix':653 'datascannerviewcontrol':52,122,125,1320,1321,1359,1387,1664,1758,1823 'datascannerviewcontroller.isavailable':1354 'datascannerviewcontroller.issupported':1353 'decod':635 'degrad':1593 'deploy':324,1702 'descript':1765 'detach':1506 'detect':11,79,82,84,87,484,485,603,604,743,756,1022,1137,1144,1153,1166,1173,1202,1656 'detectanimalbodyposerequest':1172 'detectbarcodesrequest':615 'detectedobjectobserv':1029,1066 'detectedrect':1031 'detectfacecapturequalityrequest':1178 'detectfacelandmarksrequest':532 'detectfacerectanglesrequest':178,500 'detecthorizonrequest':1143 'detecthumanbodypose3drequest':1159 'detecthumanbodyposerequest':1152 'detecthumanhandposerequest':1165 'detectrectanglesrequest':1136 'detecttrajectoriesrequest':243,1201 'devic':26,1669 'differ':459 'display':580,1719 'distinct':144 'doc':1810 'document':88,93,660,667,694,703,746,753,765,1140 'document-scanning-io':92 'documentobserv':676 'domain':406 'domain-specif':405 'dpearson2699':8 'draw':1445 'e.g':240,1577 'ean13':618,641,655,1367 'ean8':654 'effect':901 'elbow':1157 'els':351,426,856,962,1297,1355 'embed':741 'empti':1796 'en':291,393,451,1363 'en-us':290,392,450 'error':343,1289,1435,1790 'estim':1164 'etc':642,1111 'experi':1595 'eye':489,526 'face':13,78,81,483,486,502,509,511,541,1179 'face-detect':80 'face.boundingbox':514 'face.landmarks':546 'face.roll':519 'face.yaw':523 'facerequest':499 'facerequest.perform':505 'failur':1794 'fals':982,1659 'fast':384,476,804,838,880,1537,1557,1734 'faster':1655 'fastest':883 'feed':1534 'fewer':1652,1658 'filter':992,1572,1724 'final':245 'finger':1170 'first':306,357,425,854,961,1085 'flow':1197 'focus':1118 'follow':255 'food':1109 'foreground':1129 'forget':1439 'forinst':928 'fr':398,399,454,455 'fr-fr':397,453 'frame':1011,1042,1075,1194,1200,1604,1613,1625,1783,1788 'framework':2,10 'full':707,776,871,1325,1395 'full-screen':775,1324 'fulltext':711 'func':274,329,582 'generat':57,61,140 'generateattentionbasedsaliencyimagerequest':1112 'generateforegroundinstancemaskrequest':1128 'generateobjectnessbasedsaliencyimagerequest':1120 'generatepersoninstancemaskrequest':909 'generatepersonsegmentationrequest':794,800 'good':874 'guard':345,420,850,957,1291,1352 'hand':1167 'handl':267,1436,1791 'handler':169,187,362,843,950,980,1303,1617,1626,1789 'handler.perform':367,848,955,1308 'hardwar':1674 'heat':1113,1121 'height':600 'hint':1741 'horizon':1145 'human':1161 'identifi':289,391,396,469 'ignor':1565 'imag':20,97,100,166,277,299,332,365,791,827,862,991,1229,1509,1544 'image-segment':99 'imageheight':586,594 'imageprocessingrequest':211,1015 'implement':1396 'import':272,327,1343 'includ':609 'incorrect':1591 'index':921,931,968,978 'indexset':929,976 'indic':918,923,965,970 'individu':900 'info.plist':1768 'init':1251 'initi':1019 'initialobserv':1028,1036,1067 'input':1747 'instanc':891 'instancemask':972 'integ':930,977 'integr':53,116,120,993,1219,1385,1806 'io':4,31,90,95,156,200,204,312,376,662,795,893,905,944,999,1213,1239,1408,1697 'isavail':1676,1685 'ishighframeratetrackingen':1372 'ishighlightingen':1374 'issupport':1673 'itf14':659 'joint':1155,1168,1176 'kcvpixelformattyp':840 'key':458 'knee':1158 'known':1750 'label':1269 'landmark':488,525,545,549,554 'landmarkfac':534,543 'landmarkrequest':531 'landmarkrequest.perform':537 'languag':465,1362,1740,1748 'layer':146 'layout':670 'left':571,577,1457,1463,1475,1483 'leftey':548,550 'legaci':158,308,441,466,829,942,1060,1275,1403 'let':160,293,339,346,361,409,421,428,431,436,444,498,501,512,517,521,533,544,547,552,621,632,637,643,693,704,710,721,758,805,820,832,842,851,907,910,917,924,946,949,958,964,971,1027,1043,1051,1054,1057,1063,1070,1082,1086,1241,1247,1253,1263,1268,1271,1277,1283,1292,1299,1302,1357 'level':482,865,1150,1528,1730,1774 'like':1126 'limit':1753 'list':686,726,735,739 'live':1327,1539 'locale.language':288,390,395,463 'lose':1627 'low':1586,1726 'low-confid':1585 'low-qual':1725 'lowest':881 'maco':202,1215 'main':1492,1521,1708 'maintain':1007,1618 'manual':1452 'map':1114,1122 'mask':806,812,824,852,859,896,925,932,987 'mask.pixelbuffer':822 'maskbuff':821 'match':1731 'mean':1654 'measur':520,524 'method':221 'mistak':127,130,1398 'ml':115,119,1218,1223 'mlmodel':1244 'model':1224,1242,1250,1252,1261,1282,1286,1311 'modelurl':1246 'moder':876 'modern':64,69,149,155,207,249,252,374,460,496,793,903,997,1208,1237,1413,1424,1694 'mouth':491,528 'multi':788 'multi-pag':787 'nativ':184 'need':1638,1647,1757 'nest':680 'new':152,1407,1600 'normal':439,515,562,646,1232,1442,1468,1714 'normalizedpoint':551,556 'nose':490,527,553,555 'note':40 'nscamerausagedescript':1766 'objc':179 'object':15,102,105,677,995,1023,1125,1130,1191,1203,1607 'object-lik':1124 'object-track':104 'observ':191,294,302,347,410,417,419,701,911,1035,1570,1728 'observation.allinstances':919 'observation.boundingbox':438 'observation.document':706 'observation.generatemask':927 'observation.topcandidates':304,423 'observations.compactmap':301,354 'ocr':73,77,373,674 'offlin':1546 'ofinst':975 'often':1590 'older':323,1701 'on-devic':24 'onecomponent8':841 'optic':1196 'optim':1314 'orient':220 'origin':566,578,1458,1464,1476,1484 'other-request-typ':110 'outdoor':1108 'page':789 'paragraph':684,716,718 'paragraph.text':723 'paragraphtext':722 'pattern':29,47,63,68,159,248,258,309,994,1339,1801 'payload':633 'pdf417':620,652 'per':897,1624,1787 'per-fram':1623,1786 'perform':190,218,264,1419,1495 'permiss':1678 'person':898,939,1134,1771 'person-specif':1133 'personsegmentationobserv':815 'perspect':784 'photo':1151,1186 'pixelbuff':818,855,1049,1080 'point':1479 'pose':18,1163 'posit':1171,1177,1660 'pre':311 'pre-io':310 'prefer':147 'preprocess':1230 'present':1378,1680,1762 'print':761 'process':1547 'project':1410 'properti':819 'protocol':212 'provid':665,773,1095,1322,1426 'purpos':1103 'qr':610,617,640,650,1366,1639 'qualiti':474,494,864,868,875,882,1181,1560,1727,1773 'qualitylevel':1368 'queue':1713 'quick':1340 'read':668 'real':387,478,889,1531 'real-tim':386,477,888,1530 'recogn':337,353,370 'recognit':72,76,372,481,1527,1550,1558,1729,1745 'recognizeddatatyp':1360 'recognizedocumentsrequest':664,692 'recognizesmultipleitem':1370 'recognizetext':275 'recognizetextlegaci':330 'recognizetextrequest':177,284,375,381,1819 'rect':584,647 'rect.height':597,601 'rect.origin':591,595 'rect.width':599 'rectangl':487 'rectangular':1138,1190 'refer':136,137,1798 'references/vision-requests.md':42,43,984,985,1100,1101,1802,1803 'references/visionkit-scanner.md':49,50,1335,1336,1391,1392,1807,1808 'region':1127 'request':62,67,108,112,170,214,232,236,247,254,261,283,320,340,342,368,380,445,614,691,799,833,849,908,947,956,1005,1033,1092,1097,1102,1209,1248,1284,1288,1309,1417,1489,1496,1631,1650,1704,1793,1800 'request-pattern-modern-api':66 'request.customwords':402 'request.outputpixelformat':839 'request.perform':164,297,413,625,697,809,914,1047,1257 'request.qualitylevel':801,835 'request.recognitionlanguages':287,389,449 'request.recognitionlevel':285,359,382,447 'request.results':348,853,960,1294 'request.symbologies':616 'request.trackinglevel':1037 'request.useslanguagecorrection':400,456 'requir':1347,1682 'resiz':1231 'resolut':872 'result':161,196,270,959,1044,1083,1090,1254,1293,1573,1588,1797 'result.allinstances':966 'result.boundingbox':1088 'result.generatemaskedimage':974 'results.first':1053,1265,1301 'return':193,300,352,369,675,857,963,1298,1356 'review':131,134,1691 'review-checklist':133 'roll':518 'run':1220,1487,1518,1705 'safeti':1428 'scan':89,94,661,767,790 'scanner':1329,1358,1379,1805 'scanner.delegate':1376 'scanner.startscanning':1383 'scene':1106 'score':1182,1568 'screen':777,1142,1326 'see':41,983,1315,1334,1390 'segment':98,101,792,892,1131,1772 'select':1187 'self':1377 'separ':895 'sequenc':1614,1616 'sequencehandl':1071 'sequencehandler.perform':1077 'set':1742 'shape':1139 'shoulder':1156 'simpler':764 'skill':5,6,1318 'slow':1553 'slowest':869 'sosumi.ai':1813,1817,1821,1825 'sosumi.ai/documentation/vision)':1812 'sosumi.ai/documentation/vision/recognizetextrequest)':1820 'sosumi.ai/documentation/visionkit)':1816 'sosumi.ai/documentation/visionkit/datascannerviewcontroller)':1824 'source-dpearson2699' 'space':1234 'specif':407,1135 'specifi':1642 'speed':877,1562 'start':1341 'state':235,1004,1628 'statefulrequest':1017 'still':1543,1739 'string':281,307,335,338,358,468 'struct':174,234,262,1415 'struct-bas':1414 'structur':666,682,713,731,738 'suitabl':480,886 'support':471,1432 'swift':3,34,172,271,326,378,443,495,581,612,689,797,831,902,941,1018,1062,1236,1274,1342,1430 'swiftui':403,1384 'symbolog':638,649,1365,1634,1645,1653,1752 'synchron':189 'system':558,564 'tabl':685,724,728,732 'target':30,322,1700 'task':1507 'tempor':1619 'term':408 'text':12,71,75,371,429,708,1331,1361,1744 'text-recognition-ocr':74 'thread':1493,1500,1709 'threshold':1576,1721 'throw':280,334 'time':388,479,890,1532 'titl':754,759,762 'top':576,1462,1482 'top-left':575,1461,1481 'topresult':1300 'track':103,106,239,996,1008,1052,1189,1606,1622,1784 'tracked.boundingbox':1056 'tracked.confidence':1059 'trackobjectrequest':241,998,1001,1034 'trackopticalflowrequest':1195 'trackrectanglerequest':242,1188 'trackrequest':1064,1078 'trackrequest.inputobservation':1089 'trackrequest.results':1084 'trackrequest.trackinglevel':1068 'trade':1559 'trajectori':1204 'tri':162,295,366,411,503,535,623,695,807,847,912,926,954,973,1045,1076,1243,1255,1279,1307,1382 'true':401,457,1371,1373,1375,1381 'two':55,59,138,143 'two-api-gener':58 'type':109,113,171,173,192,215,269,1093,1210,1427 'ui':779,1516,1718 'uikit':574,1460,1477 'uiviewcontrollerrepresent':1389 'understand':671 'unless':1699 'upc':658 'updatedbound':1055,1087 'url':230 'us':292,394,452 'usag':1764 'use':23,209,314,462,467,560,768,825,860,1401,1412,1449,1467,1478,1502,1525,1536,1582,1609,1693,1732,1777,1780 'user':1594,1677 'valu':194 'var':282,336,379,530,613,690,798,1032 'version':325 'video':22,238,1041,1193,1199,1206,1540,1556,1612,1736,1782 'viewer':1117 'visibl':940 'vision':1,9,28,141,253,273,328,559,1094,1226,1466,1488,1695,1703,1799,1811 'visionkit':121,124,769,1319,1344,1770,1804,1815 'visionkit-datascannerviewcontrol':123 'vnclassificationobserv':1296 'vncoremlmodel':1280 'vncoremlrequest':1285 'vndetectfacerectanglesrequest':182 'vndocumentcameraviewcontrol':771 'vngeneratepersoninstancemaskrequest':948 'vngeneratepersonsegmentationrequest':830,834 'vnimagerectfornormalizedrect':1450 'vnimagerequesthandl':167,315,363,844,951,1304,1404,1601 'vnmodel':1278,1287 'vnrecognizedtextobserv':350 'vnrecognizetextrequest':181,341,442,446 'vnsequencerequesthandl':1072,1610,1779 'vntrackobjectrequest':1061,1065 'width':598 'within':744 'wrap':1386 'x':590,592 'xcode':404 'y':593,596 'yaw':522","prices":[{"id":"36593773-c127-4a4f-af6a-c4af38c6602c","listingId":"b73cc425-c6f4-479b-9f91-ab4f7175b953","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:34:09.163Z"}],"sources":[{"listingId":"b73cc425-c6f4-479b-9f91-ab4f7175b953","source":"github","sourceId":"dpearson2699/swift-ios-skills/vision-framework","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/vision-framework","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:31.003Z","lastSeenAt":"2026-04-22T00:53:45.951Z"},{"listingId":"b73cc425-c6f4-479b-9f91-ab4f7175b953","source":"skills_sh","sourceId":"dpearson2699/swift-ios-skills/vision-framework","sourceUrl":"https://skills.sh/dpearson2699/swift-ios-skills/vision-framework","isPrimary":true,"firstSeenAt":"2026-04-18T20:34:09.163Z","lastSeenAt":"2026-04-22T05:40:39.754Z"}],"details":{"listingId":"b73cc425-c6f4-479b-9f91-ab4f7175b953","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"vision-framework","source":"skills_sh","category":"swift-ios-skills","skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/vision-framework"},"updatedAt":"2026-04-22T05:40:39.754Z"}}