Ios Xcode 10/Swift中的visionapi没有';我什么也没发现。我是不是做错了什么?

Ios Xcode 10/Swift中的visionapi没有';我什么也没发现。我是不是做错了什么?,ios,swift,Ios,Swift,我一直在修补这个很长一段时间,因为我是新的斯威夫特,我正在努力。我试图在摄像机的实时反馈中检测一个矩形(最终的目标是检测何时看到填字游戏),但是包含的代码没有检测到任何内容。我正在控制台中查找“矩形检测”字符串,但似乎从未找到该代码。有人知道为什么吗?以下是我的ViewController代码: 非常感谢 @IBOutlet var cameraView: UIView! var rootLayer: CALayer! = nil private lazy var captureSessio

我一直在修补这个很长一段时间,因为我是新的斯威夫特,我正在努力。我试图在摄像机的实时反馈中检测一个矩形(最终的目标是检测何时看到填字游戏),但是包含的代码没有检测到任何内容。我正在控制台中查找“矩形检测”字符串,但似乎从未找到该代码。有人知道为什么吗?以下是我的ViewController代码:

非常感谢

@IBOutlet var cameraView: UIView!

var rootLayer: CALayer! = nil

private lazy var captureSession: AVCaptureSession = {
    let session = AVCaptureSession()
    session.sessionPreset = AVCaptureSession.Preset.photo
    guard let backCamera = AVCaptureDevice.default(for: .video),
        let input = try? AVCaptureDeviceInput(device: backCamera) else {
            return session
    }
    session.addInput(input)
    return session
}()
private lazy var cameraLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)

private let handler = VNSequenceRequestHandler()
fileprivate var lastObservation: VNDetectedObjectObservation?

lazy var highlightView: UIView = {
    let view = UIView()
    view.layer.borderColor = UIColor.red.cgColor
    view.layer.borderWidth = 4
    view.backgroundColor = .clear
    return view
}()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    /*cameraView.layer.addSublayer(cameraLayer)
    cameraView.addSubview(highlightView)*/
    rootLayer = cameraView.layer
    cameraLayer.frame = rootLayer.bounds
    rootLayer.insertSublayer(cameraLayer, at: 0)
    cameraView.addSubview(highlightView)

    let output = AVCaptureVideoDataOutput()
    output.setSampleBufferDelegate(self, queue: DispatchQueue(label: "queue"))
    captureSession.addOutput(output)
    captureSession.startRunning()

}

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer),
        let observation = lastObservation else {
            return
    }
    let request = VNDetectRectanglesRequest(completionHandler: self.handleRectangle)

    do {
        try handler.perform([request], on: pixelBuffer)
    }
    catch {
        print(error)
    }
}

fileprivate func handleRectangle(request: VNRequest, error: Error?) {
    DispatchQueue.main.async {
        guard let newObservation = request.results?.first as? VNDetectedObjectObservation else {
            return
        }
        self.lastObservation = newObservation
        print("Rectangle Detected")
        var transformedRect = newObservation.boundingBox
        transformedRect.origin.y = 1 - transformedRect.origin.y
        let convertedRect = self.cameraLayer.layerRectConverted(fromMetadataOutputRect: transformedRect)
        self.highlightView.frame = convertedRect
    }
  }
}
此属性是可选的,因此以nil开头


每次调用captureOutput didOutput都会检查其是否为nil并退出。所以它永远不会被设定。从您的guard声明中删除
let observation=lastObservation
,这将解决您最初的问题。然后,您可能需要稍微更改逻辑

fileprivate var lastObservation:VNDetectedObjectObservation?
以nil开始,每次调用
captureOutput didOutput
都将检查其是否为nil并退出。所以它永远不会被设定
guard let pixelBuffer=CMSampleBufferGetImageBuffer(sampleBuffer),let observation=lastObservation else{return}
删除guard语句,或者至少删除其中的lastObservation并重试巨大的改进,我现在可以看到它进入代码部分并检测矩形。边界框是错误的,但我看到很多人对此有问题,他们处理不正确,所以我会继续努力。VnDetectTrectAngleRequest是否足以仅在看到填字游戏时触发?谢谢你的帮助。我不确定tbh,我还没有使用Vision API。我会把上面的评论作为答案
fileprivate var lastObservation: VNDetectedObjectObservation?