Sử dụng webcam để cảm nhận điều kiện ánh sáng và điều chỉnh độ sáng màn hình


31

Có cách nào để điều kiện ánh sáng cảm nhận webcam của tôi và điều chỉnh độ sáng màn hình cho phù hợp không?

Câu trả lời:


11

Tôi đã cải thiện nỗ lực trước đây của mình :

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

Hai vấn đề với cách tiếp cận này: Độ sáng màn hình, ít nhất là với webcam của tôi, không bao giờ thấp hơn bốn, vì máy ảnh không hoạt động tốt trong bóng tối và nó có thể bỏ qua một chút từ bốn đến năm. Dù sao,

Đây là cách sử dụng nó:

  1. sudo apt-get install python-opencv
  2. Lưu tập lệnh này ở đâu đó, nói ~/test.py
  3. Chạy nó qua python test.py

Thay vì độ sáng trung bình, giờ đây tôi nhận được độ sáng tối đa của một tumbnail nhỏ (điều này là để tránh các vấn đề về điểm ảnh chết và làm cho nó nhanh hơn). Và ít nhất với sự kết hợp giữa đèn và máy ảnh của tôi, nó hoạt động khá tốt!

Hãy thử một lần (:


1
Lưu ý rằng đây là một cách tiếp cận rất đơn giản. Sẽ rất dễ dàng để có được biểu đồ màu đen và trắng có trọng số của hình ảnh thay vì trung bình số học của các pixel (màu đỏ và màu xanh không có cùng độ sáng). Ngoài ra, bạn có thể đặt mức tối thiểu, tối đa và chỉ chuyển đổi sau một mức độ tin cậy nhất định rằng ánh sáng xung quanh đã thay đổi. Nhưng tôi không bận tâm vì những vấn đề tôi đã đề cập. Nó sẽ có những vấn đề tương tự như cái này.
Stefano Palazzo

1
Hmm, nó hoạt động như bạn nói. :)
zpletan

@zpletan cho nó đi khác; Tôi đã bắt đầu từ đầu.
Stefano Palazzo

1
Điều này dường như làm việc về cách tôi muốn. Cảm ơn bạn! (Và xin lỗi vì mất quá nhiều thời gian để trả lời.)
zpletan

1
Không có highguitừ stackoverflow.com/questions/30684661/ . Còn cách nào khác không?
Daniyal

2

Hãy xem dự án RedShift, dự án thay đổi nhiệt độ màn hình dựa trên vị trí địa lý của bạn như F.Lux trước đây đang làm.

http://jonls.dk/redshift/

Các hướng dẫn về cài đặt và cách sử dụng được ghi lại rõ ràng trên trang web và, tùy thuộc vào phần cứng và màn hình của bạn, bạn có thể cảm thấy đôi mắt của mình như được "làm mới" bởi hiệu ứng đẹp mắt mà RedShift đạt được.


1
Tôi không nghĩ rằng điều này trả lời câu hỏi, có lẽ bạn nên xóa câu trả lời của mình và thay vào đó hãy nhận xét về câu hỏi ban đầu. Câu trả lời phải luôn trực tiếp trả lời câu hỏi.
Stefano Palazzo

liên kết của bạn không hoạt động.
TheXed

1
Có vẻ như điều này không đưa môi trường xung quanh bạn vào tài khoản? Vì vậy, nếu tôi ở trong một căn phòng tối giữa ban ngày, nó sẽ không làm gì cả?
zpletan

@zpletan Vâng, cái này chỉ thay đổi màu sắc, theo vị trí của mặt trời.
Stefano Palazzo

Bên này liên kết dường như làm việc mà không có vấn đề. Stefano Palazzo, xin lỗi nếu bạn không thấy câu trả lời của tôi hữu ích. Tuy nhiên, tôi nghĩ người khác có thể thấy nó hữu ích nếu bạn giữ câu trả lời. Lựa chọn của bạn. Bạn có thể bỏ phiếu để yêu cầu xóa. :) Cảm ơn bạn.
Geppettvs D'Constanzo

2

Để thêm PPA, nhấn Ctrl+ Alt+ Ttrên bàn phím để mở thiết bị đầu cuối. Khi nó mở, chạy lệnh bên dưới:

sudo add-apt-repository ppa:fantasyleague0629/wildguppy

Sau đó cài đặt WildGuppy qua:

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

Hoạt động trên Ubuntu 14.04, Ubuntu 13.10, Ubuntu 13.04, Ubuntu 12.10 và Ubuntu 12.04.

Làm cho WildGuppy chạy khi khởi động:

Chạy lệnh để chỉnh sửa tập tin cấu hình.

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

Nhập mật khẩu của bạn khi được nhắc. Lưu ý rằng thiết bị đầu cuối sẽ không hiển thị mật khẩu của bạn khi gõ, chỉ cần nhập tâm trí và nhấn enter.

Khi tệp mở ra, dán bên dưới nội dung và lưu nó.

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

Này, cảm ơn vì câu trả lời! Đây chính xác là những gì tôi đã tìm kiếm trong ngày, nhưng thật không may, tôi không sử dụng Ubuntu nữa và không có cách nào để kiểm tra (mặc dù tôi không biết tại sao nó không hoạt động). Như vậy, tôi không cảm thấy thoải mái khi xóa trạng thái câu trả lời cho câu trả lời khác, nhưng hy vọng rằng những người khác sẽ thấy điều này hữu ích và nó sẽ nhanh chóng được bình chọn lên đầu nếu có. Chúc mừng!
zpletan

@zpletan Welcom, Khi bạn cài đặt gói này, bạn có thể chạy tập lệnh python nằm trong /opt/wildguppy/wildguppy.py. Vì vậy, bạn có thể sử dụng gói này trong bất kỳ distro! Chúc mừng!
Daniyal

@zpletan Tôi cũng thực hiện một số thay đổi để tính độ sáng trung bình để ngăn thay đổi độ sáng nhanh và đột ngột. github.com/Daniyal-Javani/autobrightness/blob/master/ triệt
Daniyal

0

Tôi cũng đã tạo một công cụ C cho điều đó, bằng cách sử dụng OpenCV. Bạn có thể tìm thấy nó tại https://launchpad.net/brightness (bạn phải tự biên dịch nó). Tôi hy vọng nó sẽ giúp bạn.


Tôi đã biên dịch nó, nhưng làm thế nào để tôi sử dụng nó?
zpletan


0

Điều này làm việc cho tôi:

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

Tôi đã phát triển một ứng dụng C thực hiện điều này. Xem https://github.com/goglecm/AutoBrightnessCam .

Nó sử dụng fswebcamđể chụp ảnh, có thể được cấu hình systemdđể bắt đầu tự động và phát hiện xem máy tính xách tay có đang xả hay không (sau đó nó khởi động).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.