繁体   English   中英

iOS 视觉:在实时摄像头预览上绘制检测到的矩形适用于 iPhone,但不适用于 iPad

[英]iOS Vision: Drawing Detected Rectangles on Live Camera Preview Works on iPhone But Not on iPad

我正在使用 iOS Vision 框架通过 iPhone 上的摄像头实时检测矩形,效果很好。 实时预览会在检测到的形状周围显示一个移动的黄色矩形。

但是,当在 iPad 上运行相同的代码时,黄色矩形沿 X 轴精确跟踪,但在 Y 轴上它总是稍微偏离中心并且没有正确缩放。 包含的图像显示两个设备跟踪相同的测试方块以更好地说明。 在这两种情况下,在我捕获图像和 plot 整个相机帧(1920 x 1080)上的矩形后,一切看起来都很好。 只是 iPad 上的实时预览无法正确跟踪。

我相信这个问题是由 iPad 屏幕的纵横比为 4:3 引起的。 iPhone 的全屏预览将其 1920 x 1080 原始帧缩小到 414 x 718,其中 X 和 Y 暗淡按相同的比例缩小(约 2.6)。 但是,iPad 将 1920 x 1080 帧缩小到 810 x 964,这会扭曲图像并导致沿 Y 轴的误差。

一个粗略的解决方案可能是设置一个小于全屏的预览图层大小,并以匹配 1920 x 1080 的 16:9 比例均匀缩小,但我更喜欢使用全屏。 这里有没有人遇到过这个问题并找到了一个可以正确地将矩形观察转换和缩放到 iPad 屏幕上的转换?

示例测试图像和代码片段如下。

iPhone / iPad上检测到的矩形比较

let rect: VNRectangleObservation

//Camera preview (live) image dimensions
let previewWidth = self.previewLayer!.bounds.width
let previewHeight = self.previewLayer!.bounds.height

//Dimensions of raw captured frames from the camera (1920 x 1080)
let frameWidth = self.frame!.width
let frameHeight = self.frame!.height

//Transform to change detected rectangle from Vision framework's coordinate system to SwiftUI
let transform = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -(previewHeight))
let scale = CGAffineTransform.identity.scaledBy(x: previewWidth, y: previewHeight)

//Convert the detected rectangle from normalized [0, 1] coordinates with bottom left origin to SwiftUI top left origin
//and scale the normalized rect to preview window dimensions.
var bounds: CGRect = rect.boundingBox.applying(scale).applying(transform)

//Rest of code draws the bounds CGRect in yellow onto the preview window, as shown in the image.

如果它对其他人有帮助,根据 Mr.SwiftOak 的评论发布的信息,我能够通过将预览层更改为缩放为.resizeAspect 而不是.resizeAspectFill 的组合来解决问题,保留原始比例预览中的框架。 这导致预览不再占据完整的 iPad 屏幕,但更容易准确地叠加。

然后,我将矩形作为 a.overlay 绘制到预览 window,以便绘图坐标相对于图像的原点(左上角)而不是视图本身,其原点位于 (0, 0) 的左上角整个屏幕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM