10
votes

Android: Détecter la luminosité (quantité de lumière) dans les environs du téléphone à l'aide de la caméra?

Ce qui suit s'applique au système d'exploitation Android.

J'essaie d'estimer la sombre (ou la lumière) dans la pièce où le téléphone est situé à l'aide de la caméra.

L'idée est que la caméra peut renvoyer un certain niveau de luminosité que je peux utiliser pour déterminer la quantité de lumière dans les environs du téléphone.

Ma question est simple: comment puis-je utiliser la caméra (à l'avant de la caméra arrière) pour obtenir cette quantité de luminosité (la «quantité de lumière»)?

Merci d'avance.


2 commentaires

La plupart (tous?) Les téléphones Android ont deux petits capteurs matériels utilisés pour "la détection du jour". Les commentaires de ces capteurs sont la manière dont votre téléphone contrôle la luminosité de l'écran lorsque vous définissez le paramètre sur la commande automatique. Je me demande si vous pouviez exploiter ces données. Ce serait plusieurs fois plus fiable.


Merci user432209, cela aiderait certainement. J'espère que ce capteur (qu'est-ce que l'on appelle?) Est disponible publiquement, peut-être que quelqu'un peut nous éclairer sur ce sujet.


5 Réponses :


2
votes

Ma réponse peut être trop incomplète pour une réponse, mais j'aime le formatage ici.

En outre, ma réponse n'est pas facétieuse, alors n'arrêtez pas de lire tout de suite.

Bien sûr, d'abord, vous devrez prendre une photo. Ensuite, vous devrez définir la «luminosité». Je n'ai pas l'algorithme de le faire, mais je suppose que quelque chose comme ça a déjà été fait. Peut-être quelque chose comme:

Déterminez les valeurs de pixels lumineuses, qui sont sombres et qui sont entre les deux (et chacune d'elles peut avoir une quantité variable de luminosité). Vous devrez ensuite appliquer cet algorithme à votre photo pour obtenir une valeur de luminosité.

Oui, il s'agit d'une vue très courte (35 000 pieds) du problème, mais cela devrait vous donner quelques idées sur les endroits où commencer.

[modifier]
ici est un lieu de démarrage (la documentation Android pour les capteurs) de
[/ EDIT]


4 commentaires

Merci, cela aide, peut-être que quelqu'un d'autre sera en mesure de se développer sur 1) le capteur de détection de jour de l'inBuild (cela conviendrait mieux à la caméra) 2) votre suggestion d'algorithme. Si le capteur de luminosité d'Inbuild ne peut pas être taraudé, je dois probablement utiliser votre approche.


Je dois croire que l'algorithme existe déjà, mais l'idée m'intriguait, alors j'ai donné un croquis rapide à clou de pouce de la façon dont cela pourrait être fait.


Fine, Downvote - mais donnez une raison pourquoi (surtout depuis que j'ai édité ma réponse à inclure comment accéder au capteur matériel)


Je ne comprends pas pourquoi quelqu'un vous a baissé. Votre réponse et votre mise à jour sont toutes deux utiles. S'il vous plaît upvote, les gens.



1
votes

L'utilisation de la caméra est inutile, car l'appareil photo ajustera le temps d'exposition et l'ouverture à la lumière environnante, de sorte que les images enregistrées auront une luminosité globale très similaire indépendante de la lumière disponible réelle (au moins dans un monde idéal).

L'API Android Offre fonctionnalité dans le sensormanager pour accéder aux capteurs matériels (vous êtes intéressé par le capteur de type type_light). Je ne suis pas sûr de cependant que vous puissiez compter sur l'accès à ces capteurs à travers l'API, bien qu'ils puissent (ou non) être présents.


1 commentaires

Merci pour les informations sur la caméra, je me demande si cela signifie en effet qu'un périphérique sans capteur de lumière ne peut estimer la luminosité de la pièce avec la caméra (comme méthode de secours).



23
votes

Voici comment vous enregistrez un auditeur sur le capteur de lumière: xxx

edit: Merci à @Antimatter pour les mises à jour suggérées.

docs: SensOrvenventListener sensormanager SensAvension capteur


5 commentaires

Génial, ce capteur m'aidera beaucoup. Je ne suis pas sûr des appareils Howmany (en particulier les acteurs des médias d'Archos les moins chers) ont ce capteur mis en œuvre, mais cela fera pour l'instant. Merci.


Vous pouvez utiliser dans le manifeste et les périphériques qui n'ont pas ce capteur ne le trouveraient pas sur le marché . Sinon, il semble que vous puissiez appeler getensensorlist (sensor.type_light); , puis vérifiez si la taille de la liste est supérieure à 0 pour voir si l'appareil dispose du capteur requis par programme.


Je comprends Kcoppock, je pensais à une alternative aux appareils de soutien qui ne le manquent pas. Cependant, c'est quelque chose que je dois me demander à l'avenir car je ne suis pas sûr s'il y a même besoin de cela. Merci encore.


Je reçois une erreur sur lightsensor.registerlistener (écouteur); - la méthode InscriptionListener (sensorevenTener) est indéfinie pour le capteur de type


@Antimatter J'ai mis à jour la réponse avec des changements par vos suggestions. :)



0
votes

Le gros problème à vouloir clouer la luminosité est de comprendre comment HTC le fait dans leur caméra.apk. Parce que l'application Camera Android est horrible pour la surexposition, en particulier pour la DIP.


0 commentaires

6
votes

Si vous vouliez utiliser la caméra, par exemple si les autres capteurs n'étaient pas disponibles, je voudrais

  1. Définissez l'exposition automatique de l'appareil photo sur OFF et définissez la compensation d'exposition à 0
  2. Définir la capture sur la qualité / la taille la plus basse (pourquoi prendre la peine d'être plus)
  3. Faites la fenêtre de prévisualisation aussi petite que possible (peut-être que vous pourriez même la mettre à invisible et toujours obtenir un cadre à analyser, pas sûr)
  4. Obtenez un cadre d'aperçu de l'image, mais ceux-ci sont au format YUV, de sorte que 2,1 et plus tôt auraient besoin d'un traducteur.

    Ensuite, je voudrais calculer l'histogramme pour la luminosité des images et la droite (la plus brillante) à gauche (DIMMEST) jusqu'à ce que vous trouviez la première valeur significative supérieure à N, qui déterminerait la luminosité de votre scène.

    Ayant dit tout cela, je ne le ferais pas car vous auriez besoin de tester de nombreuses situations sur valeur.

    Bien sûr que ce que vous utilisez le cas est, s'il s'agit d'une situation où vous l'utilisez pour ajuster la "luminosité" dans une voiture, la caméra orientée vers l'avant serait effectuée par des phares, etc.

    De toute façon problème intéressant, mais semble être beaucoup de travail pour un si petit gain, en particulier avec la plupart des morceaux de matériel décents ayant ces capteurs


3 commentaires

En ce qui concerne le point 3, dans mon expérience, la fenêtre d'aperçu de la caméra invisible ne fonctionne que si vous utilisez textureview et définissez son windowmanager.layoutparams.alpha sur 0 < / code>.


En ce qui concerne le point 4, si vous utilisez un textureview comme aperçu de la caméra, vous pouvez simplement appeler textureview.getbitmap pour obtenir le cadre actuel dans RVB.


Bien sûr, vous avez besoin d'API 14 (Android 4.0, je pense) à utiliser textureview .