iPhone 上 x 轴压缩的 VNRectangleObservation 角

VNRectangleObservation corners compressed in x-axis on iPhone

我正在通过设备的摄像头捕捉视频,并将其提供给 Vision 框架以执行矩形检测。代码看起来像这样(为简洁起见进行了压缩...与此问题无关的隐藏行):

func captureOutput(_ output: AVCaptureOutput, 
                     didOutput sampleBuffer: 
                     CMSampleBuffer, from connection: AVCaptureConnection) {

    // Get a CIImage from the buffer
    guard let buffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
    let image = CIImage(cvImageBuffer: buffer)

    // Set up corner detector
    let handler = VNImageRequestHandler(ciImage: image, orientation: .up options: [:])
    let request = VNDetectRectanglesRequest()

    // Perform corner detection
    do {
            try handler.perform([request])
            guard let observation = request.results?.first as? VNRectangleObservation else {
                print("error at \(#line)")
                return
            }
            handleCorners(observation)
        } catch {
            print("Error: \(error)")
            return
        }
}

这在 iPad Air 2 上工作得很好,我可以使用 observation 对象中的角来绘制漂亮的叠加层。但是在 iPhone X 上,x 轴的角是 "compressed"。

例如,如果我拍摄一张几乎占据整个屏幕宽度的名片图像,我希望 observation.topLeftx 值接近于零。相反,它接近 0.15。右角也是如此(预期:~1.0,实际:~0.85)。

知道为什么会这样吗? CIImage extent 属性 在两个设备上是相同的。只是Vision的角在x轴上被压缩了。

我在使用 ARKit 实时检测矩形时遇到了一个非常相似的问题。经过一些调查,我看到了这个 answer 并发现: "The problem is that ARKit provides the image buffer (frame.capturedImage) with a camera resolution of 1920 x 1440. The screen of the iPhone X is 375 x 812 points. It seems like ARKit can see more than it can display on the phone screen." 所以我只是使用屏幕比例更正了捕获的图像大小,这个 "solution" 解决了我的问题。