ใช้เว็บแคมเพื่อรับรู้สภาพแสงและปรับความสว่างของหน้าจอ


31

มีวิธีให้เว็บแคมของฉันรับรู้สภาพแสงและปรับความสว่างของหน้าจอตามนั้นหรือไม่?

คำตอบ:


11

ฉันได้รับการปรับปรุงในความพยายามครั้งก่อนของฉัน:

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

ปัญหาสองประการเกี่ยวกับวิธีการนี้: ความสว่างหน้าจออย่างน้อยกับเว็บแคมของฉันจะไม่ต่ำกว่าสี่เพราะกล้องทำงานได้ไม่ดีในความมืดและอาจข้ามเล็กน้อยระหว่างสี่ถึงห้า อย่างไรก็ตาม,

นี่คือวิธีการใช้งาน:

  1. sudo apt-get install python-opencv
  2. บันทึกสคริปต์นี้ไว้ที่ใดที่หนึ่ง ~/test.py
  3. เรียกใช้ผ่าน python test.py

แทนที่จะเป็นความสว่างเฉลี่ยตอนนี้ฉันได้รับความสว่างสูงสุดของ tumbnail เล็ก ๆ (เพื่อหลีกเลี่ยงปัญหาพิกเซลตายและทำให้มันเร็วขึ้น) และอย่างน้อยเมื่อฉันรวมแสงและกล้องเข้าด้วยกันมันทำงานได้ค่อนข้างดี!

ให้มันลอง (:


1
โปรดทราบว่านี่เป็นวิธีการที่ง่ายมาก มันง่ายมากที่จะได้ฮิสโตแกรมขาวดำถ่วงน้ำหนักของภาพแทนที่จะเป็นค่าเฉลี่ยเลขคณิตของพิกเซล (แดงและน้ำเงินไม่มีความสว่างเท่ากัน) นอกจากนี้คุณสามารถตั้งค่าต่ำสุดสูงสุดและให้สวิตช์เปลี่ยนหลังจากระดับความมั่นใจที่กำหนดว่าแสงรอบข้างเปลี่ยนไป แต่ฉันไม่ได้กังวลเพราะปัญหาที่ฉันพูดถึง มันจะมีปัญหาเช่นเดียวกับอันนี้
Stefano Palazzo

1
อืมมันทำงานได้ดีอย่างที่คุณพูด :)
zpletan

@zpletan ให้อีกแล้ว ฉันเริ่มต้นจากศูนย์
Stefano Palazzo

1
ดูเหมือนว่าจะทำงานเกี่ยวกับวิธีที่ฉันต้องการ ขอขอบคุณ! (และขออภัยที่ใช้เวลานานในการตอบคำถาม)
zpletan

1
ไม่มีhighguiจากstackoverflow.com/questions/30684661/... มีวิธีอื่น ๆ ?
Daniyal

2

ดูที่โครงการ RedShift ซึ่งเปลี่ยนอุณหภูมิหน้าจอตามตำแหน่งทางภูมิศาสตร์ของคุณเมื่อก่อนหน้านี้ F.Lux กำลังทำอยู่

http://jonls.dk/redshift/

คำแนะนำในการติดตั้งและวิธีใช้มีการจัดทำเป็นเอกสารไว้อย่างดีในเว็บไซต์และขึ้นอยู่กับฮาร์ดแวร์และจอภาพของคุณคุณสามารถรู้สึกว่าดวงตาของคุณเหมือน "รีเฟรช" โดยเอฟเฟกต์ที่ดีซึ่ง RedShift ทำได้


1
ฉันไม่คิดว่านี่เป็นคำตอบของคำถามบางทีคุณควรลบคำตอบและแสดงความคิดเห็นกับคำถามเดิมแทน คำตอบควรตอบคำถามเสมอ
Stefano Palazzo

ลิงก์ของคุณใช้งานไม่ได้
TheXed

1
ดูเหมือนว่าจะไม่คำนึงถึงสภาพแวดล้อมของคุณหรือไม่ ดังนั้นถ้าฉันอยู่ในห้องมืดในตอนกลางวันมันจะไม่ทำอะไรเลยเหรอ?
zpletan

