<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Time-Lapse Playback on Toothbrush's Blog</title><link>https://www.tianhao.me/en/tags/time-lapse-playback/</link><description>Recent content in Time-Lapse Playback on Toothbrush's Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>牙刷刷</copyright><lastBuildDate>Sat, 12 Jul 2025 16:19:04 +0800</lastBuildDate><atom:link href="https://www.tianhao.me/en/tags/time-lapse-playback/index.xml" rel="self" type="application/rss+xml"/><item><title>My Smart Assistant 2.0: Giving the "Lazy" Photography System a Panoramic Window</title><link>https://www.tianhao.me/en/posts/rk-camera-capture-webui/</link><pubDate>Sat, 12 Jul 2025 16:19:04 +0800</pubDate><guid>https://www.tianhao.me/en/posts/rk-camera-capture-webui/</guid><description>&lt;img src="https://www.tianhao.me/img/avatar.png" alt="Featured image of post My Smart Assistant 2.0: Giving the "Lazy" Photography System a Panoramic Window" /&gt;&lt;p&gt;It&amp;rsquo;s been a while since I last shared my “lazy” photography system—the one that decides when to snap a photo and when to chill. This little helper has been quietly working for me all this time. But as time went on, a new pain point emerged: while its inner workings were smart, the way I interacted with it remained&amp;hellip; primitive.&lt;/p&gt;&#10;&lt;p&gt;Project code: &lt;a class="link" href="https://github.com/AndroidOL/camera-capture/tree/main/web-ui" target="_blank" rel="noopener"&#10; &gt;https://github.com/AndroidOL/camera-capture/tree/main/web-ui&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="from-command-line-archaeology-to-tap-of-a-finger-a-revolution-in-experience"&gt;From “Command Line Archaeology” to “Tap of a Finger”: A Revolution in Experience&#10;&lt;/h2&gt;&lt;p&gt;In the past, every interaction with the system felt like digital archaeology inside a server:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Want to see yesterday’s shots? Fire up your SSH client, connect to the server, and navigate through a maze of directories with &lt;code&gt;cd&lt;/code&gt; and &lt;code&gt;ls&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Want to tweak sensitivity settings? Use Vim or Nano to edit config files, save, and &lt;code&gt;systemctl restart&lt;/code&gt;—then cross your fingers you didn’t miss a comma.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This was cumbersome and emotionally distant. My smart assistant—its joys, its output—was locked behind the black box of a terminal.&lt;/p&gt;&#10;&lt;p&gt;So I opened a window for it: a wide &lt;strong&gt;panoramic floor-to-ceiling window&lt;/strong&gt; in the form of a &lt;strong&gt;web control console&lt;/strong&gt;, designed for intuitive, elegant interaction—even from the comfort of a couch.&lt;/p&gt;&#10;&lt;p&gt;Now, everything has changed:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Open a browser and enter the local address;&lt;/li&gt;&#10;&lt;li&gt;A beautiful and powerful interface appears;&lt;/li&gt;&#10;&lt;li&gt;The once-silent background photographer now has a vivid “face” and nimble “hands.”&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="its-components"&gt;Its components:&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Eyes&lt;/strong&gt;: A real-time monitor with zero delay.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Hands&lt;/strong&gt;: Clickable button menus for full control.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Brain&lt;/strong&gt;: Complex logic wrapped in an intuitive design.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="four-superpowers-of-the-web-console"&gt;Four Superpowers of the Web Console&#10;&lt;/h2&gt;&lt;h3 id="1-time-drawer-a-tiered-photo-archive"&gt;1. Time Drawer: A Tiered Photo Archive&#10;&lt;/h3&gt;&lt;p&gt;Inspired by real-life “drawers,” navigating photos now feels like opening a set of Russian nesting dolls:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Year/Month&lt;/strong&gt; view: See all months with recordings.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Daily preview&lt;/strong&gt;: Thumbnail grid for each date.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Hourly drawers&lt;/strong&gt;: Tap to reveal 24-hour distributions.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Minute-level access&lt;/strong&gt;: Dig down to individual images.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Browsing becomes light, fun, and ceremonial.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="2-real-time-window-a-watchful-never-blinking-guardian"&gt;2. Real-Time Window: A Watchful, Never-Blinking Guardian&#10;&lt;/h3&gt;&lt;p&gt;Tap “Live Monitor,” and the system enters watch mode:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Heartbeat refresh&lt;/strong&gt;: The frontend fetches a new frame every 2.5 seconds.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Auto-reconnect&lt;/strong&gt;: Camera outages are self-healed.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Night mode&lt;/strong&gt;: Auto-dimming for dark environments—no eye strain.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="3-time-tunnel-your-personal-documentary-generator"&gt;3. Time Tunnel: Your Personal Documentary Generator&#10;&lt;/h3&gt;&lt;p&gt;The “Slideshow” mode is my favorite feature:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Select any date range (e.g., “2025 Cherry Blossom Season”);&lt;/li&gt;&#10;&lt;li&gt;The system stitches together all relevant photos into a dynamic time-lapse.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Highlights:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Slide mode&lt;/strong&gt;: Chronologically ordered playback.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Smooth transitions&lt;/strong&gt;: Fade-in/out between shots.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Timestamp overlay&lt;/strong&gt;: Auto-displayed capture time at the bottom.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;🎞️ I used this to relive the cherry blossom bloom—from bud to fall—utterly moving and magical.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="4-thoughtful-themes-a-smart-and-caring-interface"&gt;4. Thoughtful Themes: A Smart and Caring Interface&#10;&lt;/h3&gt;&lt;p&gt;As a night owl, I added a theme toggle:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Day mode&lt;/strong&gt;: Blue-white for clarity.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Night mode&lt;/strong&gt;: Deep black and crimson for eye comfort.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Auto-memory&lt;/strong&gt;: Remembers your last-used theme.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Like a friend who just gets you.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="dev-diary-humanizing-the-system-one-mishap-at-a-time"&gt;Dev Diary: Humanizing the System, One Mishap at a Time&#10;&lt;/h2&gt;&lt;h3 id="the-midnight-panic"&gt;The Midnight Panic&#10;&lt;/h3&gt;&lt;p&gt;One night while debugging live view, the screen started flashing like crazy!&lt;br&gt;&#10;Turned out I mistakenly set &lt;code&gt;250ms&lt;/code&gt; instead of &lt;code&gt;2500ms&lt;/code&gt;—the camera nearly became a strobe light.&lt;/p&gt;&#10;&lt;h3 id="the-naming-crisis"&gt;The Naming Crisis&#10;&lt;/h3&gt;&lt;p&gt;Initially, I named my API &lt;code&gt;get_image_list&lt;/code&gt;.&lt;br&gt;&#10;A few weeks later, even I had no clue what it did.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="a-new-lens-on-life-when-tech-becomes-daily-ritual"&gt;A New Lens on Life: When Tech Becomes Daily Ritual&#10;&lt;/h2&gt;&lt;p&gt;The web console made this system part of my life:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;☕ &lt;strong&gt;Morning coffee ritual&lt;/strong&gt;: Wake up with the latest time-lapse visuals.&lt;/li&gt;&#10;&lt;li&gt;🌱 &lt;strong&gt;Plant growth journal&lt;/strong&gt;: Weekly recaps via the “Time Tunnel.”&lt;/li&gt;&#10;&lt;li&gt;🖼️ &lt;strong&gt;Family time machine&lt;/strong&gt;: Cast time-lapse memories during gatherings.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="an-invitation-to-makers"&gt;An Invitation to Makers&#10;&lt;/h2&gt;&lt;p&gt;Building this isn’t hard:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ----- Essentials -----&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Hardware: Raspberry Pi / any Linux device + webcam&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Image processing: Python + OpenCV&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Frontend: HTML + JavaScript + CSS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Backend: PHP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Each module is like a LEGO block—ready to be customized, expanded, or swapped.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;The warmth of technology lies in how we use it to illuminate and document life. I hope you too can open your own “window of time” and watch your story unfold.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item></channel></rss>