Aydınlatma durumunu algılamak ve ekran parlaklığını ayarlamak için web kamerasını kullanın


31

Web kamerasıma aydınlatma koşullarını sağlamanın ve ekran parlaklığını buna göre ayarlamanın bir yolu var mı?

Yanıtlar:


11

Önceki girişimi geliştirdim :

import opencv
import opencv.highgui
import time
import commands


def get_image():
    image = opencv.highgui.cvQueryFrame(camera)
    return opencv.adaptors.Ipl2PIL(image)

camera = opencv.highgui.cvCreateCameraCapture(-1)

while 1:
    image = get_image()
    image.thumbnail((32, 24, ))
    image = tuple(ord(i) for i in image.tostring())
    x = int((int((max(image) / 256.0) * 10) + 1) ** 0.5 / 3 * 10)
    cmd = ("sudo su -c 'echo " + str(x) +
        " > /sys/devices/virtual/backlight/acpi_video0/brightness'")
    status, output = commands.getstatusoutput(cmd)
    assert status is 0

Bu yaklaşımla ilgili iki sorun: En azından web kameramla ekran parlaklığı hiçbir zaman dörtten aşağı düşmüyor, çünkü kamera karanlıkta iyi çalışmıyor ve dört ile beş arasında biraz atlayabilir. Neyse,

Bu nasıl kullanılacağı:

  1. sudo apt-get install python-opencv
  2. Bu betiği bir yere kaydet ~/test.py
  3. Üzerinden çalıştırın python test.py

Ortalama parlaklık yerine, şimdi küçük bir tumbnail'in maksimum parlaklığını elde ediyorum (bu, ölü piksel sorunlarından kaçınmak ve daha hızlı yapmaktır). Ve en azından benim ışık ve kamera kombinasyonumla, oldukça iyi çalışıyor!

Bir şans ver (:


1
Bunun çok basit bir yaklaşım olduğuna dikkat edin. Piksellerin aritmetik ortalaması yerine, görüntünün ağırlıklı siyah beyaz bir histogramını elde etmek çok kolay olurdu (kırmızı ve mavi aynı parlaklığa sahip değildir). Ayrıca, minimum, maksimum bir değer belirleyebilirsiniz ve yalnızca ortam ışığının değiştiğine dair belirli bir güven seviyesinden sonra geçiş yapmasını sağlayabilirsiniz. Ama bahsettiğim konular yüzünden rahatsız etmedim. Bununla aynı sorunları olurdu.
Stefano Palazzo

1
Hmm, dediğin gibi çalışıyor. :)
zpletan

@zpletan başka bir yol ver; Sıfırdan başladım.
Stefano Palazzo

1
Bu istediğim şekilde çalışıyor gibi görünüyor. Teşekkür ederim! (Cevap vermesi çok uzun sürdüğü için özür dilerim.)
zpletan

1
Stackoverflow.com/questions/30684661/… adresindenhighgui gelen yok . Başka bir yolu var mı?
Daniyal

2

F.Lux'un eskiden yaptığı gibi coğrafi konumunuza göre ekran sıcaklığını değiştiren RedShift projesine bir göz atın.

http://jonls.dk/redshift/

Kurulum ve nasıl kullanılacağına ilişkin talimatlar web sitesinde iyi bir şekilde belgelenmiştir ve donanımınıza ve monitörünüze bağlı olarak, RedShift tarafından elde edilen güzel efektle gözlerinizi "tazelenmiş" gibi hissedebilirsiniz.


1
Bunun soruyu yanıtladığını sanmıyorum, belki de cevabınızı silmelisiniz ve bunun yerine asıl soru hakkında yorum yazmalısınız. Cevaplar daima soruyu doğrudan cevaplamalıdır.
Stefano Palazzo

bağlantınız çalışmıyor.
TheXed

1
Çevreyi hesaba katmıyor gibi geliyor mu? Yani, günün ortasında karanlık bir odada olsaydım, hiçbir şey yapmaz mıydı?
zpletan

@zpletan Evet, bu sadece güneşin durumuna göre rengini değiştirir.
Stefano Palazzo

Bu tarafta bağlantı sorunsuz çalışıyor gibi görünüyor. Stefano Palazzo, cevabımı yararlı bulamadıysam özür dilerim. Ancak, cevabı saklarsanız başka birinin daha yararlı bulabileceğini düşünüyorum. Senin seçimin. Silme isteğinde bulunmak için oy kullanabilirsiniz. :) Teşekkür ederim.
Geppettvs D'Constanzo

