使用网络摄像头感应照明条件并调整屏幕亮度


31

有没有办法让我的网络摄像头感知照明条件并相应地调整屏幕亮度?

Answers:


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

这种方法有两个问题:至少在我的网络摄像头中,显示亮度永远不会低于4,因为在黑暗中摄像头无法很好地工作,并且它可能会在4到5之间跳一点。无论如何,

这是使用方法:

  1. sudo apt-get install python-opencv
  2. 将此脚本保存在某处,例如 ~/test.py
  3. 通过运行 python test.py

我现在得到的不是平均亮度,而是小钉子的最大亮度(这是为了避免像素坏点并使其更快)。至少结合我的灯光和摄像头,它可以很好地工作!

试试看 (:


1
请注意,这是一种非常简单的方法。获得图像的加权黑白直方图而不是像素的算术平均值(红色和蓝色的亮度不相同)非常容易。另外,您可以设置一个最小值,最大值,并仅在确定环境光已改变的一定程度的置信度后才进行切换。但是由于我提到的问题,我没有打扰。它会有与此相同的问题。
Stefano Palazzo

1
嗯,很好,就像您说的那样。:)
zpletan

@zpletan再试一次;我从头开始。
Stefano Palazzo

1
这似乎与我想要的方式有关。谢谢!(并且很抱歉花这么长时间回答。)
zpletan 2011年

1
highguistackoverflow.com/questions/30684661/…中没有任何内容。还有其他办法吗?
Daniyal 2015年

2

看一下RedShift项目,该项目会像F.Lux以前所做的那样根据您的地理位置更改屏幕温度。

http://jonls.dk/redshift/

网站上详细记录了安装和使用说明,根据您的硬件和显示器,RedShift可以带来不错的效果,使您的眼睛像“刷新”的眼睛。


1
我不认为这可以回答问题,也许您应该删除答案,然后对原始问题进行评论。答案应始终直接回答问题。
Stefano Palazzo

您的链接不起作用。
TheXed 2011年

1
听起来这没有考虑您的周围环境?因此,如果我一天中半夜在黑暗的房间里,它什么也不会做?
zpletan 2011年

@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 2015年

@zpletan Welcom,安装此软件包时,可以运行中的python脚本/opt/wildguppy/wildguppy.py。因此,您可以在任何发行版中使用此软件包!干杯!
Daniyal 2015年

@zpletan我也进行了一些更改以计算平均亮度,以防止亮度快速突然变化。github.com/Daniyal-Javani/autobrightness/blob/master/…–
Daniyal



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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.