【问题标题】:How to calculate exposure time from a maximum and minimum value, every minute based on time of day in python如何根据python中的一天中的时间每分钟从最大值和最小值计算曝光时间
【发布时间】:2021-02-04 03:34:27
【问题描述】:

我想让我的Raspberry Pi camera timelapse boxes 在夜间进行长时间曝光,在白天进行短时间曝光。我已经收集了我所在位置like this (Script here) 的日落和日出列表

它有太阳升起、中午和落下的时间。 (或者值“sun”:never_rises,或者 never_sets 代表我住的极地冬天和极地夏天。)

我的 Picamera 最大曝光时间为 6 秒,即 6000000 微秒,以便在夜间获得可用的图像。白天,我在 4000 微秒左右的曝光时间得到了很好的曝光。

我想制作一个脚本,根据当前时间,每分钟计算从 ma​​x: 6000000 到 min: 4000 的曝光时间。

我在想这样的事情:低于时间,直到日出前 2 小时,天黑,= 最大 曝光。

在从日出到白天的 2 小时内,获取从 ma​​xmin 的值。

分钟持续一天。

然后,在两个小时内从 minma​​x,从日落到外面,天黑了。

但我的数学能力很弱。如何计算两个小时内每分钟从 ma​​xmin 的平稳过渡?

如果每天的日落和升起时间相同,我可以制作一个 Excel 表格来获取可用值,但由于每天日落和升起的时间不同,这会变得很棘手。

可以在here找到用于制作延时摄影的脚本。

【问题讨论】:

  • 曝光的步长是多少? 1 微秒?
  • 我不知道,它是 pi camera v2,还没有找到任何相关信息

标签: python math raspberry-pi


【解决方案1】:

这需要一些时间来运行,因此可能有更好的方法来实现它。它假定曝光时间为 1 微秒步长,因此如果不同,只需修改 np.linspace 行。

我从最大曝光开始,在日出曝光开始线性下降到日出时的最小值前 2 小时。在日落时,它开始线性增加到日落后 2 小时的最大值。如果日落和日出之间的时间少于 4 小时,我决定根据时差调整最大曝光量。使用不同的尺度(即对数或几何)可能会有更好的结果,但这可能更多来自实验而不是编码本身。

就个人而言,我认为时间假设有点偏离,但这更多的是基于一天中的时间进行适当曝光设置的问题,而不是这里提出的问题,并且脚本可以这样调整。

import requests
import datetime
import numpy as np
import pandas as pd
import time
import plotly.graph_objects as go

