获取在 VNDetectTextRectanglesRequest 完成处理程序上的 VNImageRequestHandler 中使用的 cvPixelBuffer

Poc*_*chi 5 ios swift swift3 apple-vision

我正在使用以下代码创建我的请求:

let textRequest = VNDetectTextRectanglesRequest(completionHandler: 
self.detectTextHandler)
textRequest.reportCharacterBoxes = true
self.requests = [textRequest]
Run Code Online (Sandbox Code Playgroud)

在我的AVCaptureVideoDataOutputSampleBufferDelegate 中,我正在创建一个 VNImageRequestHandler 并执行它:

let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: CGImagePropertyOrientation(rawValue: 6)!, options: requestOptions)

do {
    try imageRequestHandler.perform(self.requests)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

这为我提供了具有以下签名的处理程序内部的检测结果:

func detectTextHandler(request: VNRequest, error: Error?)
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何获得此请求用于进一步处理的“cvPixelBuffer”?我应该存储它的临时版本吗?

OOP*_*Per 4

我找不到任何可以CVPixelBufferVNRequest.

因此,在 的 闭包中捕获它completionHandler是一种简单的方法:

在方法中AVCaptureVideoDataOutputSampleBufferDelegate

    let pixelBuffer = ...
    let requestOptions: [VNImageOption: Any] = ...

    let textRequest = VNDetectTextRectanglesRequest {request, error in
        //### Capture `pixelBuffer` inside this closure.
        self.detectText(from: pixelBuffer, request: request, error: error)
    }
    textRequest.reportCharacterBoxes = true

    let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: CGImagePropertyOrientation(rawValue: 6)!, options: requestOptions)

    do {
        try imageRequestHandler.perform([textRequest])
    } catch {
        print(error)
    }
Run Code Online (Sandbox Code Playgroud)

并将其用作:

func detectText(from buffer: CVPixelBuffer, request: VNRequest, error: Error?) {
    //### Use `buffer` passed from the closure.
    //...
}
Run Code Online (Sandbox Code Playgroud)