swift - 如何处理图像文件以适应 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.
}
}
}
解决方案
推荐阅读
- jsdoc - 带有 jsdoc 的模板组件的完整文档,特别是组件描述?
- keras - 具有数值、分类输出的神经网络激活函数
- r - 绘图过滤器不适用于变换
- python - 无法追加到文件
- javascript - 如何将html变量连接到java(不是js)
- android - 在 Firebase 实时数据库的数组中追加项目
- php - 如何阻止自动请求
- javascript - Recaptcha 总是在模态窗口上发布空
- django-rest-framework - Django REST API 测试 - 如何使用调用 API 端点的请求测试实用程序模块?
- javascript - 从 TypeScript 中的 Promise.all 返回正确的类型