[2024/12/24更新]

  1. 「相簿單選」重新改寫。
  2. 新版macOS 15的PhotosPicker預設行為與最初不同,必須加上 .photosPickerStyle(.inline),否則無法選擇照片,選擇後也不會自己消失。
  3. 測試環境:Mac mini 2023 (M2), macOS 15.2, Swift Playgrounds 4.5.1

本節正式進入人工智慧的程式設計基礎。

如前面序言所說,本單元主要介紹視覺、聽覺、語言三方面的人工智慧,本節就從「視覺」開始,對應 Apple 原廠框架為 Vision,有些廠商也稱之為電腦視覺(Computer Vision, CV)。

上一節我們學會用字串製作 QR Code 圖片,本節則用電腦視覺來辨識圖片中的 QR Code,同樣寫成一個函式,函式的作用與上一節剛好相反,這次是輸入UIImage圖片、輸出辨識後的字串,不過一張圖片中可能有多個條碼,因此辨識後會得到一個字串陣列[String]:

import Vision

func qrDecode(_ 圖片參數: UIImage) -> [String] { ... }

用來辨識QR Code的主要物件是 VNDetectBarcodesRequest,要從 Vision 框架中取用,所以要記得 import Vision。

Vision 內的物件大多以 VN 開頭來命名,VNDetectBarcodesRequest 可以辨識20多種一維及二維條碼,使用方法大致分為三個步驟:

  1. 先產出一個「工作請求」物件,請求辨識條碼(本節需要辨識三種條碼,包括 QR Code, EAN-13, Code-39,分別寫在symbologies屬性的陣列中):

    let 工作請求 = VNDetectBarcodesRequest()
    工作請求.symbologies = [.qr, .ean13, .code39]
    
  2. 實際處理圖形辨識的工作,是另外一個「處理者」(Handler)物件負責,這個處理者專門辨識 CGImage 格式,因此要先從函式的UIImage參數中取出 CGImage 圖片,再交給處理者:

    if let 影像 = 圖片參數.cgImage {
        let 處理者 = VNImageRequestHandler(cgImage: 影像)
        ...
    }
    
  3. 將「工作請求」送入「處理者」開始進行辨識,處理者可同時處理多個工作請求,因此參數為 [工作請求] 陣列。辨識結果會存回「工作請求.results」中,條碼辨識的結果(原始內容)需轉成 VNBarcodeObservation (條碼觀測)的陣列類型,裡面就是一個個觀測(解碼)得到的字串。

    try 處理者.perform([工作請求])
    if let 處理結果 = 工作請求.results as? [VNBarcodeObservation] {
        ...
    }
    

    注意這裡用了 try 指令,因為進行辨識 perform() 可能會拋出錯誤,若函式裡面不處理的話(要用 do-try-catch 句型),就須將函式宣告加上 throws,將錯誤傳遞到上層呼叫者。