Comment obtenir la composante Y de CMSampleBuffer résulte de la AVCaptureSession?
Hé là, je suis en train d'essayer d'accéder à des données brutes à partir de l'iphone appareil photo à l'aide AVCaptureSession. J'ai suivi le guide fourni par Apple (lien ici).
Les données brutes de l'samplebuffer est en format YUV ( Suis-je corriger là sur la vidéo raw image format?? ), comment l'obtenir directement les données pour la composante Y de la des données brutes stockées dans la samplebuffer.
- Les deux Brad Larson et Codo m'a beaucoup aidé sur ce problème. Avec la combinaison de leurs réponses, j'ai enfin pu atteindre mon objectif. Merci beaucoup, Brad Larson et Codo !
Vous devez vous connecter pour publier un commentaire.
Lors de la configuration de la AVCaptureVideoDataOutput qui renvoie les premières images de la caméra, vous pouvez définir le format des images à l'aide du code suivant:
Dans ce cas, un BGRA pixels format est spécifié (j'ai utilisé ça pour faire correspondre un format de couleur pour une texture OpenGL ES). Chaque pixel dans ce format a un octet pour le bleu, le vert, le rouge, et alpha, dans cet ordre. Va avec cela le rend facile de sortir des composants de la couleur, mais vous n'sacrifier un peu de la performance par un besoin de faire la conversion à partir de la caméra natif espace colorimétrique YUV.
Les autres espaces de couleurs sont
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
etkCVPixelFormatType_420YpCbCr8BiPlanarFullRange
sur les périphériques les plus récents etkCVPixelFormatType_422YpCbCr8
sur l'iPhone 3G. LeVideoRange
ouFullRange
suffixe indique simplement si les octets sont retournés entre 16 et 235 pour Y et 16 - 240 pour les UV ou complète de 0 à 255 pour chaque composant.Je crois que l'espace colorimétrique par défaut utilisé par un AVCaptureVideoDataOutput exemple est le YUV 4:2:0 plane palette (à l'exception de l'iPhone 3G, où il est en YUV 4:2:2 interleaved). Cela signifie qu'il existe deux plans de l'image, les données contenues dans l'image vidéo, avec l'axe de l'avion vient en premier. Pour chaque pixel de votre image qui en résulte, il y a un octet pour la valeur de Y à ce pixel.
Vous donneriez à cette matière première en Y de données par la mise en œuvre de quelque chose comme ceci dans votre délégué de rappel:
Vous pouvez ensuite déterminer l'emplacement dans le bloc de données pour chaque coordonnée X, Y sur l'image et tirez l'octet de sortie qui correspond à la composante Y à coordonner.
Apple FindMyiCone échantillon de La WWDC 2010 (accessible avec les vidéos) montre comment traiter les matières premières BGRA des données à partir de chaque image. J'ai également créé un exemple d'application, que vous pouvez télécharger le code pour ici, qui effectue basée sur la couleur de suivi d'objet à l'aide de la vidéo en direct de la la caméra de l'iPhone. Les deux montrent comment traiter les matières premières des données de pixels, mais aucune de ces travaux dans l'espace colorimétrique YUV.
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
sur l'iPhone 4 est un YUV 4:2:0 plane palette.En plus de sa réponse, et de votre propre code, vous voulez envisager la suivante:
Depuis votre image a deux plans distincts, la fonction CVPixelBufferGetBaseAddress ne sera pas de retour l'adresse de base de l'avion, mais plutôt l'adresse de base d'une structure de données supplémentaires. C'est probablement dû à la mise en œuvre actuelle que vous obtenez une adresse assez proche du premier plan, de sorte que vous pouvez voir l'image. Mais c'est la raison pour laquelle il est déplacé et a poubelle en haut à gauche. La bonne façon de recevoir le premier plan est:
Une ligne de l'image peut être plus long que la largeur de l'image (en raison de l'arrondissement). C'est pourquoi il existe des fonctions pour obtenir la largeur et le nombre d'octets par ligne. Vous n'avez pas ce problème pour le moment. Mais cela pourrait changer avec la prochaine version d'iOS. Ainsi, votre code devrait être:
Veuillez également noter que votre code va lamentablement échouer sur un iPhone 3G.
Si vous avez seulement besoin du canal de luminance, je vous déconseillons l'utilisation de BGRA format, car il est livré avec une conversion de frais généraux. Apple suggèrent d'utiliser BGRA si vous êtes en train de faire le rendu de choses, mais vous n'en avez pas besoin pour l'extraction de l'information de luminance. Comme Brad déjà mentionnés, le plus efficace est le format de la caméra natif format YUV.
Cependant, l'extraction de la droite octets dans le tampon d'échantillon est un peu délicat, notamment au sujet de l'iPhone 3G avec entrelacés YUV 422 format. Donc voici mon code, qui fonctionne très bien avec l'iPhone 3G, 3GS, iPod Touch 4 et iPhone 4S.
C'est tout simplement l'aboutissement de tout le monde au travail acharné, au-dessus et sur d'autres threads, converti à swift 3 pour toute personne qui le trouve utile.