Как мне обработать файл изображения, чтобы он соответствовал размерам буфера для Vision Framework на MacOS? - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь сделать что-то простое для тестирования Vision Framework на MacOS.

Я пытался изменить код из этого урока, чтобы использовать одно изображение из скриншота вместо канала камеры.

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

Однако я получаю эту ошибку:

Ошибка Domain = com.apple.vis Code = 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.
        }
    }

}
...