VNRecognizedObjectObservation的boundingBox框架不正确

时间:2019-03-13 00:12:12

标签: ios coreml

使用Core ML和Vision在识别的对象周围显示边界框时遇到问题。

水平检测似乎正常工作,但是垂直方向上,盒子太高,越过视频的顶部边缘,并没有一直滑到视频的底部,并且没有跟随相机的正确运动。在这里您可以看到问题:https://imgur.com/Sppww8T

这是初始化视频数据输出的方式:

let videoDataOutput = AVCaptureVideoDataOutput()
videoDataOutput.alwaysDiscardsLateVideoFrames = true
videoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)]
videoDataOutput.setSampleBufferDelegate(self, queue: dataOutputQueue!)
self.videoDataOutput = videoDataOutput
session.addOutput(videoDataOutput)
let c = videoDataOutput.connection(with: .video)
c?.videoOrientation = .portrait

我还尝试了其他视频方向,但没有成功。

执行视觉请求:

let handler = VNImageRequestHandler(cvPixelBuffer: image, options: [:])
try? handler.perform(vnRequests)

最后,一旦请求被处理。 viewRect设置为视频视图的大小:812x375(我知道,视频层本身要短一些,但这不是这里的问题):

let observationRect = VNImageRectForNormalizedRect(observation.boundingBox, Int(viewRect.width), Int(viewRect.height))

我也尝试过做类似的事情(有更多问题):

var observationRect = observation.boundingBox
observationRect.origin.y = 1.0 - observationRect.origin.y
observationRect = videoPreviewLayer.layerRectConverted(fromMetadataOutputRect: observationRect)

我试图尽可能地减少我认为无关的代码。

当边界框不能像预期的那样垂直围绕对象时,我实际上遇到了使用苹果示例代码的类似问题:https://developer.apple.com/documentation/vision/recognizing_objects_in_live_capture也许意味着API存在一些问题?

1 个答案:

答案 0 :(得分:2)

我使用这样的东西:

let width = view.bounds.width
let height = width * 16 / 9
let offsetY = (view.bounds.height - height) / 2
let scale = CGAffineTransform.identity.scaledBy(x: width, y: height)
let transform = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -height - offsetY)
let rect = prediction.boundingBox.applying(scale).applying(transform)

这假定纵向和16:9的纵横比。假定为.imageCropAndScaleOption = .scaleFill

信用:转换代码来自以下仓库:https://github.com/Willjay90/AppleFaceDetection