Em kernels antigos, havia um arquivo de controle de brilho em algum lugar em /proc
, mas acho que era a mesma funcionalidade que /sys
em seu snippet de código. Nesse arquivo /proc
, havia vários níveis de brilho que você poderia usar e, provavelmente, o mesmo está nesse mecanismo. Tente cat /sys/devices/virtual/backlight/acpi_video0/brightness
e verifique se há informações sobre os níveis de brilho que você pode usar.
Se você remover o código inteiro do loop, ele será executado uma vez para que seja possível definir o brilho apenas uma vez por período de meia hora. Há pouca desvantagem nessa solução - se você cobrir a câmera no momento da verificação de brilho, o brilho será alterado e a próxima leitura será após meia hora, para que você fique com a tela completamente escura por meia hora.
Para evitar essa situação, você pode substituir while
loop por for
loop (0 a 5, por exemplo) com 5 segundos de inatividade. Em loop, você só pode verificar o brilho cinco vezes e após o loop você pode calcular o brilho médio e defini-lo.
EDIT: Código com média a partir de 25 segundos:
import opencv
import opencv.highgui
import time
import commands
from time import sleep
def get_image():
image = opencv.highgui.cvQueryFrame(camera)
return opencv.adaptors.Ipl2PIL(image)
camera = opencv.highgui.cvCreateCameraCapture(-1)
x = []
for i in range(5):
image = get_image()
image.thumbnail((32, 24, ))
image = tuple(ord(i) for i in image.tostring())
x.append(int((int((max(image) / 256.0) * 10) + 1) ** 0.5 / 3 * 10))
sleep(5)
sum = 0
for i in x:
sum = sum + i
avg = sum / len(x)
cmd = ("sudo su -c 'echo " + str(avg) + " > /sys/devices/virtual/backlight/acpi_video0/brightness'")
status, output = commands.getstatusoutput(cmd)
assert status is 0
Infelizmente não tenho a opção de alterar a luz de fundo (kernel antigo ou algo faltando no kernel) e não tenho câmera para verificar se está funcionando ...