Apple Vision - можно ли получить положение камеры из статического изображения?

Допустим, у меня есть одна фотография (сделанная камерой iOS), которая содержит известную цель изображения (например, квадратный QR-код размером 5 см x 5 см), лежащую на плоской плоскости. Могу ли я использовать платформу Apple Vision для расчета позы 6dof целевого изображения?

Я не знаком с фреймворком, но мне кажется, что эта проблема похожа на отслеживание целей AR, и поэтому я надеюсь, что где-то там есть решение!

На самом деле я действительно хочу обнаруживать формы в статическом изображении (используя существующее открытое приложение cv, размещенное в облаке) и отображать эти формы в AR с помощью ARKit. Я надеялся, что у меня могут быть одни и те же цели изображения, присутствующие как в статических изображениях, так и в видеопотоке AR.


person Adrian Taylor    schedule 29.06.2020    source источник


Ответы (1)


Получение позиции ARCamera

В ARKit вы можете получить позицию ARCamera через точечную нотацию ARFrame. Каждый ARFrame (из 60 кадров в секунду) содержит матрицу камеры 4x4. Чтобы обновить позицию ARCamera, используйте метод экземпляра renderer(_:didUpdate:for:).

Вот начальный метод, называемый renderer(_:didAdd:for:):

extension ViewController: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, 
                 didAdd node: SCNNode, 
                  for anchor: ARAnchor) {
    
        let frame = sceneView.session.currentFrame
    
        print(frame?.camera.transform.columns.3.x as Any)
        print(frame?.camera.transform.columns.3.y as Any)
        print(frame?.camera.transform.columns.3.z as Any)

        // ...
     }
}


Получение координат привязки и размера изображения

Когда вы используете Vision и ARKit вместе, самый простой способ получить координаты отслеживаемого изображения в ARKit - использовать свойство экземпляра transform для ARImageAnchor, выраженное в матрице SIMD 4x4.

var transform: simd_float4x4 { get }

Эта матрица, кодирующая положение, ориентацию и масштаб привязки относительно мирового координатного пространства сеанса AR, в котором размещается привязка.


Вот как может выглядеть ваш код:

extension ViewController: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, 
                 didAdd node: SCNNode, 
                  for anchor: ARAnchor) {
    
        guard let imageAnchor = anchor as? ARImageAnchor
        else { return }
    
        print(imageAnchor.transform.columns.3.x)
        print(imageAnchor.transform.columns.3.y)
        print(imageAnchor.transform.columns.3.z)

        // ...
     }
}

Если вы хотите узнать, что такое матрица SIMD 4x4, прочтите этот пост.


Также для получения physical size (в метрах) отслеживаемой фотографии используйте это свойство:

// set in Xcode's `AR Resources` Group
imageAnchor.referenceImage.physicalSize        

Чтобы вычислить коэффициент между начальным размером и предполагаемым физическим размером, используйте это свойство:

imageAnchor.estimatedScaleFactor


Обновление координат привязки и размера изображения

Чтобы постоянно обновлять координаты ARImageAnchor и размер изображения, используйте второй метод из ARSCNViewDelegate:

optional func renderer(_ renderer: SCNSceneRenderer, 
                   didUpdate node: SCNNode, 
                       for anchor: ARAnchor)

Для получения ограничивающей рамки (тип CGRect) вашей фотографии в Vision используйте это свойство экземпляра:

VNDetectedObjectObservation().boundingBox
person Andy Fedoroff    schedule 30.06.2020
comment
Спасибо, но могу ли я получить положение отслеживаемого изображения из одной фотографии ?? - person Adrian Taylor; 30.06.2020
comment
Да, ты можешь. Вы можете получить отслеживаемое положение изображения из одной фотографии. - person Andy Fedoroff; 17.11.2020