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.topLeft
的 x
值接近于零。相反,它接近 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" 解决了我的问题。
我正在通过设备的摄像头捕捉视频,并将其提供给 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.topLeft
的 x
值接近于零。相反,它接近 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" 解决了我的问题。