2

PPA'yı eklemek için terminali açmak için klavyedeki Ctrl+ Alt+ tuşlarına basın T. Açıldığında, aşağıdaki komutu çalıştırın:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Ardından WildGuppy'ı şu şekilde yükleyin:

sudo apt-get update; sudo apt-get install wildguppy

Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 ve Ubuntu 12.04 ile çalışır.

WildGuppy'ın başlangıçta çalışmasını sağlayın:

Config dosyasını düzenlemek için komutu çalıştırın.

sudo gedit ~/.config/autostart/wildguppy-gtk.desktop

İstendiğinde şifrenizi yazın. Yazarken terminalin şifrenizi göstermeyeceğini unutmayın, sadece yazın ve enter tuşuna basın.

Dosya açıldığında, içeriğin altına yapıştırın ve kaydedin.

[Desktop Entry]
Type=Application
Exec=wildguppy-gtk
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=WildGuppy
Name=WildGuppy
Comment[en_US]=
Comment=

Hey, cevap için teşekkürler! Bu benim geri gün arıyordu tam olarak ne olduğunu, ancak ne yazık ki bir daha Ubuntu kullanmak ve test etmek için hiçbir yol yok (bilmiyorum gerçi neden olmaz iş). Bu nedenle, diğer cevabın cevap statüsünü kaldırmakta kendimi rahat hissetmiyorum, ancak başkalarının da bunu yararlı bulacağını ve eğer öyleyse en hızlı şekilde oylanacağını umuyorum. Şerefe!
zpletan

@zpletan Welcom, Bu paketi kurduğunuzda, içinde bulunan python betiğini çalıştırabilirsiniz /opt/wildguppy/wildguppy.py. Böylece bu paketi herhangi bir dağıtımda kullanabilirsiniz! Şerefe!
Daniyal

@zpletan Ayrıca, parlaklıktaki hızlı ve ani değişiklikleri önlemek için ortalama parlaklığı hesaplamak için bazı değişiklikler yapıyorum. github.com/Daniyal-Javani/autobrightness/blob/master/...
Daniyal



0

Bu benim için çalışıyor:

#!/usr/bin/env python3

import subprocess, time


# webcam brightness if webcam doesn’t get any light
blackpoint = 0.05

# webcam brightness if webcam is fully exposed (e.g. sun at noon)
whitepoint = 0.92549

# Path to program that sets screen brightness.  Takes float between 0 and 1 as
# a parameter.  Should be whitelisted for sudo if this script is not run as
# root.  Sample script:
#
# #!/bin/sh
# echo "($1 * 4882) / 1" | bc > /sys/class/backlight/intel_backlight/brightness
brightness_setter = "/home/bronger/bin/set_brightness.sh"

# it doen’t get any darker
minimal_brightness = 0.1

# in seconds
sleeping_time = 20


def get_brightness():
    """Returns webcam brightness as a float between 0 and 1 (boundaries
    included)."""
    fswebcam = subprocess.Popen(["fswebcam", "-q", "--no-banner", "--png", "0", "-"], stdout=subprocess.PIPE)
    convert = subprocess.run(["convert", "png:-", "-colorspace", "gray", "-scale", "10%x10%",
                              "-format", "%[fx:image.maxima]", "info:"],
                             check=True, stdin=fswebcam.stdout, capture_output=True, text=True)
    assert fswebcam.wait() == 0
    brightness = float(convert.stdout)
    brightness = (brightness - blackpoint) / (whitepoint - blackpoint)
    brightness = max(0.0, min(1.0, brightness))
    return brightness


old_brightness = None
while True:
    brightness = get_brightness() ** 2
    brightness = max(minimal_brightness, brightness)
    if old_brightness is None or abs(brightness - old_brightness) > 0.2:
        subprocess.run(["sudo", brightness_setter, str(brightness)], check=True)
        old_brightness = brightness
    time.sleep(sleeping_time)

0

Bunu yapan bir C uygulaması geliştirdim. Bkz. Https://github.com/goglecm/AutoBrightnessCam .

Bu kullanır fswebcamfotoğraf çekmek için, yapılandırılabilir systemdotomatik başlatmak için ve dizüstü bilgisayar (o zaman devreye giriyor) boşaltma olup olmadığını tespit eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.