我最近用本机ARKit替换了笨重的OpenCV,以进行图像检测和跟踪。我要跟踪的图像从Web服务下载并存储在本地。我正在ARImageReference
使用以下代码从它们创建对象:
guard
let image = UIImage(contentsOfFile: imageLocalPath),
let cgImage = image.cgImage
else {
return nil
}
return ARReferenceImage(cgImage, orientation: .up, physicalWidth: 0.12)
宽度很小,因为图像也不太大,每个图像大约为180 x 240像素,但是打印的图像可能更大。
由于ARImageTrackingConfiguration
iOS 11不可用,因此根据当前iOS版本配置的会话:
private lazy var configuration: ARConfiguration = {
if #available(iOS 12.0, *),
ARImageTrackingConfiguration.isSupported {
return ARImageTrackingConfiguration()
}
return ARWorldTrackingConfiguration()
}()
if #available(iOS 12.0, *),
let imagesTrackingConfig = configuration as? ARImageTrackingConfiguration {
imagesTrackingConfig.trackingImages = referenceImages
} else if let worldTrackingConfig = configuration as? ARWorldTrackingConfiguration {
worldTrackingConfig.detectionImages = referenceImages
}
session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
即使我使用,上面的代码也适用于iOS 12和13版本ARWorldTrackingConfiguration
。ARKit正确检测到的图像。但是,当我尝试在iOS 11.3.1上运行它时,该应用程序立即崩溃并出现以下错误:
断言:/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppleCV3D/AppleCV3D-1.13.11/library/VIO/OdometryEngine/src/FrameDownsampleNode/FrameDownsampler.cpp,62:std :: abs(static_cast(aspect_1) -static_cast(src_frame.image.width * output_frame_height_))<max_slack(lldb)
是否可能无法以编程方式创建动态标记,但不适用于低于12.0的iOS版本,或者我做错了什么?不幸的是,我找不到有关特定版本的任何信息。任何反馈表示赞赏。谢谢。
因此,经过一段时间后,我终于设法找到了问题的根源,因此将其发布在这里,因为它可能对遇到相同问题的其他人有用。
答案是肯定的,可以以ARReferenceImage
编程方式创建对象,然后在iOS 11.3.1上使用它们进行图像检测。
我的问题在于源图像本身,并且看起来像是缩放比例不当CGImage
导致崩溃。从API映像下载的是180x240。通过检查CGImage
用于创建的的大小,ARReferenceImage
我意识到它们的缩放比例不正确,因此其CGImage
大小与source相同UIImage
。
我决定尝试使用以下方法重新绘制图像:
func getRedrawnCgImage(_ originalImage: UIImage) -> CGImage? {
guard let cgImage = originalImage.cgImage else { return nil }
let size = CGSize(width: cgImage.width, height: cgImage.height)
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
originalImage.draw(in: CGRect(origin: .zero, size: size))
let redrawnImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return redrawnImage?.cgImage
}
结果CGImage
的大小为540x720,因此应使用原始大小的x3比例。通过使用这些重绘的图像,我摆脱了崩溃,但这只是一种解决方法,而不是目前的适当解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句