Проблема, позволяющая пользователю выбрать изображение ARKit для отслеживания - PullRequest
0 голосов
/ 06 октября 2018

В настоящее время я работаю над приложением ARKit, которое, надеюсь, позволит пользователю выбрать изображение, которое будет отслеживаться в ARImageTrackingSession, из их библиотеки фотографий.В настоящее время приложение предварительно запрограммировано на отслеживание изображения в AR Resources, когда пользователь запускает приложение в первый раз, и это прекрасно работает.Когда я переключаюсь на другой ViewController, позволяю пользователю выбрать изображение из своей библиотеки и, наконец, отправляю изображение для отслеживания, я сталкиваюсь с ошибкой.Когда я отклоняю «выбрать изображение для отслеживания» и пытаюсь сбросить ARSession, он говорит, что он «неожиданно обнаружил ноль при развертывании необязательного значения».

(я думаю) IЯ благополучно развернул все дополнительные функции перед этим шагом, и я использовал точку останова и множество распечаток консоли, просто чтобы убедиться, что ничто не вернет ноль до точки, где я пытаюсь сбросить сеанс.Я даже сравнивал символ за символом, как явно ошибочный сеанс сравнивается с сеансом отслеживания изображений, который успешно вызывается, когда приложение запускается в первый раз, и они кажутся мне очень похожими. Вот так выглядят два объекта сеанса в консоли. Один из верхних элементов успешно запускается при запуске приложения, а другой - нет.

Единственная большая разница междудве инициализации сеанса, о которых я могу думать, это то, что первая использует изображения из папки AR Resources в XCode, а вторая (явно неисправная) использует пользовательское изображение, которое преобразуется из UIImage в ImageData (дляхранить эти данные в UserDefaults), который преобразуется в CGImage для использования в конфигурации ARImageTrackingConfiguration.Вот как я конвертирую изображение и инициализирую ARReferenceImage, прежде чем столкнусь с ошибкой.

 func resetCustomTracking() {
    let customTrackingConfig = ARImageTrackingConfiguration()

    if let imageData = UserDefaults.standard.data(forKey: "customCard") {
        if let uiImage = UIImage(data: imageData) {
            if let ciImage = CIImage(image: uiImage) {
                if let cgImage = convertCIImageToCGImage(inputImage: ciImage) {

                    let trackingImage = ARReferenceImage.init(cgImage, orientation: CGImagePropertyOrientation.up, physicalWidth: 0.0889)
                    trackingImage.name = "customImage"

                    let trackingImages: Set = [trackingImage]

                    customTrackingConfig.trackingImages = trackingImages
                    customTrackingConfig.maximumNumberOfTrackedImages = 1
                    print(customTrackingConfig)

                    session.run(customTrackingConfig, options: [.resetTracking, .removeExistingAnchors])

                }
            }
        }
    }
}

А вот как / когда вызывается resetCustomTracking: Здесь imageView уже содержит изображение, которое я хочу отправитьв ARImageTrackingConfiguration.

 @IBAction func createTapped(_ sender: Any) {

    if imageView.image == UIImage(named: "Touch to submit design") {
        let alertController = UIAlertController(title: "No design submitted", message: "You have to submit a design, silly.", preferredStyle: .alert)
        let action = UIAlertAction(title: "OK", style: .default)
        alertController.addAction(action)
        self.present(alertController, animated: true, completion: nil)
    }
    else {
        if let imageData = imageView.image?.pngData() {
            UserDefaults.standard.set(imageData, forKey: "customCard")
        }
    }

    UserDefaults.standard.set(nameField.text, forKey: "name")
    UserDefaults.standard.set(webField.text, forKey: "personalWeb")
    UserDefaults.standard.set(linkedInField.text, forKey: "linkedIn")
    UserDefaults.standard.set(twitterField.text, forKey: "twitter")
    UserDefaults.standard.set(gitHubField.text, forKey: "gitHub")
    UserDefaults.standard.set(true, forKey: "usesCustomCard")

    self.dismiss(animated: true, completion: nil)

    ViewController().resetCustomTracking()
}

Кто-нибудь когда-либо делал это раньше (то есть позволяет ли пользователь отправить изображение для отслеживания)?Или кто-нибудь может понять, что я могу сделать, чтобы решить проблему?Я буду рад всем небольшим советам, которые я могу получить, поскольку я уже давно смотрю на эту проблему.

...