VNRectangle在iPhone上以x轴压缩的观察角



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

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轴上的角被"压缩"。

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

知道为什么会这样吗?CIImageextent属性在两台设备上是相同的。只是视觉的角被压缩在x轴上。

我在使用 ARKit 实时检测矩形时遇到了非常相似的问题。经过一番调查,我看到了这个答案,并发现:"问题是ARKit提供了图像缓冲区(frame.capturedImage(,相机分辨率为1920 x 1440。iPhone X的屏幕为375 x 812点。似乎ARKit可以看到的比它在手机屏幕上显示的更多。所以我只是使用屏幕比例更正了捕获的图像大小,这个"解决方案"解决了我的问题。

最新更新