Можно ли использовать объекты ARReferenceImage, созданные программно из изображений на iOS 11.3.1 - PullRequest
1 голос
/ 19 июня 2020

Недавно я заменил тяжелый OpenCV на собственный ARKit для обнаружения и отслеживания изображений. Изображения, которые я хочу отслеживать, загружаются из веб-службы и хранятся локально. Я создаю из них объекты 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, приложение сразу вылетает со следующей ошибкой:

Assert: /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_))

Возможно ли, что создание динамических c маркеров программно недоступно для версии iOS ниже 12.0, или я что-то делаю не так? К сожалению, мне не удалось найти никакой информации о конкретных версиях c. Любая обратная связь приветствуется. Спасибо.

1 Ответ

0 голосов
/ 26 июня 2020

Итак, через некоторое время мне наконец удалось найти источник проблемы, поэтому я публикую его здесь, поскольку он может быть полезен кому-то еще с той же проблемой.

Ответ: ДА , можно создавать объекты ARReferenceImage программно и использовать их на iOS 11.3.1 для обнаружения изображений.

Моя проблема заключалась в самих исходных изображениях, и похоже, неправильный масштаб CGImage вызывал трещину sh. Скачанные из 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 исходного размера, как и должно быть. Используя эти перерисованные изображения, я избавился от cra sh, но на данный момент это скорее обходной путь, чем правильное решение.

...