@zpletan ใช่อันนี้เปลี่ยนสีได้ตามตำแหน่งของดวงอาทิตย์เท่านั้น
Stefano Palazzo

ลิงค์นี้ดูเหมือนว่าจะทำงานได้โดยไม่มีปัญหา Stefano Palazzo ขออภัยถ้าคุณไม่พบคำตอบที่เป็นประโยชน์ อย่างไรก็ตามฉันคิดว่าคนอื่นอาจพบว่ามีประโยชน์ถ้าคุณเก็บคำตอบไว้ ตัวเลือกของคุณ. คุณสามารถลงคะแนนเพื่อขอลบ :) ขอขอบคุณ.
Geppettvs D'Constanzo

2

ในการเพิ่ม PPA ให้กดCtrl+ Alt+ Tบนแป้นพิมพ์เพื่อเปิดเครื่อง เมื่อเปิดขึ้นให้เรียกใช้คำสั่งด้านล่าง:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

จากนั้นติดตั้ง WildGuppy ผ่าน:

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

ทำงานบน Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 และ Ubuntu 12.04

ทำให้ WildGuppy ทำงานเมื่อเริ่มต้น:

เรียกใช้คำสั่งเพื่อแก้ไขไฟล์กำหนดค่า

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

พิมพ์รหัสผ่านของคุณเมื่อได้รับแจ้ง โปรดทราบว่าเทอร์มินัลจะไม่แสดงรหัสผ่านของคุณเมื่อพิมพ์เพียงพิมพ์ในใจและกด Enter

เมื่อไฟล์เปิดขึ้นให้วางเนื้อหาด้านล่างและบันทึก

[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=

เฮ้ขอบคุณสำหรับคำตอบ! ตรงนี้เป็นสิ่งที่ฉันกำลังมองหาในวันนี้ แต่น่าเสียดายที่ฉันไม่ได้ใช้ Ubuntu อีกต่อไปและไม่มีวิธีทดสอบ (แม้ว่าฉันไม่รู้ว่าทำไมมันไม่ทำงาน) ด้วยเหตุนี้ฉันจึงรู้สึกไม่สะดวกใจที่จะลบสถานะคำตอบในคำตอบอื่น ๆ แต่หวังว่าคนอื่นจะพบว่ามีประโยชน์และมันจะถูกโหวตอย่างรวดเร็วถ้าเป็นเช่นนั้น ไชโย!
zpletan

@zpletan Welcom /opt/wildguppy/wildguppy.pyเมื่อคุณติดตั้งแพคเกจนี้คุณสามารถเรียกใช้สคริปต์หลามอยู่ใน ดังนั้นคุณสามารถใช้แพ็คเกจนี้ได้ใน distro ใด ๆ ! ไชโย!
Daniyal

@zpletan ฉันยังทำการเปลี่ยนแปลงบางอย่างเพื่อคำนวณความสว่างเฉลี่ยเพื่อป้องกันการเปลี่ยนแปลงความสว่างอย่างรวดเร็วและฉับพลัน github.com/Daniyal-Javani/autobrightness/blob/master/…
Daniyal

0

ฉันยังทำเครื่องมือ C สำหรับสิ่งนั้นโดยใช้ OpenCV คุณสามารถค้นหาได้ที่https://launchpad.net/brightness (คุณต้องรวบรวมด้วยตัวคุณเอง) ฉันหวังว่ามันจะช่วยคุณ


ฉันรวบรวมมันมาแล้ว แต่ฉันจะใช้ได้อย่างไร
zpletan


0

สิ่งนี้ใช้ได้กับฉัน:

#!/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

ฉันได้พัฒนาแอพ C ซึ่งทำสิ่งนี้ ดูhttps://github.com/goglecm/AutoBrightnessCam

มันใช้fswebcamในการถ่ายภาพสามารถกำหนดค่าsystemdให้เริ่มโดยอัตโนมัติและตรวจสอบว่าแล็ปท็อปถูกปล่อยออกมาหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.