首页 > 解决方案 > 如何处理图像文件以适应 MacOS 上 Vision Framework 的缓冲区尺寸?

问题描述

我正在尝试做一些简单的事情来测试 MacOS 上的 Vision Framework。

我尝试修改本教程中的代码以使用屏幕截图中的单个图像而不是相机源。

https://www.appcoda.com/vision-framework-introduction/

但是,我收到此错误:

错误域 = com.apple.vis 代码 = 3“由于请求的缓冲区尺寸无效,无法创建要处理的图像”

是因为截图图像不符合特定规格吗?我需要预处理文件吗?

如果是这样,我该如何处理它以适应尺寸?

我的测试代码如下。

谢谢!

import Cocoa
import Vision

class ViewController: NSViewController {

    var requests = [VNRequest]()

    func start() {
        let textRequest = VNDetectTextRectanglesRequest(completionHandler: self.detectTextHandler)
        textRequest.reportCharacterBoxes = true
        self.requests = [textRequest]
        let url = URL(fileURLWithPath:NSString(string:"~/Screenshot.png").expandingTildeInPath)
        let imageRequestHandler = VNImageRequestHandler(url:url)

        do {
            try imageRequestHandler.perform(self.requests)
        } catch {
            print(error)
        }
    }

    func detectTextHandler(request: VNRequest, error: Error?) {
        guard let observations = request.results else {
            print("no result")
            return
        }
        let result = observations.map({$0 as? VNTextObservation})
        DispatchQueue.main.async() {
            for region in result {
                guard let rg = region else {
                    continue
                }

                self.highlightWord(box: rg)
                if let boxes = region?.characterBoxes {
                    for characterBox in boxes {
                        self.highlightLetters(box: characterBox)
                    }
                }
            }
        }
    }

    func highlightWord(box: VNTextObservation) {
        guard let boxes = box.characterBoxes else {
            return
        }

        var maxX: CGFloat = 9999.0
        var minX: CGFloat = 0.0
        var maxY: CGFloat = 9999.0
        var minY: CGFloat = 0.0

        for char in boxes {
            if char.bottomLeft.x < maxX {
                maxX = char.bottomLeft.x
            }
            if char.bottomRight.x > minX {
                minX = char.bottomRight.x
            }
            if char.bottomRight.y < maxY {
                maxY = char.bottomRight.y
            }
            if char.topRight.y > minY {
                minY = char.topRight.y
            }
        }
        let xCord = maxX
        let yCord = (1 - minY)
        let width = (minX - maxX)
        let height = (minY - maxY)
        let frame = CGRect(x: xCord, y: yCord, width: width, height: height)
        print("Word: \(frame)")
    }

    func highlightLetters(box: VNRectangleObservation) {
        let xCord = box.topLeft.x
        let yCord = (1 - box.topLeft.y)
        let width = (box.topRight.x - box.bottomLeft.x)
        let height = (box.topLeft.y - box.bottomLeft.y)

        let frame = CGRect(x: xCord, y: yCord, width: width, height: height)
        print("Letter: \(frame)")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        start()
    }

    override var representedObject: Any? {
        didSet {
            // Update the view, if already loaded.
        }
    }

}

标签: swiftmacosvision

解决方案


推荐阅读