2017-08-28 5 views
1

J'essaie d'ajouter un filtre B & W aux images de caméra d'un ARSCNView, puis de rendre les objets AR colorés par-dessus.Accès fiable et modification des cadres de caméra capturés sous SceneKit

enter image description here

Je suis presque là avec le code suivant ajouté au début de - (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time

CVPixelBufferRef bg=self.sceneView.session.currentFrame.capturedImage; 

if(bg){ 
    char* k1 = CVPixelBufferGetBaseAddressOfPlane(bg, 1); 
    if(k1){ 
     size_t x1 = CVPixelBufferGetWidthOfPlane(bg, 1); 
     size_t y1 = CVPixelBufferGetHeightOfPlane(bg, 1); 
     memset(k1, 128, x1*y1*2); 
    } 
} 

Cela fonctionne très vite sur mobile, mais voici la chose: parfois un cadre de couleur est affichée. J'ai vérifié et mon code de filtrage est exécuté mais je suppose qu'il est trop tard, le pipeline de SceneKit a déjà traité l'entrée de la caméra.

Appeler le code plus tôt aiderait, mais updateAtTime est le premier point auquel on peut ajouter un code image par image personnalisé.

Vous recevez des notifications sur les captures d'écran peuvent aider, mais ressemble à l'ensemble AVCapturesession is unaccessible.

L'exemple métal Arkit montre comment convertir l'image de la caméra RVB et qui est l'endroit où je ferais le filtrage, mais ce shader est caché lors de l'utilisation de SceneKit. J'ai essayé this possible answer mais c'est trop lent.

Alors, comment puis-je surmonter le cadre manque et convertir le flux de la caméra de manière fiable à BW?

+0

Juste une idée que je n'ai pas testée moi-même: Pourriez-vous utiliser un [shaderModifier] (https://developer.apple.com/documentation/scenekit/scnshadable#1654834) pour convertir l'image de fond en noir et blanc en ajoutant un fragment shader? – orangenkopf

+0

@orangenkopf définitivement un moyen d'aller si la méthode CVPixelBuffer ne peut pas être corrigé. A quoi associeriez-vous le shaderModifier? – diviaki

+0

Selon le document ['ARSCNView'] (https://developer.apple.com/documentation/arkit/arscnview) le cadre est défini comme les scènes [' background'] (https://developer.apple.com/ documentation/scenekit/scnscene/1523665-background) qui est une propriété matérielle où vous pouvez attacher un modificateur de shader. Selon les commentaires [ici] (https://stackoverflow.com/questions/45321275/how-to-place-3d-model-using-arkit-ios-11-with-some-custom-background-view-withou/ 45324663 # 45324663) il pourrait ne pas être si facile si – orangenkopf

Répondre

1

est ici la clé de ce problème:

session:didUpdateFrame:

Fournit une image de la caméra nouvellement capturées et des informations AR accompagnant au délégué.

Il suffit donc déplacé la manipulation CVPixelBufferRef, le code de filtrage d'image de

- (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time 

à

- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame 

fait en sorte de mettre self.sceneView.session.delegate = self d'avoir ce délégué a appelé.