最近,我用本机OpenCV替换了一个重型ARKit,用于图像检测和跟踪。我想跟踪从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像素,但是打印出来的可能更大。
会话的配置取决于当前的iOS版本,因为ARImageTrackingConfiguration
不适用于iOS 11:
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::
(static_cast(Aspect_1)- static_cast(src_frame.image.width * output_frame_height_)) < max_slack (lldb)
在12.0以下的iOS版本中,是否有可能以编程方式创建动态标记,或者我是否做错了什么?不幸的是,我未能找到任何有关特定版本的信息。如有任何反馈,将不胜感激。谢谢。
发布于 2020-06-26 02:52:11
所以过了一段时间,我终于找到了一个问题的来源,所以我在这里张贴,因为它可能是有用的其他人有同样的问题。
答案是YES,可以通过编程方式创建ARReferenceImage
对象,并在iOS 11.3.1上使用它们进行图像检测。
我的问题在于源图像本身,而且看起来CGImage
的不适当的比例导致了崩溃。从API映像下载的是180x240。通过检查用于创建CGImage
的ARReferenceImage
的大小,我意识到它们没有正确地缩放,因此CGImage
大小与源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比例尺也是如此。通过使用这些重绘的图像,我摆脱了崩溃,但这是一个解决办法,而不是适当的解决方案。
https://stackoverflow.com/questions/62476059
复制相似问题