웹캠을 사용하여 조명 상태를 감지하고 화면 밝기를 조정하십시오.


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

이 접근 방식의 두 가지 문제 : 카메라가 어두운 곳에서는 제대로 작동하지 않아서 4-5 사이의 비트를 건너 뛸 수 있기 때문에 적어도 내 웹캠에서는 디스플레이 밝기가 4보다 낮아지지 않습니다. 어쨌든,

사용 방법은 다음과 같습니다.

  1. sudo apt-get install python-opencv
  2. 이 스크립트를 어딘가에 저장하십시오. ~/test.py
  3. 통해 실행 python test.py

평균 밝기 대신 작은 썸네일의 최대 밝기를 얻습니다 (이것은 죽은 픽셀 문제를 피하고 더 빠르게 만듭니다). 그리고 적어도 조명과 카메라의 조합으로 인해 잘 작동합니다!

시도 해봐 (:


1
이것은 매우 간단한 접근 방식입니다. 픽셀의 산술 평균 대신에 이미지의 가중 흑백 히스토그램을 얻는 것은 매우 쉽습니다 (빨간색과 파란색은 같은 밝기를 갖지 않습니다). 또한 최소값, 최대 값을 설정하고 주변 광이 변경되었다는 특정 수준의 신뢰가 있어야 전환 할 수 있습니다. 그러나 언급 한 문제 때문에 귀찮게하지 않았습니다. 이것과 같은 문제가 있습니다.
Stefano Palazzo

1
흠, 그것은 당신이 말하는 것처럼 잘 작동합니다. :)
zpletan

@zpletan은 또 다른 길을 간다; 처음부터 시작했습니다.
Stefano Palazzo

1
이것은 내가 원하는 방식으로 작동하는 것 같습니다. 고맙습니다! (응답 시간이 오래 걸리 서 죄송합니다.)
zpletan

1
더 없습니다 highgui에서 stackoverflow.com/questions/30684661/... . 다른 방법이 있습니까?
Daniyal

2

F.Lux가 이전에했던 것처럼 지리적 위치에 따라 화면 온도를 변경하는 RedShift 프로젝트를 살펴보십시오.

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

우분투 14.04, 우분투 13.10, 우분투 13.04, 우분투 12.10 및 우분투 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=

답변 감사합니다! 이것은 내가 날 다시 찾고 정확히 무엇을,하지만 불행히도 나는 더 이상 우분투를 사용하고 테스트 할 방법이 없어요 (나도 몰라하지만 왜 않을 것 일). 따라서 다른 답변에서 답변 상태를 제거하는 것이 불편하지만 다른 사람들 이이 정보를 유용하게 사용할 수 있기를 바랍니다. 그렇다면 신속하게 맨 위로 투표됩니다. 건배!
zpletan

@zpletan Welcom,이 패키지를 설치할 때에있는 python 스크립트를 실행할 수 있습니다 /opt/wildguppy/wildguppy.py. 따라서 모든 배포판에서이 패키지를 사용할 수 있습니다! 건배!
Daniyal

@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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.