Question:
Équilibrage blanc personnalisé avec picamera
eaydin
2014-08-27 22:23:10 UTC
view on stackexchange narkive permalink

J'ai besoin d'une méthode pour régler la balance des blancs de la caméra Raspberry Pi en "l'enseignant". Comme dans les appareils photo reflex numériques, j'aimerais montrer une image blanche à l'appareil photo et dire "OK, c'est blanc, ajustez maintenant votre AWB en conséquence".

Je pense que la première étape consiste à réglez awb_mode sur off , puis capturez des photos en continu en jouant avec awb_gains . Le problème est que je ne sais pas comment décider "OK, ces valeurs vont bien, continuons avec elles."

Quelqu'un a fait une telle chose? J'utilise le module Python picamera btw.

Un répondre:
Dave Jones
2014-09-20 19:22:10 UTC
view on stackexchange narkive permalink

Vous pouvez écrire une petite boucle qui suppose que la caméra est pointée vers quelque chose qui est principalement blanc (par exemple, une feuille de papier), puis itérer sur diverses combinaisons des gains rouge et bleu (probablement des incréments de 0,1 entre, par exemple, 0,5 et 2,5) jusqu'à ce que vous trouviez la combinaison qui produit une image dans laquelle la plupart des pixels sont aussi proches du gris (c'est-à-dire des valeurs égales pour R, V et B) que possible. Ce ne serait probablement pas très rapide (car cela impliquerait de prendre une photo, de modifier les valeurs, de prendre une autre photo, etc.), je vous recommande donc d'utiliser un redimensionnement basse résolution et des captures de port vidéo. Pourtant, cela devrait faire l'affaire.

Ce qui suit est une démo grossière; il règle l'AWB sur quelque chose de ridicule (les deux gains de 0,5; c'est juste pour démontrer la convergence) et permet ensuite 30 tentatives de déplacer chaque gain dans les deux sens de 0,1 pour essayer d'obtenir les couleurs moyennes de la capture résultante pour correspondre au canal vert :

  import picameraimport picamera.arrayimport numpy as npwith picamera.PiCamera () as camera: camera.resolution = (1280, 720) camera.awb_mode = 'off' # Commencez avec des gains ridiculement bas rg, bg = (0.5, 0.5) camera.awb_gains = (rg, bg) avec picamera.array.PiRGBArray (camera, size = (128, 72)) comme sortie: # Autoriser 30 tentatives pour corriger AWB pour i dans la plage ( 30): # Capturez une minuscule image redimensionnée au format RVB et extrayez les # valeurs moyennes R, V et B camera.capture (sortie, format = 'rgb', resize = (128, 72), use_video_port = True) r , g, b = (np.mean (output.array [..., i]) pour i dans la plage (3)) print ('R:% 5.2f, B:% 5.2f = (% 5.2f,% 5.2f,% 5.2f) '% ( rg, bg, r, g, b)) # Ajuster R et B par rapport à G, mais seulement s'ils sont # significativement différents (delta +/- 2) si abs (r - g) > 2: si r > g : rg - = 0,1 sinon: rg + = 0,1
si abs (b - g) > 1: si b > g: bg - = 0,1 sinon: bg + = 0,1 camera.awb_gains = (rg, bg) output.seek (0) output.truncate ()  

Dans mes tests, il se rapproche généralement d'une solution décente en une dizaine d'étapes, puis oscille autour de quelques valeurs. Il y a presque certainement de meilleures façons de faire cela (en commençant par des valeurs plus sensibles, en variant une à la fois, en utilisant des captures YUV à la place, en diminuant les incréments à mesure que les valeurs convergent, en se terminant lorsqu'elles sont acceptablement proches, etc.) mais cela devrait être suffisant pour démontrer le principe.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...