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