max = 6000000
min = 4000
change = np.round(np.linspace(min, max, 121))
mins = pd.DataFrame({"time": pd.date_range("1/1/2021", "31/12/2021", freq="T"), "exposure": max})
url = "https://raw.githubusercontent.com/ekstremedia/raspberry-timelapse/master/scripts/solartimes.json"
data = requests.get(url).json()
sunset = None
neversets = False
for i in data:
    if not data[i]["data"]:
        if data[i]["sun"] == "never_sets":
            day = datetime.datetime.strptime(f'2021-{i}', "%Y-%d-%m")
            day_end = day + datetime.timedelta(hours=23, minutes=59)
            mins.loc[(mins["time"] >= day) & (mins["time"] <= day_end), "exposure"] = min
            if not neversets:
                new_max = int((((day-sunset).seconds/120)/120)*max)
                new_change = np.linspace(min, new_max, int(((day-sunset).seconds/120))+1)
                new_change_a = np.round(np.concatenate([new_change[:-1], new_change[::-1]]))
                try:
                    mins.loc[(mins["time"] >= sunset) & (mins["time"] <= day), "exposure"] = new_change_a
                except ValueError:
                    new_change_a = np.round(np.concatenate([new_change, new_change[::-1]]))
                    mins.loc[(mins["time"] >= sunset) & (mins["time"] <= day), "exposure"] = new_change_a
            neversets = True
    else:
        sunrise = datetime.datetime.strptime(f'2021-{i} {data[i]["sunrise"]}', "%Y-%d-%m %H:%M")
        pre_sunrise = sunrise - datetime.timedelta(hours=2)
        if neversets:
            day = datetime.datetime.strptime(f'2021-{i}', "%Y-%d-%m")
            sunrise = datetime.datetime.strptime(f'2021-{i} {data[i]["sunrise"]}', "%Y-%d-%m %H:%M")
            new_max = int((((sunrise-day).seconds/120)/120)*max)
            new_change = np.linspace(min, new_max, int(((sunrise-day).seconds/120))+1)
            new_change_a = np.round(np.concatenate([new_change[:-1], new_change[::-1]]))
            try:
                mins.loc[(mins["time"] >= day) & (mins["time"] <= sunrise), "exposure"] = new_change_a
            except ValueError:
                new_change_a = np.round(np.concatenate([new_change, new_change[::-1]]))
                mins.loc[(mins["time"] >= day) & (mins["time"] <= sunrise), "exposure"] = new_change_a
            sunset = datetime.datetime.strptime(f'2021-{i} {data[i]["sunset"]}', "%Y-%d-%m %H:%M")
            post_sunset = sunset + datetime.timedelta(hours=2)
            mins.loc[(mins["time"] >= sunrise) & (mins["time"] <= sunset), "exposure"] = min
            mins.loc[(mins["time"] >= sunset) & (mins["time"] <= post_sunset), "exposure"] = change
            neversets = False
            continue
        if sunset:
            yest_sunset = sunset
            if sunrise-yest_sunset < datetime.timedelta(hours=4):
                new_max = int((((sunrise-yest_sunset).seconds/120)/120)*max)
                new_change = np.linspace(min, new_max, int(((sunrise-yest_sunset).seconds/120))+1)
                new_change_a = np.round(np.concatenate([new_change[:-1], new_change[::-1]]))
                try:
                    mins.loc[(mins["time"] >= yest_sunset) & (mins["time"] <= sunrise), "exposure"] = new_change_a
                except ValueError:
                    new_change_a = np.round(np.concatenate([new_change, new_change[::-1]]))
                    mins.loc[(mins["time"] >= yest_sunset) & (mins["time"] <= sunrise), "exposure"] = new_change_a
                sunset = datetime.datetime.strptime(f'2021-{i} {data[i]["sunset"]}', "%Y-%d-%m %H:%M")
                post_sunset = sunset + datetime.timedelta(hours=2)
                mins.loc[(mins["time"] >= sunrise) & (mins["time"] <= sunset), "exposure"] = min
                mins.loc[(mins["time"] >= sunset) & (mins["time"] <= post_sunset), "exposure"] = change
                continue

        sunset = datetime.datetime.strptime(f'2021-{i} {data[i]["sunset"]}', "%Y-%d-%m %H:%M")
        post_sunset = sunset + datetime.timedelta(hours=2)
        mins.loc[(mins["time"] >= pre_sunrise) & (mins["time"] <= sunrise), "exposure"] = change[::-1]
        mins.loc[(mins["time"] >= sunrise) & (mins["time"] <= sunset), "exposure"] = min
        mins.loc[(mins["time"] >= sunset) & (mins["time"] <= post_sunset), "exposure"] = change

fig = go.Figure(data=go.Scattergl(x=mins["time"], y=mins["exposure"], mode='lines'))
fig.update_xaxes(rangeslider_visible=True)
fig.show()

current = datetime.datetime.now().replace(second=0, microsecond=0)
print(mins.loc[mins["time"] == current, "exposure"])

这实际上很有趣。我希望它有效。

【讨论】:

  • 当你的脚本第一次加载时,它让我大吃一惊,这真是太棒了。我需要的是运行一个脚本,它返回当前 datetime.now() 的实际值,所以我可以在拍照脚本中使用该值,但我可能可以从你制作的脚本中推导出它,将探索下班后更进一步,非常感谢!
  • 我为此添加了几行。我肯定会建议,如果这还不是你的做法,让图表生成只运行一次 - 甚至从 pi 上运行它,然后只腌制图表或其他东西 - 并在你去的时候从中提取值。
猜你喜欢
  • 2020-12-14
  • 2017-03-22
  • 2021-09-25
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2013-10-03
  • 2016-05-10
相关资源
最近更新 更多